代码审计-漏洞复现-CNVD-2025-21335
字数 2399 2025-10-01 14:05:45

代码审计与漏洞复现教学文档

CNVD-2025-21335 SQL注入漏洞分析

1. 漏洞信息概览

  • 漏洞编号:CNVD-2025-21335
  • 漏洞类型:SQL注入 (SQL Injection)
  • 漏洞等级:高危
  • 受影响版本:某CMS(具体名称在源链接中被模糊化处理)1.24版本之前
  • 漏洞文件/app/admin/controller/Images.php
  • 漏洞函数batchCope 方法
  • 利用条件:需要获取后台管理员权限(可获得后台登录凭证)

2. 漏洞原理深度分析

2.1 漏洞代码定位

漏洞存在于后台管理模块的图片控制器(Images.php)中的batchCope方法。该方法的目的是实现一个“批量复制”图片的功能。

2.2 漏洞代码详解

核心问题在于对用户输入的参数未经过任何安全过滤和校验,直接拼接至SQL语句中。

有问题的代码逻辑(伪代码表示):

public function batchCope() {
    // 直接从POST请求中获取'ids'参数,未做任何过滤(如:intval转换、正则匹配、预处理)
    $ids = $_POST['ids']; 

    // 假设从请求中获取了其他字段,如'fields'
    $fields = $_POST['fields']; 

    // 直接进行字符串拼接,构建SQL语句
    $sql = "INSERT INTO fox_images (" . $fields . ") 
            SELECT " . $fields . " 
            FROM fox_images 
            WHERE id in (" . $ids . ")"; // $ids 直接嵌入到IN子句中

    // 执行该SQL语句
    $result = db_query($sql);
    // ... 后续操作 ...
}

2.3 SQL语句结构与攻击面

生成的最终SQL语句形态如下:

INSERT INTO fox_images (field1, field2, ...) 
SELECT field1, field2, ... 
FROM fox_images 
WHERE id in (恶意构造的$ids参数);
  • 本意:从fox_images表中查询出指定id(通过$ids提供)的记录,然后将这些记录的部分字段(通过$fields指定)复制并插入到同一张表中,生成新记录。
  • 漏洞点$ids参数完全可控。攻击者可以提交非正常的ID值,而是一段恶意的SQL代码,这些代码会被直接拼接到IN子句里执行。

2.4 漏洞利用方式

由于$ids被直接拼接,攻击者可以闭合原有的括号,并利用联合查询(UNION SELECT)、布尔盲注、时间盲注等技术进行数据库信息窃取。
例如,正常请求ids=1,2,3,而攻击者可构造ids=1) OR 1=1 UNION SELECT 1,user(),password,4 FROM admin_users -- -,从而将插入操作转变为数据查询操作。

3. 漏洞复现过程

3.1 环境搭建

  1. 获取环境:寻找并下载受影响的CMS版本(1.24之前)。若无法找到确切版本,可下载最新版本,并根据漏洞描述逆向定位到/app/admin/controller/Images.php文件中的batchCope方法,手动删除或回滚官方已实施的安全补丁代码(通常是对$ids参数的过滤代码),以模拟漏洞环境。
  2. 安装部署:按照该CMS的安装说明进行部署,确保能正常访问前台和后台。
  3. 后台登录:使用已知的或默认的后台账户(如文档中提到的 admin / admin@123)登录系统。此步骤是必要前提,因为漏洞存在于后台功能中。

3.2 漏洞触发点寻找

  1. 登录后台后,根据代码路径/app/admin/controller/Images.php可知,功能大概率与“图片管理”相关。
  2. 在后台管理界面中寻找诸如“图片列表”、“管理图片”等功能的菜单项。
  3. 在该功能页面中,寻找“复制”、“批量复制”等操作按钮或功能链接。其最终发起的请求URL应与/admin/images/batchCope类似。

3.3 漏洞验证与利用

  1. 抓取请求:在图片管理页面,选择任意图片(或多个图片),点击“复制”或“批量复制”按钮,同时使用Burp Suite或浏览器开发者工具等抓包工具拦截该HTTP请求。
  2. 分析请求:观察拦截到的POST请求,应会发现包含ids参数(如ids=1ids=1,2,3)。
  3. 构造Payload:修改ids参数,注入SQL测试Payload。
    • 简单测试:将ids修改为 1) OR (1=1 观察页面响应是否与正常时不同(如复制成功记录数异常增多)。或将ids修改为 1) OR (1=2 观察响应是否与正常不同(如复制成功记录数减少)。这可用于初步判断布尔盲注的可能性。
    • 联合查询注入:构造更复杂的Payload,利用UNION SELECT提取数据库信息(需根据实际表结构调整字段数和查询语句)。
      ids=1) UNION SELECT 1,version(),3,4,user() -- -
      
    • 时间盲注:如果页面无回显,可尝试时间盲注。
      ids=1) AND (SELECT SLEEP(5)) -- -
      
  4. 执行验证:发送修改后的恶意请求,观察服务器的响应时间、返回内容或数据库状态变化,确认SQL注入漏洞是否存在并被成功利用。

4. 修复建议

  1. 参数化查询(预处理语句):这是根治SQL注入的最佳方法。修改代码,使用PDO或MySQLi扩展提供的预处理功能。
    // PDO 示例
    $stmt = $pdo->prepare("INSERT INTO fox_images ($fields) SELECT $fields FROM fox_images WHERE id in (:ids)");
    $stmt->execute([':ids' => $ids]);
    // 注意:$fields 如果是动态的,仍需安全处理(白名单校验)
    
  2. 严格输入过滤:如果无法使用预处理,则必须对输入进行严格的过滤和校验。
    • 对于$ids:应强制其为逗号分隔的整数字符串。可以使用explode分割后,对每个值进行intval转换,再重新拼接。
      $idArray = explode(',', $_POST['ids']);
      $safeIds = array();
      foreach ($idArray as $id) {
          $safeIds[] = intval(trim($id));
      }
      $ids = implode(',', $safeIds); // 现在 $ids 是安全的,如 "1,2,3"
      
    • 对于$fields:应采用白名单机制,只允许预定义的、安全的字段名列表,防止通过fields参数进行注入。
  3. 最小权限原则:确保应用程序连接数据库的账户只拥有必要的权限(INSERT, SELECT on 特定表),避免使用root或高权限账户,以减轻漏洞被利用后的影响。

5. 总结与思考

CNVD-2025-21335是一个典型的后台SQL注入漏洞,其核心成因在于:

  • 信任用户输入:未对用户可控的参数ids进行任何验证和过滤。
  • 字符串拼接SQL:直接使用字符串拼接方式构造SQL语句。

审计技巧

  • 在代码审计中,应重点关注所有与数据库交互的地方,特别是使用$_GET, $_POST, $_REQUEST等超全局变量的地方。
  • 查找SELECT, INSERT, UPDATE, DELETE等SQL关键字,并追踪其变量的来源。
  • “批量操作”“导出”“排序” 等功能点是SQL注入的高发区,应作为审计重点。

此漏洞复现过程清晰地展示了从漏洞信息收集、环境搭建、代码分析到实际利用的完整链条,是Web安全学习和代码审计的一个良好范例。

代码审计与漏洞复现教学文档 CNVD-2025-21335 SQL注入漏洞分析 1. 漏洞信息概览 漏洞编号 :CNVD-2025-21335 漏洞类型 :SQL注入 (SQL Injection) 漏洞等级 :高危 受影响版本 :某CMS(具体名称在源链接中被模糊化处理)1.24版本之前 漏洞文件 : /app/admin/controller/Images.php 漏洞函数 : batchCope 方法 利用条件 :需要获取后台管理员权限(可获得后台登录凭证) 2. 漏洞原理深度分析 2.1 漏洞代码定位 漏洞存在于后台管理模块的图片控制器( Images.php )中的 batchCope 方法。该方法的目的是实现一个“批量复制”图片的功能。 2.2 漏洞代码详解 核心问题在于对用户输入的参数未经过任何安全过滤和校验,直接拼接至SQL语句中。 有问题的代码逻辑(伪代码表示): 2.3 SQL语句结构与攻击面 生成的最终SQL语句形态如下: 本意 :从 fox_images 表中查询出指定 id (通过 $ids 提供)的记录,然后将这些记录的部分字段(通过 $fields 指定)复制并插入到同一张表中,生成新记录。 漏洞点 : $ids 参数完全可控。攻击者可以提交非正常的ID值,而是一段恶意的SQL代码,这些代码会被直接拼接到 IN 子句里执行。 2.4 漏洞利用方式 由于 $ids 被直接拼接,攻击者可以闭合原有的括号,并利用联合查询(UNION SELECT)、布尔盲注、时间盲注等技术进行数据库信息窃取。 例如,正常请求 ids=1,2,3 ,而攻击者可构造 ids=1) OR 1=1 UNION SELECT 1,user(),password,4 FROM admin_users -- - ,从而将插入操作转变为数据查询操作。 3. 漏洞复现过程 3.1 环境搭建 获取环境 :寻找并下载受影响的CMS版本(1.24之前)。若无法找到确切版本,可下载最新版本,并根据漏洞描述逆向定位到 /app/admin/controller/Images.php 文件中的 batchCope 方法, 手动删除或回滚 官方已实施的安全补丁代码(通常是对 $ids 参数的过滤代码),以模拟漏洞环境。 安装部署 :按照该CMS的安装说明进行部署,确保能正常访问前台和后台。 后台登录 :使用已知的或默认的后台账户(如文档中提到的 admin / admin@123 )登录系统。 此步骤是必要前提 ,因为漏洞存在于后台功能中。 3.2 漏洞触发点寻找 登录后台后,根据代码路径 /app/admin/controller/Images.php 可知,功能大概率与“图片管理”相关。 在后台管理界面中寻找诸如“图片列表”、“管理图片”等功能的菜单项。 在该功能页面中,寻找“复制”、“批量复制”等操作按钮或功能链接。其最终发起的请求URL应与 /admin/images/batchCope 类似。 3.3 漏洞验证与利用 抓取请求 :在图片管理页面,选择任意图片(或多个图片),点击“复制”或“批量复制”按钮,同时使用 Burp Suite 或浏览器开发者工具等抓包工具拦截该HTTP请求。 分析请求 :观察拦截到的POST请求,应会发现包含 ids 参数(如 ids=1 或 ids=1,2,3 )。 构造Payload :修改 ids 参数,注入SQL测试Payload。 简单测试 :将 ids 修改为 1) OR (1=1 观察页面响应是否与正常时不同(如复制成功记录数异常增多)。或将 ids 修改为 1) OR (1=2 观察响应是否与正常不同(如复制成功记录数减少)。这可用于初步判断布尔盲注的可能性。 联合查询注入 :构造更复杂的Payload,利用 UNION SELECT 提取数据库信息(需根据实际表结构调整字段数和查询语句)。 时间盲注 :如果页面无回显,可尝试时间盲注。 执行验证 :发送修改后的恶意请求,观察服务器的响应时间、返回内容或数据库状态变化,确认SQL注入漏洞是否存在并被成功利用。 4. 修复建议 参数化查询(预处理语句) :这是根治SQL注入的最佳方法。修改代码,使用PDO或MySQLi扩展提供的预处理功能。 严格输入过滤 :如果无法使用预处理,则必须对输入进行严格的过滤和校验。 对于 $ids :应强制其为逗号分隔的整数字符串。可以使用 explode 分割后,对每个值进行 intval 转换,再重新拼接。 对于 $fields :应采用 白名单 机制,只允许预定义的、安全的字段名列表,防止通过 fields 参数进行注入。 最小权限原则 :确保应用程序连接数据库的账户只拥有必要的权限(INSERT, SELECT on 特定表),避免使用root或高权限账户,以减轻漏洞被利用后的影响。 5. 总结与思考 CNVD-2025-21335是一个典型的后台SQL注入漏洞,其核心成因在于: 信任用户输入 :未对用户可控的参数 ids 进行任何验证和过滤。 字符串拼接SQL :直接使用字符串拼接方式构造SQL语句。 审计技巧 : 在代码审计中,应重点关注所有与数据库交互的地方,特别是使用 $_GET , $_POST , $_REQUEST 等超全局变量的地方。 查找 SELECT , INSERT , UPDATE , DELETE 等SQL关键字,并追踪其变量的来源。 “批量操作” 、 “导出” 、 “排序” 等功能点是SQL注入的高发区,应作为审计重点。 此漏洞复现过程清晰地展示了从漏洞信息收集、环境搭建、代码分析到实际利用的完整链条,是Web安全学习和代码审计的一个良好范例。