前言
本節(jié)我將分析thinkphp5.0.x 版本的RCE漏洞,根據(jù)漏洞的研究模擬挖掘此漏洞的思路
本次分析框架下載,由于官方已經(jīng)下架了相關(guān)的下載接口,這里我們用三方下載 一份v5.0.22版本的升級中...https://www.codejie.net/5828.html
附贈?thinkphp5.0官方開發(fā)手冊
架構(gòu)總覽 · ThinkPHP5.0完全開發(fā)手冊 · 看云ThinkPHP V5.0是一個為API開發(fā)而設(shè)計的高性能框架——是一個顛覆和重構(gòu)版本,采用全新的架構(gòu)思想,引入了很多的PHP新特性,優(yōu)化了核心,減少了依賴,實(shí)現(xiàn)了真正的惰性加載,支持composer,并針對API開發(fā)做了大量的優(yōu)化。ThinkPHP5是一個全新的里程碑版本,包括路由、日志、異常、模型、數(shù)據(jù)庫、模板引擎和驗(yàn)證等模塊都已經(jīng)重構(gòu),不適合原有3.2項目的升級,請慎重考慮商業(yè)項目升級,但絕對是新項目的首選(無論是WEB還是API開發(fā)),而且最好是忘記3.2版本的思維習(xí)慣,重新理解TP5。https://www.kancloud.cn/manual/thinkphp5/122950
漏洞復(fù)現(xiàn)
這里先上payload 大家可以驗(yàn)證環(huán)境是否可行
?接下來我們就略過漏洞分析,模擬一下這個漏洞發(fā)現(xiàn)的思路
Request類中危險函數(shù)
在request類filterValue方法下有一個call_user_func()函數(shù)
如果傳進(jìn)去的兩個參數(shù)$filter與$value都是可控的話,則會產(chǎn)生漏洞
函數(shù)調(diào)用鏈倒逆分析
接下來分析誰可以調(diào)用filtervalue方法
在requestl類中1026行,調(diào)用了此方法filtervalue,傳入了相關(guān)值
?這段代碼是位于994行input函數(shù)內(nèi),其中data 沒有更改的,filter在1023行有本類的成員filter賦予
?那么我們繼續(xù)分析誰可以調(diào)用input函數(shù)
仍然在requesr類中661行調(diào)用了此函數(shù)input,且傳入input的data數(shù)組參數(shù)是本類的param賦予的
這段代碼位于request類中的param方法中
?繼續(xù)分析誰可以調(diào)用param函數(shù),現(xiàn)在就不用這考慮傳參的問題了,我只需request類的中param成員與filter成員為可控參數(shù)即可,且filter為數(shù)組包含一個system,param為這個數(shù)組包含命令語句為最佳。
讓參數(shù)變得可控
在app類中exec方法中有調(diào)用調(diào)用request類的param
?需要注意的是這個框架的對象的創(chuàng)建模式是單例模式,也就是說469行instance得到的對象在前提request對象存在的情況下,得到的還是之前的request而非新的對象。
那么我們到底可不可以控制request對象的成員呢?看看名字-request!用戶請求!似乎是可控的,不能說全不吧總有一兩個屬性是為用戶準(zhǔn)備的,?
現(xiàn)在繼續(xù)分析函數(shù)調(diào)用鏈。要確保dispatch的type為merhod,我們才能正常調(diào)用param函數(shù)
誰調(diào)用了exec?函數(shù),
在app類中77行run函數(shù)調(diào)用了exec函數(shù)
此外還有了兩個意外的收獲,1是我們找到了request對象2是我們發(fā)現(xiàn)了dispatch的賦值
函數(shù)調(diào)用鏈正向分析?
由此我們追入routecheck函數(shù),一是尋找讓dispatch對象的成員type值為method,二則是繼續(xù)尋找讓request對象的filter成員與param成員成為可控變量的契機(jī)。(不要亂 不要亂)
看到result不妨大膽的猜測,它最終就是這個函數(shù)執(zhí)行的返回值
在643行,就有了result結(jié)果,而且聯(lián)系了request對象
?追進(jìn)route的check方法
在857看到了敏感參數(shù)method ,保證type為method跟它有沒有關(guān)呢!再分析返回值
method會與rules有關(guān),rules在87行會與返回值有關(guān)。
也沒有找到type賦值的地方,我們大膽進(jìn)入strtolower($request->method());,且這還還是調(diào)用request對象的方法,那更要分析了
(在下圖 由注釋信息當(dāng)前的請求類型,猜測與type有關(guān))
根據(jù)邏輯語句(我們都沒有傳參),它會進(jìn)入524行
$_POST是什么參數(shù)!它一般都是用戶輸入的post數(shù)據(jù),這是我們可控的。代碼之后就把取出的值放在了method,看看它做了什么。它居然被調(diào)用了,而且傳入的參數(shù)就是$_post,這是我們控制的,也就是說現(xiàn)在,我們可以任意調(diào)用request類的方法,且是參數(shù)還是我們可控的,
那這樣的話,我用對象的方法去改對象的值豈不是輕輕松松!到request類中好好看看!
非常順利 __construct就有成員屬性賦值的機(jī)制。
我們可以將request對象的filter成員與param成員賦值了 ,(理論就是這樣不過實(shí)際上你要調(diào)試的更多,因?yàn)橐紤]到很多細(xì)節(jié)嘛)
至于type類型,這個我還真沒分析出來,不過我們可以嘗試調(diào)用接口方法,參看type類型這也不失為一種分析方法,像我調(diào)用/public/index.php的時候type就為module 調(diào)用/public/index.php?s=captcha就為method 這正是我們想要的
如果上述都可行,那我們構(gòu)造好的參數(shù),就可以RCE了, 誰調(diào)用app.run 完全不用管,一定會調(diào)用的
————————————————————————-----------——————————文章來源:http://www.zghlxwxcb.cn/news/detail-799825.html
總結(jié)
現(xiàn)在那么的RCE漏洞,那些大佬是怎么探索出來的,思路是什么,有沒有0day大佬交個朋友!...我只能盡力追趕吧....文章來源地址http://www.zghlxwxcb.cn/news/detail-799825.html
到了這里,關(guān)于ThinkPHP5.0.0~5.0.23RCE 漏洞分析及挖掘思路的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!