精品无码久久久久久久久_国产精品一区二区三区四区五区_欧美亚洲国产激情一区二区_午夜精品久久久久久久久久久久_亚洲欧洲中文日韩久久AV乱码_91精品欧美一区二区三区_久久精品一区二区免费播放_日韩高清大片永久免费入口_久久国产欧美日韩精品免费_欧美一区二区三区久久综合_国产精品天天狠天天看

Django CVE-2022-28346 SQL注入分析

2022-05-12點擊量:9656


前言

最近在看CNVD時無意間看到兩條關于Django的最新漏洞通告,隨即打開看了一下,大概意思是說Django在2.2.28?版本之前的2.2版本、3.2.13版本之前的3.2版本、4.0.4版本之前的4.0版,本使用QuerySet.annotate() aggregate() extra()數(shù)據(jù)聚合函數(shù)時會導致SQL注入問題。由于筆者平時開發(fā)一些平臺多半也是使用Django,所以便嘗試進行分析了一下,如有描述不當之處,還望提出建議修改斧正。


影響版本

Django Django >=2.2,<2.2.28
Django Django >=3.2,<3.2.13
Django Django >=4.0,<4.0.4

?

環(huán)境構建

Python: 3.7.9
Django: 3.2.11

?

目錄結構

202205120958058031.png

models.py

views.py

urls.py

settings.py

或者使用筆者構建好的環(huán)境:

https://github.com/DeEpinGh0st/CVE-2022-28346

?

漏洞復現(xiàn)

初始化項目

1.python manage.py makemigrations
2.python manage.py migrate
3.訪問http://x.x.x.x:8000/ 初始化數(shù)據(jù)

觸發(fā)

訪問
http://x.x.x.x:8000/demo?field=demo.name" FROM "demo_user" union SELECT "1",sqlite_version(),"3" --

202205121000361656.png

?

漏洞分析

老規(guī)矩,分析前可以先看看官方在修復的commit中有沒有給出測試用例

在https://github.com/django/django/commit/2044dac5c6968441be6f534c4139bcf48c5c7e48中看到官方在測試組件中給出了基本的測試用例。

202205121001431388.png

我們可以根據(jù)官方給出的代碼編寫相應的代碼進行調試和分析。

在views.py的annotate打入斷點后,來到db.models.query.py:__init__,進行QuerySet的初始化。

202205121002084945.png

在初始化QuerySet后,會來到db.models.query.py:annotate開始執(zhí)行聚合流程,在annotate中首先會調用_annotate并傳入kwargs。

202205121003338232.png

annotate在完成對kwargs.values()合法性校驗等一系列操作后,將kwargs更新到annotations中,隨后遍歷annotations中的元素調用add_annotation進行數(shù)據(jù)聚合。

202205121003534432.png

跟進add_annotation(print是筆者為了分析自己加入的)。

202205121004186482.png

add_annotation繼續(xù)調用resolve_expression解析表達式,在此處并沒有對傳入的聚合參數(shù)進行相應的檢查。在經過一系列調用后,最終會來到db.models.sql.query.py:resolve_ref

resolve_ref會獲取annotations中的元素,并將其轉換后帶入到查詢的條件中,最后其結果通過transform_function聚合到一個Col對象中,可以看到聚合之后的結果。

202205121005054073.png

返回到db.models.query.py:_annotate可以看到具體聚合后數(shù)據(jù)值,以及執(zhí)行的sql語句。

202205121005262305.png

最后將結果返回到QuerySet中進行展示。

202205121005489899.png

?

修復

在漏洞公開后,Django官方隨即對項目進行了修復。

202205121006137910.png

在add_annotation中加入了check_alias對聚合參數(shù)進行檢查。

?

參考

https://github.com/django/django/commit/2044dac5c6968441be6f534c4139bcf48c5c7e48

https://www.cnvd.org.cn/flaw/show/CNVD-2022-31838

山東云天安全技術有限公司 版權所有 魯ICP備17007379號-1

魯公網(wǎng)安備 37010202002190號