TheCarProject CMS SQl注入
字数 1283 2025-08-29 08:32:09

TheCarProject CMS SQL注入漏洞分析与防御指南

漏洞概述

TheCarProject CMS存在一个严重的SQL注入漏洞,攻击者可以通过构造恶意请求获取数据库敏感信息。该漏洞位于cp/info.php文件中,由于未对用户输入的car_id参数进行过滤和验证,导致攻击者可以执行任意SQL语句。

漏洞细节分析

漏洞位置

  • 文件路径: /TheCarProject/cp/info.php
  • 受影响参数: man_idcar_id(GET方式传递)

漏洞成因

  1. 代码直接接收用户输入的car_id参数并赋值给$motor_id变量
  2. 将未经过滤的$motor_id直接拼接到SQL查询语句中
  3. 未使用单引号、双引号或反引号对参数进行包裹
  4. 未对参数进行任何消毒处理

漏洞验证POC

http://localhost/TheCarProject/cp/info.php?man_id=3&car_id=-1 or 1=1 and (SELECT 1 and ROW(1,1)>(SELECT COUNT(*),CONCAT(CHAR(95),CHAR(33),CHAR(64),CHAR(52),CHAR(100),CHAR(105),CHAR(108),CHAR(101),CHAR(109),CHAR(109),CHAR(97),0x3a,FLOOR(RAND(0)*2))x FROM INFORMATION_SCHEMA.COLLATIONS GROUP BY x)a)

POC解析

  1. 这是一个基于报错的SQL注入攻击
  2. 使用FLOOR(RAND(0)*2)生成011011...序列
  3. 通过GROUP BY操作触发临时表主键重复错误
  4. 错误信息中包含数据库版本等敏感信息

技术原理

  1. ROW函数:MySQL中的ROW函数用于构造行比较,ROW(1,1)表示比较两列值
  2. 报错注入机制:利用临时表中主键值重复的错误来泄露信息
  3. CONCAT函数:将多个字符串连接成一个字符串,其中包含ASCII编码的字符

漏洞利用流程

  1. 识别注入点:car_id参数未过滤
  2. 判断注入类型:数字型注入(无需引号闭合)
  3. 构造恶意SQL语句
  4. 通过错误信息获取数据库信息
  5. 利用回显点获取数据(smtp_info.php接收数据)

代码审计要点

  1. 检查info.php文件中$motor_id变量的使用
  2. 查找所有将$motor_id拼接到SQL语句的位置(共3处)
  3. 确认数据回显点:通过mysqli_fetch_array获取结果并输出到隐藏表单
  4. 跟踪数据流向:$cpr_image_single变量最终提交到smtp_info.php

修复方案

代码修复建议

if(isset($_GET['car_id'])) {
    // 使用mysqli_real_escape_string过滤
    $motor_id = mysqli_real_escape_string($_GET['car_id']);
    
    // 或者使用PDO预处理
    // $motor_id = PDO::quote($_GET['car_id']);
    ......
}

全面防护措施

  1. 输入验证

    • car_id进行类型检查(应为数字)
    • 设置参数取值范围限制
  2. 输出编码

    • 从数据库读取数据时也应进行过滤处理
    • 防止二次注入攻击
  3. 编码设置

    • 避免使用GBK等可能导致宽字节注入的编码
  4. 其他建议

    • 使用预处理语句(PDO或MySQLi)
    • 实施最小权限原则
    • 启用Web应用防火墙(WAF)

总结与经验

  1. 该漏洞是典型的数字型SQL注入案例
  2. 漏洞触发链较短,但危害严重
  3. 修复时应从输入验证和输出编码两方面入手
  4. 代码审计时需关注所有用户输入点的处理
  5. 安全开发应遵循"不信任任何用户输入"的原则

扩展学习

  1. MySQL行构造函数:深入理解ROW()函数的比较机制
  2. 报错注入技术:研究不同类型的报错注入方法
  3. 防御技术:学习参数化查询、ORM等安全编码实践
  4. 自动化检测:了解sqlmap等工具如何检测和利用此类漏洞

通过分析这个漏洞,我们可以更深入地理解SQL注入的原理、利用方式和防御方法,为今后的安全审计和开发工作提供参考。

TheCarProject CMS SQL注入漏洞分析与防御指南 漏洞概述 TheCarProject CMS存在一个严重的SQL注入漏洞,攻击者可以通过构造恶意请求获取数据库敏感信息。该漏洞位于 cp/info.php 文件中,由于未对用户输入的 car_id 参数进行过滤和验证,导致攻击者可以执行任意SQL语句。 漏洞细节分析 漏洞位置 文件路径: /TheCarProject/cp/info.php 受影响参数: man_id 和 car_id (GET方式传递) 漏洞成因 代码直接接收用户输入的 car_id 参数并赋值给 $motor_id 变量 将未经过滤的 $motor_id 直接拼接到SQL查询语句中 未使用单引号、双引号或反引号对参数进行包裹 未对参数进行任何消毒处理 漏洞验证POC POC解析 这是一个基于报错的SQL注入攻击 使用 FLOOR(RAND(0)*2) 生成011011...序列 通过 GROUP BY 操作触发临时表主键重复错误 错误信息中包含数据库版本等敏感信息 技术原理 ROW函数 :MySQL中的ROW函数用于构造行比较, ROW(1,1) 表示比较两列值 报错注入机制 :利用临时表中主键值重复的错误来泄露信息 CONCAT函数 :将多个字符串连接成一个字符串,其中包含ASCII编码的字符 漏洞利用流程 识别注入点: car_id 参数未过滤 判断注入类型:数字型注入(无需引号闭合) 构造恶意SQL语句 通过错误信息获取数据库信息 利用回显点获取数据( smtp_info.php 接收数据) 代码审计要点 检查 info.php 文件中 $motor_id 变量的使用 查找所有将 $motor_id 拼接到SQL语句的位置(共3处) 确认数据回显点:通过 mysqli_fetch_array 获取结果并输出到隐藏表单 跟踪数据流向: $cpr_image_single 变量最终提交到 smtp_info.php 修复方案 代码修复建议 全面防护措施 输入验证 : 对 car_id 进行类型检查(应为数字) 设置参数取值范围限制 输出编码 : 从数据库读取数据时也应进行过滤处理 防止二次注入攻击 编码设置 : 避免使用GBK等可能导致宽字节注入的编码 其他建议 : 使用预处理语句(PDO或MySQLi) 实施最小权限原则 启用Web应用防火墙(WAF) 总结与经验 该漏洞是典型的数字型SQL注入案例 漏洞触发链较短,但危害严重 修复时应从输入验证和输出编码两方面入手 代码审计时需关注所有用户输入点的处理 安全开发应遵循"不信任任何用户输入"的原则 扩展学习 MySQL行构造函数 :深入理解ROW()函数的比较机制 报错注入技术 :研究不同类型的报错注入方法 防御技术 :学习参数化查询、ORM等安全编码实践 自动化检测 :了解sqlmap等工具如何检测和利用此类漏洞 通过分析这个漏洞,我们可以更深入地理解SQL注入的原理、利用方式和防御方法,为今后的安全审计和开发工作提供参考。