從入口點開始看
定義了很多常量,17行LIB==Lib文件夾
18行包含Lib/X.php
又設置了很多常量,包含了一系列配置文件
36行調用了路由,跟進
進來觸發構造方法,使$this->_default = site_config(),跟進
返回了一個數組,因此$this->_default = 返回的數組
之后又調用了view_controller函數,跟進
定義了$controller_arr = _fetch_url函數
然后如果$controller_arr為空的話,就會直接退出
79行檢查類的方法是否存在(以_Action結尾),如果存在的話,使用回調函數,不存在的話,返回err
該CMS還要注意.htaccess這個重定向文件:
這個文件的意思是:
$1基本上是從字符串的開頭和結尾捕獲的所有內容。換句話說,$1 = (.*)。
在我們的重寫中,^表示字符串的開始,(.*)說要匹配任何東西,而$表示字符串的結束。因此,基本上,它意味着從字符串開始到結束的所有內容,並將該值賦值為$1。
所以如果我輸入www.example.com/tacos-are-good,然后$1 = "tacos-are-good"。所以你的最終重寫將是www.example.com/index.php/tacos-are-good。
因此,由於這個重定向文件,我們無法訪問到www.example.com/tacos-are-good這個漏洞點,但我們可以使用burp抓包改包,不通過瀏覽器訪問來繞過。
下面來看漏洞點
漏洞點存在於err_Action函數中,首先給出payload:
/home/err/../../&ipconfig>robots.txt&/../lib/X_w160_h160.php
$ext截取了給出payload中的后4位,也就是.php
$url_arr以下划線為界將payload切割,變成一個數組: /home/err/../../&ipconfig>robots.txt/../lib/X _ w160 _ h160 .php
如果該數組長度小於2,就會推出,我們這里長度大於2
接下去寬為數組的鍵1,為160,高也為160
$noWaterMark為空,程序會在兩個160前面拼接_w和_h
$path會去匹配文件所在的文件夾,這里因為我們payload中最終的文件為X.php,因此$path=/lib
接下去,它的寬和高必須滿足它的白名單,否則會直接退出,payload中寬和高滿足
我們的payload滿足程序中的所有條件,因此會直接帶入exec函數命令執行。
payload: /home/err/../../&ipconfig>robots.txt&>/../lib/X_w160_h160.php
進入err函數后向上翻2層來到根目錄,將ipconfig的結果保存在robots.txt中