thinkphp v5.1.29 任意代碼執行漏洞分析


thinkphp v5.1.29 遠程代碼執行漏洞

v5.1.30更改位置為

image-20210407131705716

可以單步跟一下,然后大概可以發現是判斷path路徑方向的,找一些分析報告發現主要漏洞點在thinkphp/library/think/Request.php中,具體漏洞在於開發者留下的這個參數

image-20210407131848602

跟着這個參數跳轉,可以看到進入pathinfo函數,效果是獲得當前請求URL的pathinfo后綴

image-20210407131936192

大概邏輯基本是判斷當前get是否有這個參數,如果有就把值傳給$pathinfo,然后銷毀get變量,當我們傳入http://localhost/tp5.1/html/public/index.php/?s=index/zzj\zzj

image-20210407132542305

然后繼續走,發現調用這個pathinfo函數的是path函數

image-20210407132706787

因此我們對於path的返回值this->path是可控的,而調用其的是app.php 583行的routecheck函數,這是個路由檢測,而path澤被傳遞給了check函數

image-20210407132926537

check里面存在路由判斷,即開啟了強制路由則會出現不匹配線則,則會throw

image-20210407133035868

正常must是不開啟的,而我們傳遞來的path參數變成了$url參數,參與了UrlDispath的實例化操作,而在進入check函數之前,就可以發現強制將第一個/變成了|

image-20210407133240534

繼續看urldispatch的實例化函數

image-20210407133643042

url被賦值給了dispatch函數,然后check相關函數結束,調用了init(),其中調用了parseUrl函數

image-20210407133744191

然后將當前的url進行解析

image-20210407133809242

然后調用parseurlpath函數

image-20210407133901974

根據代碼和結果,簡單判斷基本上就是將|轉換回/,然后將其按照/進行切分,切分成數組保存

然后就是各種賦值,最后調用Module Dispatch的init()函數,將dispatch也就是剛才得到的數組賦值給了result

然后繼續跟,他會進行一個簡單的判斷,判斷你第一個參數是否存在,官方存在的demo是index,然后將參數傳給this->controller

image-20210407140301916

image-20210407140952823

調用了controller函數,其中name參數是我們可以控制的

image-20210407141030050

將name參數傳遞到parsemoduleandclass函數中

image-20210407141317299

代碼大概意思就是如果我們傳遞的參數name存在反斜杠,則直接賦值給class並返回,因此可以通過控制操作類的實例化過程來實現代碼執行漏洞

嘗試實例化app類

image-20210407141610320

app類中不存在index方法,但是漏洞已經出現,可以用命名空間的方式來調用任意方法的任意類

thinkphp中存在file類,write方法

image-20210407141828922

因此可以借助這個類實現shell的寫入

payload:http://localhost/tp5.1/html/public/index.php/?s=/index/\think\template\driver\file/write?cacheFile=shell.php&content=<?php phpinfo();

image-20210407142047880


免責聲明!

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



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