桃花笑之zzzphp1.6.1代碼審計

0x00

1、 首先全局搜索危險函數eval:在zzz_template.php中存在該函數的調用。
在這裏插入圖片描述
詳細看一下這個函數的內容:
在這裏插入圖片描述
在類ParserTemplate中,並且調用parserCommon函數時可以觸發函數。
在這裏插入圖片描述
2、 首先分析parserIfLabel函數,要如何才能觸發:單獨把函數copy出來分析在這裏插入圖片描述
首先24行,根據eval的字符串的拼接方式,查看什麼樣的$ifstr可以達到getshell的條件:
在這裏插入圖片描述
在這裏插入圖片描述
根據測試,如上可以使得整個字符串變成正確的php代碼。
之後分析代碼邏輯,如何構造$content,可以使得經過正則表達式匹配後的$content剛好是上面那個亞子。
我選擇把正則表達式拷貝出來,然後利用匹配網站實時匹配,最後構造字符串:{if:1){}phpinfo();//};{end if}
在這裏插入圖片描述
將字符串賦值$content時,經過preg_match_all()函數之後出現了一丟丟問題,藉助xdebug修改的到最後的字符串:{if:1);phpinfo();//}{end if}可以成功getshell;
在這裏插入圖片描述
在這裏插入圖片描述
3、 找到可以getshell的點之後,就要考慮如何觸發這個函數了。上面我們看到函數是存在ParserTemplate類當中,通過parserCommon函數可以調用,限制我們可以全局搜索一下這兩個關鍵字:
在這裏插入圖片描述
在這裏插入圖片描述
全局共有兩處調用:zzz_client.php和save.php。

0x01 zzz_client.php

在第122行調用函數。
在這裏插入圖片描述
分析一下如何能夠使程序運行到122行。
在這裏插入圖片描述
當$location變量爲user的時候可以進入,$location變量來源於getlocation函數。
在這裏插入圖片描述
進入getlocation函數
在這裏插入圖片描述
再跟進getform函數:
在這裏插入圖片描述
根據代碼就是獲取get傳遞的location參數值。那我們debug調試一下:(zzz_client.php被前臺index.php包含調用)
在這裏插入圖片描述
在55行獲取模板地址:
在這裏插入圖片描述
由於在88行之後檢查登錄狀況,模板地址被重新賦值了:此時的模板地址:
/zzzphpV1.6.1/template/pc/cn2016/html/userlogin.html
在這裏插入圖片描述
然後我們去後臺查找這個模板,發現不存在,利用失敗:
在這裏插入圖片描述
當我們登錄之後:
在這裏插入圖片描述
加載了userinfo.html模板。現在我們將之前測試的$content內容插入userinfo.html
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
成功getshell。

0x02 save.php

現在來看看save.php處,這個函數有多處都可以調用parserCommon函數,我記錄一下我成功getshell的一處位置:
在925行調用了parserCommon函數,看一下如何才能調用這個create_index函數
在這裏插入圖片描述
搜索發現存在兩處調用:
在這裏插入圖片描述
此處觸發要求$type=“index”或者”all“
之後要調用create_index要先調用create_html,要調用create_html要使$act=createhtml
在這裏插入圖片描述
接下來先構造:http://www.zzzcms.com/admin/save.php?act=createhtml&type=index
發現最後顯示模板不存在:

在這裏插入圖片描述
跟蹤之後發現還要傳遞模板路徑參數:
在這裏插入圖片描述
修改url: http://www.zzzcms.com/admin/save.php?act=createhtml&type=index&folder=pc
在這裏插入圖片描述
加載了index.html,我們還是要修改模板中index.html的內容,然後成功getshell:
在這裏插入圖片描述在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章