Pipy:保護 Kubernetes 上的應用程序免受 SQL 注入和 XSS 攻擊

注入攻擊在?OWASP Web 應用 10 大安全風險[1]?排名 2021 年下滑至第 3 位,多年來一直位居前十。SQL 注入 (SQLi) 是一種用于攻擊網站和 Web 應用程序的常見注入技術。沒有將用戶輸入與數據庫命令完全分開的應用程序面臨著將惡意輸入作為 SQL 命令執行的風險。成功的注入攻擊可能導致未經授權訪問敏感數據,例如密碼、信用卡詳細信息和個人用戶信息。SQL 注入攻擊導致最近許多備受矚目的數據泄露事件,導致企業聲譽受損和監管罰款。

常見的解決方法是使用?正則表達式?列表來過濾流量,這在某些情況下有效,但對于一些復雜的輸入或轉義輸入來說不足。我們并不是要抨擊正則表達式,它們很好并且有自己的使用場景,它們只是不適合這種場景。

這篇文章將演示如何使用?Pipy[2]?一種開源可編程代理來加強安全性,方法是為應用程序添加額外的防護層,來避免受到此類攻擊。

在上一篇宣布?Pipy 0.70.0?最新版本的博文中,介紹了 Pipy 添加了對名為?Native Module Interface (NMI)[3]?的擴展的支持,我們將使用 Pipy NMI 開發一個模塊來集成成熟穩定的開源庫?libinject[4],用于在請求流量到達應用程序之前針對 SQLi 和 XSS 攻擊進行掃描。

作為演示,我們將使用一個開源的經典 LAMP 示例?Vulnerable Mama Shop (VMS)[5],該示例是故意具有 SQLi 缺陷。我們首先將通過破解基本應用程序來演示 SQLi 攻擊,然后再通過添加 Pipy 作為 Sidecar 來阻止某些 SQLi 攻擊來加強應用程序的安全性。

先決條件

這篇文章假設有如下訪問權限:

  • ??運行 Kubernetes 集群

  • ??kubectl[6]

演示源代碼在 GitHub 上,可以從?pipy-sqli-demo[7]?倉庫下載。

部署 Kubernetes 集群和 Vulnerable Mama Shop 應用

要在本地運行演示,我們推薦?k3d[8]?一個輕量級包裝器來在 docker 中運行?k3s[9](Rancher Lab 的最小 Kubernetes 發行版)。

$?k3d?cluster?create?my-cluster?-p?8080:30060@server:0

在上面的命令中,我們創建了一個單節點的集群,并將 k3d 容器的 30060 端口映射到本地 8080 端口,這個端口將在本教程的后面步驟中使用。

部署易受攻擊的 Vulnerable Mama Shop 應用

我們將部署一個簡單的在線商店應用程序,該應用程序附帶安裝

  • ??Apache 網絡服務器

  • ??MariaDB

  • ??在 Apache 上運行并連接到 MariaDB 數據庫的 PHP 應用

  1. 1.?創建一個名為?1-app.yaml?的 YAML 文件,其中包含以下內容:

apiVersion:?apps/v1
kind:?Deployment
metadata:name:?vms
spec:selector:matchLabels:app:?vmstemplate:metadata:labels:app:?vmsspec:containers:-?name:?vmsimage:?naqvis/mamashopports:-?containerPort:?80
---
apiVersion:?v1
kind:?Service
metadata:name:?vms
spec:ports:-?port:?80targetPort:?80nodePort:?30060selector:app:?vmstype:?NodePort
  1. 1.?部署應用

$?kubectl?apply?-f?1-app.yaml
  1. 1.?確認 pod 已啟動并運行,狀態為?Running?。可能需要 30-40 秒才能完成啟動,因此在繼續下一步之前有必要再次運行命令以確認所有 pod 都正常運行。

$?kubectl?get?pods??
NAME?READY?STATUS?RESTARTS?AGE??
vms-6658dd4478-hn246?1/1?Running?0?2m12s
  1. 1.?查詢服務

$?kubectl?get?svc?vms??
NAME?TYPE?CLUSTER-IP?EXTERNAL-IP?PORT(S)?AGE??
vms?NodePort?10.43.244.253?<none>?80:30060/TCP?5m43s

還記得一開始我們為 K3d 容器做端口映射:8080=>30060 嗎?細心的用戶可能還會發現,我們為 Vulnerable Mama Shop Web 應用創建了一個 NodePort 服務,節點端口為 30060。

在瀏覽器中訪問 http://localhost:8080 打開應用程序。

1b2a73ef4a765e09f24835694941f683.jpeg

破解應用

Mama Shop 應用非常簡單,只有 3 個頁面。主頁(如上所示)是用戶可以通過下拉框查詢待售商品的頁面、客戶登錄頁面和關于頁面。訪問 3 個頁面,看看每個頁面的作用以及每個頁面如何正常工作。

嘗試提交一個類別,看看應用是如何展示的。下面顯示了飲料類別中的商品列表。

4218e000a2145ee2871dac83d31524ab.jpeg

可能已經注意到,選擇類別并點擊提交不會更改 URL,因此應用正在執行 POST 請求,我們將需要一些工具來攔截或查看網頁產生的請求流量。

通常,使用諸如 Blurp 套件或 OWASP ZAP 之類的代理工具來攔截和修改對應用程序的請求。但為了簡單起見,我們將使用 Firefox 瀏覽器開發者控制臺來查看和修改請求。

返回瀏覽器(本演示中的 Firefox)并通過菜單選項或通過 Mac 上的快捷鍵?Option+Cmd+I?或操作系統上的類似功能打開?Web 開發人員工具。移動到?Tools | Browser Tools | Web Developer Tools?網絡選項卡,然后點擊網頁上的提交按鈕以查看網絡流量。

e7380c1041e39dc22950a9c1762dd172.jpeg

我們可以看到所有請求以及詳細信息,一個網頁向 Web 服務器發送以顯示該頁面。

c4cc136b352d25f2c12fc4e05370e4d9.png

網絡操作窗口顯示,要瀏覽類別中的項目,一個帶有 URL 編碼的?catid?參數的 HTTP POST 請求被發送到?welcome.php。要測試 SQL 注入,通常會修改用戶輸入并發送單引號,例如?'

修改表單參數

我們將通過一個簡單的實驗來確定輸入是否正確轉義:將 catid 更改為 SQL 查詢字符串,看看是否會導致網頁上顯示的語法錯誤。

catid=’?or?1?=?1?;?—

執行上述更改并點擊網絡操作窗口右下角的發送按鈕。

a4dd1adcd544a1feae2352d7d01cef54.png

哇,我們做到了,welcome.php?顯示類別項目的功能存在 SQL 注入漏洞。錯誤消息還告訴我們數據庫是?MariaDB。錯誤告訴還我們?or 1 = 1?附近存在語法問題。進一步,我們可以假設數據庫查詢類似于

SELECT?item_name,?item_category,?item_description?from?items_table?where?item_category?=?‘?or?1?=?1?;?—?;

如果我們將?catid?結尾更改為?“ or 1 = 1 — ;,那應該可以解決引號問題。它應該從數據庫中選擇所有行,這在破解中很有用。

702ddc0a7c66f75a824f2af897b6ee40.png

假定的 SQL 查詢的結構可能是正確的,盡管它不一定是開發人員使用的精確查詢。這對于竊取客戶信息等破壞性攻擊來說已經足夠了。

提取用戶數據

客戶登錄頁面告訴我們該應用包含客戶數據,這可能存儲在某種客戶或用戶表中。

根據目前收集的信息,可以使用?MariaDB?INFORMATION_SCHEMA?和?SQL Union 運算符?來檢索數據庫和表的詳細信息。

將參數更改?catid?為以下以檢索數據庫名稱,該名稱將進一步用于檢索表詳細信息。

catid=1000?union?select?database(),?“A”?,?“B”?from?dual

下面顯示了來自 Vulnerable Mama Shop 的包含數據庫名稱的響應?appdb

37adfa7b42be8b7f9ee33138b501ec65.png

現在我們有了數據庫名稱,我們可以獲取數據庫中的表

catid=1000?union?select?table_name,version,?table_comment?from?information_schema.TABLES?where?table_schema?=?‘appdb’

這樣就得到了所有表名,我們可以假設數據庫中的 users 表包含用戶名和密碼。

083248108403f00baf0257f27bc6b4b3.png

我們需要檢索?users?表的列,并且需要確保使用與從產品表中查詢的相同數量的列?UNION?才能工作。

catid=1000?union?select?table_name,?COLUMN_NAME,?DATA_TYPE?from?information_schema.COLUMNS?where?table_name?=?‘users’
2f0a5bfb77f6ddc8fad06fd8bdeed830.png

現在我們知道?users?表中總共有六列,其中包含可以從?users?表中獲得的?firstnamelastnamenricpassword、email?等詳細信息

我們已經收集了足夠用來轉儲用戶列表的信息。以下輸入可用于轉儲用戶列表及其?firstnamepassword?和?email?地址。

catid=1000?union?select?firstname,?nric,?email?from?users?LIMIT?7,?100

LIMIT?和?offset?的值可以通過觀察正常請求中有多少條目來計算。offset?值可以刪除這些條目。可以設置一個足夠大的?LIMIT?值,以便可以轉儲客戶記錄。

d89815b18f30006c12d7be344e2bc029.png

可以嘗試是否可以使用提取到的憑證信息來登錄。

使用 Pipy Sidecar 阻止某些 SQLi 攻擊

當未經驗證的用戶輸入與 SQL 指令混合時會發生 SQL 注入,因此開發人員應更加注意轉義用戶輸入(例如使用參數化查詢),但作為 Kubernetes 工程師也可以通過防止這種情況來幫助避免 SQL 注入攻擊到達應用。這樣,即使應用易受攻擊,仍然可以阻止攻擊。

有多種方法可以保護應用,但對于這篇文章,我們將重點關注?注入一個 sidecar 容器?來代理所有流量并拒絕任何被檢測為?SQLi?攻擊的請求。

作為演示,我們使用手動注入 sidecar 的方法,但實際上,手動將代理部署為 sidecar 并不是最好的解決方案

部署 Pipy Sidecar

  1. 1.?使用以下內容創建一個名為?2-app-sidecar.yaml?的 YAML 文件,并檢查如下重要部分:

  • ??運行 Pipy 的 sidecar 容器監聽 8000 端口

  • ??Pipy 進程將所有流量轉發到應用

  • ??包含 SQLi 的請求 URI 或 POST 正本會被拒絕

  • ??應用的服務首先將所有流量路由到 Pipy sidecar 容器。

apiVersion:?apps/v1
kind:?Deployment
metadata:name:?vms
spec:selector:matchLabels:app:?vmstemplate:metadata:labels:app:?vmsspec:containers:-?name:?vmsimage:?naqvis/mamashopports:-?containerPort:?80-?name:?pipy?#?<--?sidecarimage:?naqvis/pipy-nmienv:-?name:?PIPY_CONFIG_FILEvalue:?/etc/pipy/nmi/nmi.jsports:-?containerPort:?8000volumeMounts:-?mountPath:?/etc/pipy/nminame:?pipy-pjsvolumes:-?name:?pipy-pjsconfigMap:name:?sidecar
---
apiVersion:?v1
kind:?Service
metadata:name:?vms
spec:ports:-?port:?80targetPort:?8000?#?<--?the?traffic?is?routed?to?the?proxynodePort:?30060selector:app:?vmstype:?NodePort
---
apiVersion:?v1
kind:?ConfigMap
metadata:name:?sidecar
data:nmi.js:?|-pipy({_rejected:?undefined,}).import({__is_sqli:?'lib-inject',__is_xss:?'lib-inject',__sqli_fingerprint:?'lib-inject',}).listen(8000).demuxHTTP().to($=>$.use('/etc/pipy/modules/inject-nmi.so').handleMessage(()?=>?_rejected?=?(__is_sqli?||?__is_xss)).branch(()?=>?_rejected?===?true,?($=>$.handleMessageStart(_?=>console.log(`SQL?Injection?found?with?Fingerprint:?${__sqli_fingerprint}`)).replaceMessage(new?Message({?status:?403?},?'Forbidden'))),()?=>?_rejected?===?false,?($=>$.muxHTTP().to($=>$.connect('localhost:80')))))
  1. 1.?部署應用

$?kubectl?apply?-f?2-app-sidecar.yaml

等待 pod 啟動并準備就緒

$?kubectl?get?pods???
NAME?READY?STATUS?RESTARTS?AGE???
vms-945f6f85c-8v7sb?2/2?Running?0?8m48s

測試 sidecar

返回應用頁面并再次嘗試 SQL 注入來測試 Sidecar 是否正常過濾流量。Pipy sidecar 在請求到達應用程序之前阻止它!

6c00131750df7fe22937060686ac3289.png

Sidecar 通過返回?403 Forbidden?來阻止流量。使用我們之前嘗試過的的 SQLi 來執行更多請求,我們都將得到 403 作為響應。我們可以通過查看 Pipy sidecar 的日志來驗證這一點。

8371dc3c3458847dd2fc0fe9152a083f.png

總結

學習攻擊性技術的目的是使開發人員、防御者和安全專業人員能夠保護關鍵信息資產和服務的機密性、完整性和可用性。

默認情況下,Kubernetes 并不安全。這篇文章使用了 Vulnerable Mama Shop 作為示例應用,這是一個基于 LAMP 技術的簡單應用程序,用于演示 SQL 注入攻擊以及如何使用 Sidecar 等技術來防御它們。

但隨著應用程序和架構復雜性的增加,可能需要對服務進行更細粒度的控制。如果組織需要零信任并且需要像 mTLS 這樣的端到端加密,應該考慮像?osm-edge[10]?這樣的服務網格,它是一種輕量級、超快速、低資源、高度可擴展的服務網格接口 (SMI) 兼容,專為邊緣和云計算服務網格而構建。當在服務之間進行通信(東西向流量)時,服務網格允許控制該級別的流量。

引用鏈接

[1]?OWASP Web 應用 10 大安全風險:?https://owasp.org/www-project-top-ten/
[2]?Pipy:?https://flomesh.io/
[3]?Native Module Interface (NMI):?https://flomesh.io/docs/en/reference/pjs/3-nmi
[4]?libinject:?https://github.com/libinjection/libinjection
[5]?Vulnerable Mama Shop (VMS):?https://hub.docker.com/r/naqvis/mamashop
[6]?kubectl:?https://kubernetes.io/docs/tasks/tools/
[7]?pipy-sqli-demo:?https://github.com/flomesh-io/pipy-demos/tree/main/pipy-sqli-demo
[8]?k3d:?https://k3d.io/
[9]?k3s:?https://github.com/rancher/k3s
[10]?osm-edge:?https://flomesh.io/

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/280874.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/280874.shtml
英文地址,請注明出處:http://en.pswp.cn/news/280874.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

docker 開啟命令\退出容器

開啟 docker load -i test.tar docker imagesdocker run -it -p 8000:80 test //8000為訪問ip 的端口 80 為test設置的端口 docker rename 原容器名 新容器名訪問IP 為 localhost:8000 退出容器 如果要正常退出不關閉容器&#xff0c; 請按CtrlPQ進行退出容器

如何阻止YouTube在iOS,Android和Web上自動播放視頻

Over at YouTube, they love it when you watch more YouTube. If you’re sick of YouTube automatically queuing up more videos for you, however, it’s easy enough to turn the autoplay feature off and go back to watching your videos at your own pace. 在YouTube上…

(php)thinkphp3.2配置sql_server

(php)thinkphp3.2配置sql_server 標簽&#xff1a; php thinkphp sql_server2016年12月16日 15:20:19631人閱讀 評論(0) 收藏 舉報分類&#xff1a;php&#xff08;18&#xff09; 最近要整一個crm和erp的對接&#xff0c;最坑的是&#xff0c;erp的是用.net寫的&#xff0c;數…

viewData

viewdata[alert]"alert(你好)"<script>viewdata[alert]</script> 在Controller存儲數據 在 界面得到 關于 ViewData和ViewMode 點擊這里 http://wanshiqian1221.blog.163.com/blog/static/6872130420095242016546/

Blog.Core 第四季度開源更新說明書

B/C/V/PAn open-source organization based on .NET/Core and Vue (React/NG) to quickly build MVC & SPA and microservice application.開源貢獻NETCORE架構設計BCVP開發組成員說&#xff1a;BCVP是以Blog.Core為核心框架設計的一整套前后端分離、RBAC與數據鑒權、統一C…

關于HibernateDaoSupport中的getHibernateTemplate().execute及executeFind方法

轉自&#xff1a;https://blog.csdn.net/angus_17/article/details/8501668 1. 這兩個方法都是為了Spring在接管Hibernate之后&#xff0c;可以對HibernateDaoSupport進行靈活的擴展而用的。 二者的主要區別在于&#xff0c;execute返回的是一個Object&#xff0c;而executeFin…

bootstrap筆記

1.整體排版 <div class"container"><div class"row"><div class"col-md-offset-3 col-md-6"><div class"panel panel-primary"><div class"panel-heading"><h3 class"panel-title&q…

如何將聯系人導入Windows聯系人文件夾和從中導出聯系人

In Windows 7 and 8, there is a Contacts folder in your user directory. This folder can be useful if you have your contacts in a single .vcf file and want to move them into a .csv file for importing into programs like Outlook 2013. 在Windows 7和8中&#xff…

【vue】跟著老馬學習vue-數據雙向綁定

學習了node.js教程&#xff0c;只能說是有了一定的了解&#xff0c;之前也了解了webpack和es6的核心內容&#xff0c;也看過vue2.0的官網教程&#xff0c;并結合視頻看過項目&#xff0c;但是理解和運用仍然存在很多問題&#xff0c;接下來的一段時間&#xff0c;跟著老馬學習v…

位運算符2

class TestExer1{public static void main(String[] args){int m 12;int n 5;System.out.println("m:" m " n:" n);//方法一&#xff1a;提供一個臨時變量。//int temp m;// m n;// n temp;//System.out.println("m:" m &…

C# 實例解析事件委托之EventHandler

概述事件屬于委托的一個子集&#xff0c;像我們平時界面上的鼠標點擊按鈕后響應事件、事件的發布和訂閱等都需要用到委托.通過委托可以很好的實現類之間的解耦好。事件委托EventHandler的函數原型如下&#xff1a;delegate 表示這個個委托&#xff0c;事件委托沒有返回值&#…

C# HttpWebRequest post 數據與上傳圖片到server

主體 Dictionary<string, object> postData new Dictionary<string, object>(); string fileFullPath this.imgFullPath;if (!File.Exists(fileFullPath)){Message(Error, "file not exist: " fileFullPath);goto EndGetPost;}// 先定義一個…

多虧了Google相冊,如何一鍵釋放Android手機上的空間

Let’s be real here: modern smartphones have limited storage. While they’re coming with a lot more than they used to, it’s easy to fill 32GB without even realizing it. And with today’s high-end cameras, well, pictures and videos can quickly consume a bi…

用window.location.href實現頁面跳轉

在寫ASP.Net程序的時候&#xff0c;我們經常遇到跳轉頁面的問題&#xff0c;我們經常使用Response.Redirect &#xff0c;如果客戶要在跳轉的時候使用提示&#xff0c;這個就不靈光了&#xff0c;如&#xff1a;Response.Write("<script>alert(恭喜您&#xff0c;注…

(一)使用appium之前為什么要安裝nodejs???

很多人在剛接觸appium自動化時&#xff0c;可能會像我一樣&#xff0c;按照教程搭建好環境后&#xff0c;卻不知道使用appium之前為什么要用到node.js&#xff0c;nodejs到底和appium是什么關系&#xff0c;對nodejs也不是很了解&#xff0c;接下來我和大家一起理解一下他們之間…

WPF效果第二百零四篇之自定義更新控件

好久沒有更新文章,今天抽空來分享一下最近玩耍的自定義控件;里面包含了自定義控件、依賴屬性和路由事件;來看看最終實現的效果:1、先來看看前臺Xaml布局和綁定:<Style TargetType"{x:Type Cores:UploadWithProgressControl}"><Setter Property"Templat…

u3d 逐個點運動,路徑運動。 U3d one by one, path motion.

u3d 逐個點運動&#xff0c;路徑運動。 U3d one by one, path motion. 作者&#xff1a;韓夢飛沙 Author&#xff1a;han_meng_fei_sha 郵箱&#xff1a;313134555qq.com E-mail: 313134555 qq.com 逐個點運動&#xff0c;路徑運動。 Im going to do some motion and path. 如果…

小米凈水器底部漏水_漏水傳感器:您可能沒有的最容易被忽視的智能家居設備...

小米凈水器底部漏水While most smarthome products are aimed at convenience, there’s one smarthome device that’s actually quite useful, possibly saving you headaches and ton of money: the trusty water leak sensor. 雖然大多數智能家居產品都旨在提供便利&#x…

Unity3D筆記十 游戲元素

一、地形 1.1 樹元素 1.2 草元素 二、光源 2.1 點光源 點光源&#xff08;Point Light&#xff09;&#xff1a;好像包圍在一個類似球形的物體中&#xff0c;讀者可將球形理解為點光源的照射范圍&#xff0c;就像家里的燈泡可以照亮整個屋子一樣。創建點光源的方式為在Hierarch…

BZOJ3511: 土地劃分

【傳送門&#xff1a;BZOJ3511】 簡要題意&#xff1a; 給出n個點&#xff0c;m條邊&#xff0c;每個點有A和B兩種形態&#xff0c;一開始1為A&#xff0c;n為B 給出VA[i]和VB[i]&#xff0c;表示第i個點選擇A和B形態的價值 每條邊給出x,y,EA,EB,EC&#xff0c;表示如果x和y都為…