成人午夜视频全免费观看高清-秋霞福利视频一区二区三区-国产精品久久久久电影小说-亚洲不卡区三一区三区一区

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

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

孟州網(wǎng)站制作公司哪家好,找創(chuàng)新互聯(lián)!從網(wǎng)頁設(shè)計(jì)、網(wǎng)站建設(shè)、微信開發(fā)、APP開發(fā)、響應(yīng)式網(wǎng)站等網(wǎng)站項(xiàng)目制作,到程序開發(fā),運(yùn)營(yíng)維護(hù)。創(chuàng)新互聯(lián)成立于2013年到現(xiàn)在10年的時(shí)間,我們擁有了豐富的建站經(jīng)驗(yàn)和運(yùn)維經(jīng)驗(yàn),來保證我們的工作的順利進(jìn)行。專注于網(wǎng)站建設(shè)就選創(chuàng)新互聯(lián)。

一、背景介紹

1.1 漏洞描述

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

1.2 受影響的系統(tǒng)版本

ThinkPHP < 5.1.23

1.3 漏洞編號(hào)

CVE-2018-16385

二、環(huán)境搭建

1.下載安裝thinkphp5.1.x

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

這里以Composer安裝方式說明。

在 Linux 和 Mac OS X 中可以運(yùn)行如下命令:

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

在 Windows 中,你需要下載并運(yùn)行 Composer-Setup.exe 。

安裝好之后,切換路徑到WEB目錄下運(yùn)行:

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

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

2.然后在瀏覽器中訪問  

ThinkPHP5.1.x的SQL注入漏洞分析如果出現(xiàn)該頁面,則證明安裝成功。

3.Demo示例

ThinkPHP5.1.x的SQL注入漏洞分析編寫Demo文件,并將文件命名為Test.php,然后放在/tp5.1/application/index/controller/目錄下。

4.數(shù)據(jù)庫(kù)

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

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

三、漏洞細(xì)節(jié)

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

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

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

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

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

跟蹤parseOrderField()函數(shù)

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

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

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

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

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

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

1. is_numeric判斷,如果是數(shù)字,則返回,不是的話繼續(xù)向下執(zhí)行。

2. 判斷$key是否屬于Expression類。

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

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

因?yàn)?key是我們的sql注入語句,所以1.2.3肯定不滿足,而4滿足。

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

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

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

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

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

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

field()函數(shù)必須指定大于等于兩個(gè)字段才可以正常運(yùn)行,否則就會(huì)報(bào)錯(cuò)。

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

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

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

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

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

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

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

Payload構(gòu)造

根據(jù)以上分析,構(gòu)造payload需要滿足以下條件:

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

2.$val 必須也是數(shù)組。

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

4.閉合 ` 。

最終Payload構(gòu)造如下:

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

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

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

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

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

首先下斷點(diǎn):

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

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

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

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

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

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

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

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

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

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

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

繼續(xù)F7,看看接下來程序怎么走。

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

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

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

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

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

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

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

五、修復(fù)建議

官方補(bǔ)丁

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

手工修復(fù)

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

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

到此,關(guān)于“ThinkPHP5.1.x的SQL注入漏洞分析”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識(shí),請(qǐng)繼續(xù)關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)砀鄬?shí)用的文章!

新聞標(biāo)題:ThinkPHP5.1.x的SQL注入漏洞分析
文章地址:http://jinyejixie.com/article26/jogpcg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供外貿(mào)建站、電子商務(wù)、網(wǎng)站收錄、手機(jī)網(wǎng)站建設(shè)、網(wǎng)站維護(hù)、小程序開發(fā)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

網(wǎng)站托管運(yùn)營(yíng)
同心县| 泰和县| 区。| 吕梁市| 宝清县| 吉林市| 洛阳市| 英吉沙县| 介休市| 漯河市| 芷江| 巴林右旗| 通辽市| 邛崃市| 汝阳县| 吉首市| 桃园县| 敖汉旗| 长岛县| 项城市| 新田县| 会东县| 富平县| 平安县| 子长县| 德保县| 临沭县| 翁牛特旗| 乌拉特中旗| 连城县| 新安县| 林口县| 长白| 江永县| 化隆| 湖州市| 巨鹿县| 咸宁市| 井陉县| 临颍县| 汕尾市|