CVE-2020-7471 Django漏洞復現及淺析


一、 CVE-2020-7471介紹
2020年2月3日,Django 官方發布安全通告公布了一個通過StringAgg(分隔符)實現利用的潛在SQL注入漏洞(CVE-2020-7471)。攻擊者可通過構造分隔符傳遞給聚合函數contrib.postgres.aggregates.StringAgg,從而繞過轉義符號(\)並注入惡意SQL語句。
受影響版本:
• Django 1.11.x < 1.11.28
• Django 2.2.x < 2.2.10
• Django 3.0.x < 3.0.3
不受影響產品版本:
• Django 1.11.28
• Django 2.2.10
• Django 3.0.3

二、漏洞復現
1、kali下安裝受影響的django版本 

  

 

 2.創建測試數據庫

  

 

連接數據庫,修改密碼為123456,並建立數據庫test

  

 

 

3.下載poc:git clone https://github.com/Saferman/CVE-2020-7471.git

 

4.修改CVE-2020-7471/sqlvul_project/settings.py

  

 

5.初始化測試數據庫test中的表

  

 

 查看數據庫是沒數據的

 

 

 

6.運行poc python3 CVE-2020-7471.py

 

 

7.再次查看數據庫,數據插入成功

 

 

三、.POC淺析

 

     initdb函數:給管理器添加初始測試數據

 query函數:進行模糊測試,找出當delimiter 的值為哪些字符時,會讓程序運行出現錯誤(即使用哪些字符可能會干擾SQL語句的執行(將delimiter 輸入的字符帶入了SQL語句,破壞原有語句))

query_with_evil()函數:進行注入點證明測試時,payload前后兩個不同的賦值,是為了得到兩個不同的結果,前一個使用正確的分隔符-,后一個是使用同樣的分隔符-,但是后面帶有SQL語句:
') AS “mydefinedname” FROM “vul_app_info” GROUP BY “vul_app_info”.“gender” LIMIT 1 OFFSET 1 –
數據庫進行查詢時,使得整個查詢語句變為了:
SELECT “vul_app_info”.“gender”, STRING_AGG(“vul_app_info”.“name”, ‘-’) AS “mydefinedname” FROM “vul_app_info” GROUP BY “vul_app_info”.“gender” LIMIT 1 OFFSET 1 –
這里的payload =‘-\’) AS … LIMIT 1 OFFSET 1 –‘中的\’,反斜杠的作用只是在payload字符串賦值時轉義單引號,payload中的-’,使得STRING_AGG(“vul_app_info”.“name”, ‘-’)右括號閉合了,導致了后面的SQL語句的執行。

 

 

參考原文鏈接:https://blog.csdn.net/qq_29365787/article/details/108600613


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM