ThinkPHP framework 任意代碼執(zhí)行漏洞預(yù)警
發(fā)布日期:2022-01-29 13:29 | 文章來源:源碼之家
ThinkPHP是一個(gè)國內(nèi)使用很廣泛的老牌PHP MVC框架。貌似國內(nèi)有不少創(chuàng)業(yè)公司或者項(xiàng)目都用了這個(gè)框架。
最近官方發(fā)布了一個(gè)安全補(bǔ)丁,官方表述是:該URL安全漏洞會造成用戶在客戶端偽造URL,執(zhí)行非法代碼。
可是貌似大多數(shù)開發(fā)者和使用者并沒有注意到此漏洞的危害性,應(yīng)者了了,更不用說有多少人去升級了。隨后我對其進(jìn)行了分析,發(fā)現(xiàn)此問題果然是一個(gè)非常嚴(yán)重的問題,只要使用了thinkphp框架,就可以直接執(zhí)行任意php代碼。特此發(fā)帖預(yù)警各位。
我們來分析一下官方的補(bǔ)丁:
/trunk/ThinkPHP/Lib/Core/Dispatcher.class.php
125 - $res = preg_replace('@(w+)'.$depr.'([^'.$depr.'\/]+)@e', '$var[\'\\1\']="\\2";', implode($depr,$paths));
125 + $res = preg_replace('@(w+)'.$depr.'([^'.$depr.'\/]+)@e', '$var[\'\\1\']=\'\\2\';', implode($depr,$paths));
這個(gè)代碼是把pathinfo當(dāng)作restful類型url進(jìn)行解析的,主要作用是把pathinfo中的數(shù)據(jù)解析并合并到$_GET數(shù)組中。
然而在用正則解析pathinfo的時(shí)候,主要是這一句:
$res = preg_replace('@(w+)'.$depr.'([^'.$depr.'\/]+)@e', '$var[\'\\1\']="\\2";', implode($depr,$paths));
這里明顯使用了preg_replace的/e參數(shù),這是個(gè)非常危險(xiǎn)的參數(shù),如果用了這個(gè)參數(shù),preg_replace第二個(gè)參數(shù)就會被當(dāng)做php代碼執(zhí)行,作者用這種方式在第二個(gè)參數(shù)中,利用PHP代碼給數(shù)組動(dòng)態(tài)賦值。
'$var[\'\\1\']="\\2";'
而這里又是雙引號,而雙引號中的php變量語法又是能夠被解析執(zhí)行的。因此,攻擊者只要對任意一個(gè)使用thinkphp框架編寫的應(yīng)用程序,使用如下方式進(jìn)行訪問,即可執(zhí)行任意PHP代碼:
index.php/module/action/param1/${@print(THINK_VERSION)}
由于是雙引號執(zhí)行,這里為了保險(xiǎn)起見,不給出更有危害性的代碼,利用這個(gè)還是需要點(diǎn)技巧的。
總之這個(gè)問題非常嚴(yán)重,找了一下,發(fā)現(xiàn)目前沒有修補(bǔ)漏洞的網(wǎng)站還是很多的。而ThinkPHP框架的特征其實(shí)非常好識別,有意者直接寫個(gè)scanner進(jìn)行掃描也未必不可能。
為了不造成更大損失,特地發(fā)帖希望引起各位使用thinkphp做開發(fā)的同學(xué)關(guān)注。盡早升級官方的安全補(bǔ)丁
作者:GaRY
最近官方發(fā)布了一個(gè)安全補(bǔ)丁,官方表述是:該URL安全漏洞會造成用戶在客戶端偽造URL,執(zhí)行非法代碼。
可是貌似大多數(shù)開發(fā)者和使用者并沒有注意到此漏洞的危害性,應(yīng)者了了,更不用說有多少人去升級了。隨后我對其進(jìn)行了分析,發(fā)現(xiàn)此問題果然是一個(gè)非常嚴(yán)重的問題,只要使用了thinkphp框架,就可以直接執(zhí)行任意php代碼。特此發(fā)帖預(yù)警各位。
我們來分析一下官方的補(bǔ)丁:
/trunk/ThinkPHP/Lib/Core/Dispatcher.class.php
復(fù)制代碼
代碼如下:125 - $res = preg_replace('@(w+)'.$depr.'([^'.$depr.'\/]+)@e', '$var[\'\\1\']="\\2";', implode($depr,$paths));
125 + $res = preg_replace('@(w+)'.$depr.'([^'.$depr.'\/]+)@e', '$var[\'\\1\']=\'\\2\';', implode($depr,$paths));
這個(gè)代碼是把pathinfo當(dāng)作restful類型url進(jìn)行解析的,主要作用是把pathinfo中的數(shù)據(jù)解析并合并到$_GET數(shù)組中。
然而在用正則解析pathinfo的時(shí)候,主要是這一句:
復(fù)制代碼
代碼如下:$res = preg_replace('@(w+)'.$depr.'([^'.$depr.'\/]+)@e', '$var[\'\\1\']="\\2";', implode($depr,$paths));
這里明顯使用了preg_replace的/e參數(shù),這是個(gè)非常危險(xiǎn)的參數(shù),如果用了這個(gè)參數(shù),preg_replace第二個(gè)參數(shù)就會被當(dāng)做php代碼執(zhí)行,作者用這種方式在第二個(gè)參數(shù)中,利用PHP代碼給數(shù)組動(dòng)態(tài)賦值。
復(fù)制代碼
代碼如下:'$var[\'\\1\']="\\2";'
而這里又是雙引號,而雙引號中的php變量語法又是能夠被解析執(zhí)行的。因此,攻擊者只要對任意一個(gè)使用thinkphp框架編寫的應(yīng)用程序,使用如下方式進(jìn)行訪問,即可執(zhí)行任意PHP代碼:
復(fù)制代碼
代碼如下:index.php/module/action/param1/${@print(THINK_VERSION)}
由于是雙引號執(zhí)行,這里為了保險(xiǎn)起見,不給出更有危害性的代碼,利用這個(gè)還是需要點(diǎn)技巧的。
總之這個(gè)問題非常嚴(yán)重,找了一下,發(fā)現(xiàn)目前沒有修補(bǔ)漏洞的網(wǎng)站還是很多的。而ThinkPHP框架的特征其實(shí)非常好識別,有意者直接寫個(gè)scanner進(jìn)行掃描也未必不可能。
為了不造成更大損失,特地發(fā)帖希望引起各位使用thinkphp做開發(fā)的同學(xué)關(guān)注。盡早升級官方的安全補(bǔ)丁
作者:GaRY
版權(quán)聲明:本站文章來源標(biāo)注為YINGSOO的內(nèi)容版權(quán)均為本站所有,歡迎引用、轉(zhuǎn)載,請保持原文完整并注明來源及原文鏈接。禁止復(fù)制或仿造本網(wǎng)站,禁止在非www.sddonglingsh.com所屬的服務(wù)器上建立鏡像,否則將依法追究法律責(zé)任。本站部分內(nèi)容來源于網(wǎng)友推薦、互聯(lián)網(wǎng)收集整理而來,僅供學(xué)習(xí)參考,不代表本站立場,如有內(nèi)容涉嫌侵權(quán),請聯(lián)系alex-e#qq.com處理。
相關(guān)文章