出品|MS08067實驗室(www.ms08067.com)git
本文做者:守拙(Ms08067實驗室追洞小組成員)
github
經過StringAgg(分隔符)的潛在SQL注入漏洞sql
CVE-2020-7471數據庫
Django 1.11.28以前的1.11.x、2.2.10以前的2.2.x和3.0.3以前的3.0.x版本容許SQL注入,若是不受信任的數據用做StringAgg分隔符(例如,在存在多行數據下載的Django應用程序中,使用用戶指定的列分隔符進行下載的場景)。經過向contrib.postgres.aggregates.StringAgg實例傳遞一個精心構造的分隔符,可能會破壞轉義並注入惡意SQL。django
Django 1.11.x < 1.11.28
Django 2.2.x < 2.2.10
Django 3.0.x < 3.0.3安全
聚合函數StringAgg的delimiter參數未經任何轉義就嵌入到sql語句中,致使sql注入微信
1.數據庫:postgresql,版本無所謂,本文中使用kali虛擬機中自帶的數據庫,容許外部鏈接網絡
/etc/postgresql/12/main/postgresql.conf
/etc/postgresql/12/main/pg_hba.conf
登錄:psql -U postgres -h [kali主機的IP] 建立測試數據庫:CREATE DATABASE test,後面poc中會用到 其餘postgresql語法能夠參考菜鳥教程
2.POC: https://github.com/Saferman/CVE-2020-7471,運行環境django3.0.2app
POC測試腳本中有兩個函數query()和query_with_evil(),前者用於模糊測試,後者用於注入點證實函數
SELECT "vul_app_info"."gender", STRING_AGG("vul_app_info"."name", \'\'\') AS "mydefinedname" FROM "vul_app_info" GROUP BY "vul_app_info"."gender" LIMIT 21
SELECT "vul_app_info"."gender", STRING_AGG("vul_app_info"."name", \'- \') AS "mydefinedname" FROM "vul_app_info" GROUP BY "vul_app_info"."gender" LIMIT 21
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 OFSET 1 --
sql="SELECT * FROM user_contacts WHERE username = %s" user='zhugedali' cursor.execute(sql,[user])
array_to_string(array_agg(name),'-')
轉載請聯繫做者並註明出處!
Ms08067安全實驗室專一於網絡安全知識的普及和培訓。團隊已出版《Web安全攻防:滲透測試實戰指南》,《內網安全攻防:滲透測試實戰指南》,《Python安全攻防:滲透測試實戰指南》,《Java代碼安全審計(入門篇)》等書籍。
團隊公衆號按期分享關於CTF靶場、內網滲透、APT方面技術乾貨,從零開始、以實戰落地爲主,致力於作一個實用的乾貨分享型公衆號。
官方網站:https://www.ms08067.com/
掃描下方二維碼加入實驗室VIP社區
加入後邀請加入內部VIP羣,內部微信羣永久有效!