代码审计-漏洞复现-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 环境搭建
- 获取环境:寻找并下载受影响的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提取数据库信息(需根据实际表结构调整字段数和查询语句)。ids=1) UNION SELECT 1,version(),3,4,user() -- - - 时间盲注:如果页面无回显,可尝试时间盲注。
ids=1) AND (SELECT SLEEP(5)) -- -
- 简单测试:将
- 执行验证:发送修改后的恶意请求,观察服务器的响应时间、返回内容或数据库状态变化,确认SQL注入漏洞是否存在并被成功利用。
4. 修复建议
- 参数化查询(预处理语句):这是根治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 如果是动态的,仍需安全处理(白名单校验) - 严格输入过滤:如果无法使用预处理,则必须对输入进行严格的过滤和校验。
- 对于
$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参数进行注入。
- 对于
- 最小权限原则:确保应用程序连接数据库的账户只拥有必要的权限(INSERT, SELECT on 特定表),避免使用root或高权限账户,以减轻漏洞被利用后的影响。
5. 总结与思考
CNVD-2025-21335是一个典型的后台SQL注入漏洞,其核心成因在于:
- 信任用户输入:未对用户可控的参数
ids进行任何验证和过滤。 - 字符串拼接SQL:直接使用字符串拼接方式构造SQL语句。
审计技巧:
- 在代码审计中,应重点关注所有与数据库交互的地方,特别是使用
$_GET,$_POST,$_REQUEST等超全局变量的地方。 - 查找
SELECT,INSERT,UPDATE,DELETE等SQL关键字,并追踪其变量的来源。 - “批量操作”、“导出”、“排序” 等功能点是SQL注入的高发区,应作为审计重点。
此漏洞复现过程清晰地展示了从漏洞信息收集、环境搭建、代码分析到实际利用的完整链条,是Web安全学习和代码审计的一个良好范例。