ThinkPHP framework 代碼執(zhí)行漏洞預警

2017-03-28 09:46  出處:其他  作者:佚名   責任編輯:文俊豪 

  ThinkPHP是一個國內使用很廣泛的老牌PHP MVC框架。貌似國內有不少創(chuàng)業(yè)公司或者項目都用了這個框架。 

  最近官方發(fā)布了一個安全補丁,官方表述是:該URL安全漏洞會造成用戶在客戶端偽造URL,執(zhí)行非法代碼。  

  可是貌似大多數開發(fā)者和使用者并沒有注意到此漏洞的危害性,應者了了,更不用說有多少人去升級了。隨后我對其進行了分析,發(fā)現此問題果然是一個非常嚴重的問題,只要使用了thinkphp框架,就可以直接執(zhí)行任意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));   

  這個代碼是把pathinfo當作restful類型url進行解析的,主要作用是把pathinfo中的數據解析并合并到$_GET數組中。  
然而在用正則解析pathinfo的時候,主要是這一句:  
復制代碼
代碼如下:

$res = preg_replace('@(w+)'.$depr.'([^'.$depr.'/]+)@e', '$var['1']="2";', implode($depr,$paths));   
  這里明顯使用了preg_replace的/e參數,這是個非常危險的參數,如果用了這個參數,preg_replace第二個參數就會被當做php代碼執(zhí)行,作者用這種方式在第二個參數中,利用PHP代碼給數組動態(tài)賦值。  
復制代碼
代碼如下:

'$var['1']="2";'   
  而這里又是雙引號,而雙引號中的php變量語法又是能夠被解析執(zhí)行的。因此,攻擊者只要對任意一個使用thinkphp框架編寫的應用程序,使用如下方式進行訪問,即可執(zhí)行任意PHP代碼:  
復制代碼
代碼如下:

index.php/module/action/param1/${@print(THINK_VERSION)}   
  由于是雙引號執(zhí)行,這里為了保險起見,不給出更有危害性的代碼,利用這個還是需要點技巧的。  

  總之這個問題非常嚴重,找了一下,發(fā)現目前沒有修補漏洞的網站還是很多的。而ThinkPHP框架的特征其實非常好識別,有意者直接寫個scanner進行掃描也未必不可能。  
為了不造成更大損失,特地發(fā)帖希望引起各位使用thinkphp做開發(fā)的同學關注