PHP以其易用性和可移植性正被遍及應用于WEB開拓。然而,在我們利用的進程中,,也要十分小心,從到處可見的XSS(新浪微博發送大量垃圾信息事件)到前段時間爆出來的Hash斗嘴的DDOS進攻,最近,wooyun上面宣布了一個關于ThinkPHP框架的裂痕(最新版已經修復),以前也是我用過的第一個框架,昨晚花時間重現了一下,查閱了下措施的道理。本文主要來重現該裂痕,然后闡明代碼,給出裂痕的原因,用這個裂痕去檢討大概對系統造成的粉碎,最后總結,防御的要領。
裂痕主要是由mixed preg_replace ( mixed pattern, mixed replacement, mixed subject [, int limit]) 這個函數引起的,我們先看官方說明:
/e 修 正符使 preg_replace() 將 replacement 參數看成 PHP 代碼(在適當的逆向引用替換完之后)。提示:要確保 replacement 組成一個正當的 PHP 代碼字符串,不然 PHP 會在陳訴在包括 preg_replace() 的行中呈現語法理會錯 誤。
我們不妨先看一下這個示例
preg_replace("/test/e",$_GET["h"],"jutst test"); |
假如我們提交?h=phpinfo(),phpinfo()將會被執行(利用/e修飾符,preg_replace會將 replacement 參數看成 PHP 代碼執行)。這個正則被正確的匹配到,在舉辦替換的進程中,需要將$_GET["h"]傳入的String看成函數來運行,因此phpinfo()被樂成執行。
<?phppreg_replace("/test/e",$_GET["h"],"jutst test");
?>
會見的url : ?h=phpinfo()
進而,我們進入ThinkPHP的源碼,下載2.1版(2.1今后已經被修復)。在/ThinikPHP/Lib/ThinkPHP/Util/Dispatcher.class.php的dispatch函數中,找到這句話:
在ThinkPHP的路由成果中,許多處所用到了preg_replace函數的/e參數,然而最嚴重的是這個文件中的這句話,因為險些影響了所有利用Thinkphp的項目。
顯然,這個利用了/e函數,會導致第二個參數看成函數利用。我們來闡明一下這句話:
正則匹配的是 :字母開頭,加上“/”脫離符,后頭跟一個非”/”的元素,被替換成$var["脫離符前的字母"]=脫離符后的值;作者的本意是要將這么一對一對的參數/值的形式的url寫入到 $var[$key] = $value的數組中。
譬喻:URL,index.php?s=/model/action/par1/value1
將被理會成 :model模塊的action要領,參數的處理懲罰放在這句話中,$deprde的值是“/”,由于/par1/value1(剩余的URL參數)匹配到了正則表達式,則會用第二個參數去舉辦替換。那么第二個參數應該被看成一個php語句來執行,他是一個賦值語句,執行的功效為:$var["par1"] = “value1″,作者以此來到達闡明url的目標,也實現了ThinkPHP的C層。
可是在賦值的時候,利用的是雙引號。危險的處所實際上在這里,在 php中,雙引號內里假如包括有變量,php表明器會將其替換為變量表明后的功效;單引號中的變量不會被處理懲罰。可以先做如下測試:
$a = “{${phpinfo()}}”; phpinfo會被樂成執行。因此,我們將第二個變量替換成我們需要的函數,結構出來的進攻url大抵如下:
http:[email protected](THINK_VERSION)}
我們利用ThinkPHP2.1_full_with_extend ,利用examlpe內里的Blog示例,快速搭建一個Thinkphp項目,然后會見http:[email protected](THINK_VERSION)},可以在左上角打印出當前的TP版本,操作這個來執行php函數,相當于開啟了一個PHP的一句話后門。
詳細闡明是:這句話的/par [email protected](THINK_VERSION)}將匹配到正則表達式,將會執行第二個參數,詳細語句是$var['par'] = “[email protected](THINK_VERSION)} “; 問題出在雙引號上面,這個會執行內里的語句,包括許多危險的語句,包括phpinfo(),讀取數據庫設置等等。
停止今朝,在Google上還可以找到很多這樣的站點,許多站點都可以直接執行phpinfo(),在新版的ThinkPHP中已經修復了這個裂痕,將第二個參數的雙引號改為單引號:
'$var['']='';'
在我們今后利用preg_replace的/e修飾符的時候,需要留意這個雙引號和單引號,像框架類的裂痕,一般影響的范疇都很是的廣。