0x00 事件背景
2019年1月11日,360CERT發(fā)現(xiàn)某安全社區(qū)出現(xiàn)關(guān)于ThinkPHP5 RCE漏洞的威脅情報(bào),不久之后ThinkPHP5官方與GitHub發(fā)布更新。
該更新修復(fù)了一處嚴(yán)重漏洞,該漏洞可導(dǎo)致遠(yuǎn)程命令代碼執(zhí)行
0x01 影響范圍
ThinkPHP 5.0.x
0x02 修復(fù)建議
官方在GitHub中進(jìn)行了更新:版本更新
0x03 漏洞驗(yàn)證
該漏洞危害高,影響嚴(yán)重:
0x04 漏洞分析
漏洞主要出現(xiàn)在ThinkPHP?Request類的method方法中 (thinkphp/library/think/Request.php)
Request類可以實(shí)現(xiàn)對(duì)HTTP請(qǐng)求的一些設(shè)置,其中成員方法method用來獲取當(dāng)前請(qǐng)求類型,其定義如下:
當(dāng)傳入的參數(shù)為false的時(shí)候,會(huì)取配置項(xiàng)var_method,其默認(rèn)值為_method
$this->{$this->method}($_POST); 通過post參數(shù)_method可以實(shí)現(xiàn)對(duì)當(dāng)前類的任意方法進(jìn)行調(diào)用。
通過調(diào)用當(dāng)前類的構(gòu)造方法可以覆蓋任意成員屬性的值:
這里通過覆蓋filter屬性,filter屬性保存了用于全局過濾的函數(shù)。
但是在thinkphp5.0.23中,會(huì)對(duì)filter值重新賦值為空,導(dǎo)致無法利用。
在thinkphp/library/think/App.php中開啟debug的時(shí)候會(huì)調(diào)用Request類的param方法。
在thinkphp/library/think/Request.php param方法中會(huì)調(diào)用到method方法,并將參數(shù)設(shè)置為true。
當(dāng)參數(shù)為true的時(shí)候,會(huì)調(diào)用server方法
會(huì)走到 input方法,通過之前方法覆蓋server成員屬性值為array(),input方法代碼如下:
最終會(huì)調(diào)用filterValue形成任意代碼執(zhí)行:
0x05 時(shí)間線
2019-01-11?360CERT發(fā)現(xiàn)漏洞威脅情報(bào)
2019-01-11?ThinkPHP發(fā)布補(bǔ)丁更新
2019-01-11?360CERT發(fā)布預(yù)警分析
0x06 參考鏈接