thinkphp v5.1.29 遠程代碼執行漏洞
v5.1.30更改位置為
可以單步跟一下,然后大概可以發現是判斷path路徑方向的,找一些分析報告發現主要漏洞點在thinkphp/library/think/Request.php中,具體漏洞在於開發者留下的這個參數
跟着這個參數跳轉,可以看到進入pathinfo函數,效果是獲得當前請求URL的pathinfo后綴
大概邏輯基本是判斷當前get是否有這個參數,如果有就把值傳給$pathinfo,然后銷毀get變量,當我們傳入http://localhost/tp5.1/html/public/index.php/?s=index/zzj\zzj
然后繼續走,發現調用這個pathinfo函數的是path函數
因此我們對於path的返回值this->path是可控的,而調用其的是app.php 583行的routecheck函數,這是個路由檢測,而path澤被傳遞給了check函數
check里面存在路由判斷,即開啟了強制路由則會出現不匹配線則,則會throw
正常must是不開啟的,而我們傳遞來的path參數變成了$url參數,參與了UrlDispath的實例化操作,而在進入check函數之前,就可以發現強制將第一個/變成了|
繼續看urldispatch的實例化函數
url被賦值給了dispatch函數,然后check相關函數結束,調用了init(),其中調用了parseUrl函數
然后將當前的url進行解析
然后調用parseurlpath函數
根據代碼和結果,簡單判斷基本上就是將|轉換回/,然后將其按照/進行切分,切分成數組保存
然后就是各種賦值,最后調用Module Dispatch的init()函數,將dispatch也就是剛才得到的數組賦值給了result
然后繼續跟,他會進行一個簡單的判斷,判斷你第一個參數是否存在,官方存在的demo是index,然后將參數傳給this->controller
調用了controller函數,其中name參數是我們可以控制的
將name參數傳遞到parsemoduleandclass函數中
代碼大概意思就是如果我們傳遞的參數name存在反斜杠,則直接賦值給class並返回,因此可以通過控制操作類的實例化過程來實現代碼執行漏洞
嘗試實例化app類
app類中不存在index方法,但是漏洞已經出現,可以用命名空間的方式來調用任意方法的任意類
thinkphp中存在file類,write方法
因此可以借助這個類實現shell的寫入