国产成人精品18p,天天干成人网,无码专区狠狠躁天天躁,美女脱精光隐私扒开免费观看

ThinkPHP5.1.x的SQL注入漏洞分析

發(fā)布時(shí)間:2021-09-14 11:25 來(lái)源:億速云 閱讀:0 作者:chen 欄目: 網(wǎng)絡(luò )安全 歡迎投稿:712375056

這篇文章主要介紹“ThinkPHP5.1.x的SQL注入漏洞分析”,在日常操作中,相信很多人在ThinkPHP5.1.x的SQL注入漏洞分析問(wèn)題上存在疑惑,小編查閱了各式資料,整理出簡(jiǎn)單好用的操作方法,希望對大家解答”ThinkPHP5.1.x的SQL注入漏洞分析”的疑惑有所幫助!接下來(lái),請跟著(zhù)小編一起來(lái)學(xué)習吧!

一、背景介紹

1.1 漏洞描述

在ThinkPHP5.1.23之前的版本中存在SQL注入漏洞,該漏洞是由于程序在處理order by 后的參數時(shí),未正確過(guò)濾處理數組的key值所造成。如果該參數用戶(hù)可控,且當傳遞的數據為數組時(shí),會(huì )導致漏洞的產(chǎn)生。

1.2 受影響的系統版本

ThinkPHP < 5.1.23

1.3 漏洞編號

CVE-2018-16385

二、環(huán)境搭建

1.下載安裝thinkphp5.1.x

對于thinkphp5.1.x完整版,目前官方?jīng)]有直接下載的鏈接。Github上只是放出核心版。該版本需要以Composer或Git方式進(jìn)行安裝。

這里以Composer安裝方式說(shuō)明。

在 Linux 和 Mac OS X 中可以運行如下命令:

curl -sS https://getcomposer.org/installer | phpmv composer.phar/usr/local/bin/composer

在 Windows 中,你需要下載并運行 Composer-Setup.exe 。

安裝好之后,切換路徑到WEB目錄下運行:

composercreate-project topthink/think=5.1.1 tp5.1 --prefer-dist

然后會(huì )生成一個(gè)名為tp5.1的文件夾。到此think5.1.1下載成功。

2.然后在瀏覽器中訪(fǎng)問(wèn)  

如果出現該頁(yè)面,則證明安裝成功。

3.Demo示例

編寫(xiě)Demo文件,并將文件命名為T(mén)est.php,然后放在/tp5.1/application/index/controller/目錄下。

4.數據庫

與Demo文件匹配,需要創(chuàng )建一個(gè)user表,然后設一個(gè)字段(id)。

三、漏洞細節

在/thinkphp/library/think/db/Builder.php parseOrder()的函數中:

通過(guò)Demo傳入order參數內容,當傳入的$order是一個(gè)數組時(shí),foreach函數將$order數組分為key和value形式。

根據漏洞修復補丁,知道漏洞發(fā)生在parseOrderField()函數中。

當$val為數組時(shí),會(huì )進(jìn)入parseOrderField()函數。

跟蹤parseOrderField()函數

getOptions()函數是獲取了當前要查詢(xún)的參數,getFieldsBind()函數是獲取數據表綁定信息,foreach循環(huán)是對$val值進(jìn)行了處理,這里其實(shí)不是重點(diǎn),就提一下。$val值是什么不用管,因為注入點(diǎn)在$key上,而$val 拼接在$key后面,可以在構造$key加#注釋掉$val。

重點(diǎn)是parseKey()函數,跟蹤parseKey()函數。

這里對傳入的$key進(jìn)行多重判斷以及處理。

1. is_numeric判斷,如果是數字,則返回,不是的話(huà)繼續向下執行。

2. 判斷$key是否屬于Expression類(lèi)。

3. strpos($key, '->') && false ===strpos($key, '(') 。

4. ('*' != $key && ($strict ||!preg_match('/[,\'\"\*\(\)`.\s]/', $key)))。

因為$key是我們的sql注入語(yǔ)句,所以1.2.3肯定不滿(mǎn)足,而4滿(mǎn)足。

所以此時(shí)的$key會(huì )在左右兩側加個(gè) ` 號。

$table不存在,不會(huì )對$key修改,所以加 ` 號后會(huì )返回$key,然后和$val以及field字符串進(jìn)行拼接,再然后return賦值給array變量,緊接著(zhù),array與order by 字符串進(jìn)行拼接形成order by查詢(xún)語(yǔ)句,最終系統調用query()函數進(jìn)行數據庫查詢(xún),觸發(fā)漏洞。

著(zhù)重說(shuō)明一下,這里由于field函數,漏洞利用有兩個(gè)關(guān)鍵點(diǎn):

首先解釋下field()函數:中的field()函數作用是對SQL中查詢(xún)結果集進(jìn)行指定順序排序。一般與order by 一起使用。

關(guān)鍵點(diǎn)1:

field()函數必須指定大于等于兩個(gè)字段才可以正常運行,否則就會(huì )報錯。

當表中只有一個(gè)字段時(shí),我們可以隨意指定一個(gè)數字或字符串的參數。

關(guān)鍵點(diǎn)2:

當field中的參數不是字符串或數字時(shí),指定的參數必須是正確的表字段,否則程序就會(huì )報錯。這里由于程序會(huì )在第一個(gè)字段中加 `` 限制 ,所以必須指定正確的字段名稱(chēng)。第二個(gè)字段沒(méi)有限制,可以指定字符串或數字。 

所以,我們要利用該漏洞,第一我們至少需要知道表中的一個(gè)字段名稱(chēng),第二向field()函數中中傳入兩個(gè)字段。第二個(gè)字段不需要知道字段名,用數字或字符串繞過(guò)即可。

Payload構造

根據以上分析,構造payload需要滿(mǎn)足以下條件:

1.傳入的$order需要是一個(gè)數組。

2.$val 必須也是數組。

3.至少知道數據庫表中的一個(gè)字段名稱(chēng),并且傳入兩個(gè)參數。

4.閉合 ` 。

最終Payload構造如下:

http://127.0.0.1/tp5.1/public/index/test/index?order[id`,111)|updatexml(1,concat(0x3a,user()),1)%23][]=1

http://127.0.0.1/tp5.1/public/index/test/index?order[id`,'aaa')| updatexml(1,concat(0x3a,user()),1)%23][]=1

四、動(dòng)態(tài)調試分析

 有時(shí)候單單靜態(tài)分析,很難知道某些函數做了些什么,而對于程序運行過(guò)程,也很難理解透徹。而利用動(dòng)態(tài)分析,一步一步debug,就很容易理解清楚。

這里我們利用上面構造的payload進(jìn)行debug。

首先下斷點(diǎn):

$val是個(gè)數組,進(jìn)入parseOrderField()函數。F7下一步(我這里用的是phpstorm,F7是單步調試的意思)。

foreach循環(huán)后,可以看到只是處理了$val,并沒(méi)有涉及$key(我們的關(guān)注點(diǎn)在$key)。$val 的值是在$key的基礎上加了個(gè):data__前綴,后面加了個(gè)0。

繼續F7,進(jìn)入了parseKey()函數。

到這里,看到$key滿(mǎn)足if條件,然后兩邊加了個(gè) ` 號。

最后返回的$key。其實(shí)就是兩邊加了個(gè) ` 號 。

最后,返回給array變量的值為file字符串和$key以及$val的拼接。

繼續F7,看看接下來(lái)程序怎么走。

進(jìn)行了limit分析,union分析等多個(gè)分析處理,最終來(lái)到了removeoption()函數。

可以看到這里的$sql,已經(jīng)可以觸發(fā)注入漏洞。

然后經(jīng)過(guò)了中間的幾個(gè)過(guò)程,對比上圖,并沒(méi)有改變sql語(yǔ)句內容。最后sql語(yǔ)句,進(jìn)入query()函數執行了SQL語(yǔ)句,成功觸發(fā)注入漏洞。

五、修復建議

官方補丁

目前官方已經(jīng)更新補丁,請受影響的用戶(hù)盡快升級到ThinkPHP5.1.24版本。

手工修復

根據官方給出的方案進(jìn)行代碼修改。

https://github.com/top-think/framework/commit/f0f9fc71b8b3716bd2abdf9518bcdf1897bb776

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng )、來(lái)自本網(wǎng)站內容采集于網(wǎng)絡(luò )互聯(lián)網(wǎng)轉載等其它媒體和分享為主,內容觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如侵犯了原作者的版權,請告知一經(jīng)查實(shí),將立刻刪除涉嫌侵權內容,聯(lián)系我們QQ:712375056,同時(shí)歡迎投稿傳遞力量。

亚洲人成人网站色WWW| 亚欧美日韩香蕉在线播放视频| AV无码精品一区二区三区| 少妇人妻无码专用视频| 催眠极品YIN荡人妻合集H| 亚洲午夜无码久久久久小说|