记一次详细的代码审计
字数 1348 2025-08-09 22:00:37

代码审计实战:从零开始的SQL注入漏洞挖掘与分析

一、环境准备与初步观察

  1. 目标系统:一个小型CMS系统
  2. 搭建环境:本地搭建,已知数据库账号密码
  3. 初步观察
    • 系统有登录框,但常见业务安全漏洞测试无效
    • 网上无公开漏洞信息(使用人数少)

二、审计工具准备

  1. MySQL监控插件:用于实时查看系统执行的SQL语句
  2. 代码编辑器:支持全局搜索功能
  3. 抓包工具:Burp Suite

三、SQL注入漏洞挖掘过程

1. 监控SQL执行

  • 刷新页面后观察到以下SQL语句:

    SELECT * FROM dd WHERE ip='127.0.0.1'
    
  • 关键发现:

    • 127.0.0.1是变量值
    • 变量名称为ip

2. 代码追踪

第一步:查找SQL语句来源

  • 全局搜索select关键词 → 无结果
  • 全局搜索ip → 无有用信息

第二步:考虑文件包含

  • 检查首页文件发现包含两个文件
  • 全局搜索特定SQL语句SELECT *FROM 'dd WHERE 'ip'
  • 发现该语句在php/function.php文件中定义

第三步:定位关键函数

  • php/function.php中找到ywdd函数:
    function ywdd() {
        $ip = getip();
        // 执行SQL语句
        SELECT * FROM dd WHERE ip='$ip'
    }
    

第四步:追踪IP获取函数

  • 查找getip函数定义(在/php/function.php中)

  • 关键代码:

    function getip() {
        $realip = $_SERVER['HTTP_X_FORWARDED_FOR'];
        return $realip;
    }
    
  • 漏洞点:

    • 直接使用HTTP_X_FORWARDED_FOR头部的值
    • 未进行任何过滤处理

四、漏洞验证

  1. 使用Burp Suite修改请求

    • 添加头部:X-Forwarded-For: 8.8.8.8
    • 发送请求后观察到SQL语句中的IP变为8.8.8.8
  2. 确认漏洞

    • 由于无过滤,可构造恶意SQL注入payload

五、漏洞利用

  1. 探测表结构

    • 使用order by确定列数 → 发现5个列
  2. 信息收集

    • 构造SQL语句获取:
      • 数据库名
      • 数据库版本
      • 当前用户

六、漏洞修复建议

  1. 输入过滤

    • HTTP_X_FORWARDED_FOR进行严格过滤
    • 使用正则表达式验证IP格式
  2. 参数化查询

    $stmt = $pdo->prepare("SELECT * FROM dd WHERE ip = ?");
    $stmt->execute([$ip]);
    
  3. 防御深度

    • 使用PDO或MySQLi扩展
    • 开启PHP的魔术引号(不推荐作为唯一防御)
    • 使用Web应用防火墙(WAF)

七、代码审计经验总结

  1. 审计技巧

    • 关注用户输入点(如HTTP头部、GET/POST参数、Cookie等)
    • 追踪数据流:从输入点到最终使用点
    • 重点检查数据库操作相关函数
  2. 常见危险函数

    • 数据库查询:mysql_query(), mysqli_query()
    • 命令执行:system(), exec(), passthru()
    • 文件操作:fopen(), file_get_contents()
  3. 学习建议

    • 不必死记所有函数,掌握快速查找方法
    • 通过实际案例学习比单纯理论学习更有效
    • 建立自己的漏洞模式识别库

八、扩展思考

  1. 其他可能的攻击向量

    • 通过该注入点进行盲注
    • 尝试联合查询获取其他表数据
    • 尝试写文件或执行系统命令
  2. 自动化审计思路

    • 使用静态分析工具扫描危险函数
    • 建立数据流追踪规则
    • 结合动态分析验证漏洞
  3. 防御体系构建

    • 输入验证
    • 输出编码
    • 最小权限原则
    • 安全编码规范

通过这个案例,我们完整展示了从环境搭建、漏洞挖掘、代码分析到最终验证的整个代码审计流程,重点强调了数据流追踪和输入验证的重要性。

代码审计实战:从零开始的SQL注入漏洞挖掘与分析 一、环境准备与初步观察 目标系统 :一个小型CMS系统 搭建环境 :本地搭建,已知数据库账号密码 初步观察 : 系统有登录框,但常见业务安全漏洞测试无效 网上无公开漏洞信息(使用人数少) 二、审计工具准备 MySQL监控插件 :用于实时查看系统执行的SQL语句 代码编辑器 :支持全局搜索功能 抓包工具 :Burp Suite 三、SQL注入漏洞挖掘过程 1. 监控SQL执行 刷新页面后观察到以下SQL语句: 关键发现: 127.0.0.1 是变量值 变量名称为 ip 2. 代码追踪 第一步:查找SQL语句来源 全局搜索 select 关键词 → 无结果 全局搜索 ip → 无有用信息 第二步:考虑文件包含 检查首页文件发现包含两个文件 全局搜索特定SQL语句 SELECT *FROM 'dd WHERE 'ip' 发现该语句在 php/function.php 文件中定义 第三步:定位关键函数 在 php/function.php 中找到 ywdd 函数: 第四步:追踪IP获取函数 查找 getip 函数定义(在 /php/function.php 中) 关键代码: 漏洞点: 直接使用 HTTP_X_FORWARDED_FOR 头部的值 未进行任何过滤处理 四、漏洞验证 使用Burp Suite修改请求 : 添加头部: X-Forwarded-For: 8.8.8.8 发送请求后观察到SQL语句中的IP变为 8.8.8.8 确认漏洞 : 由于无过滤,可构造恶意SQL注入payload 五、漏洞利用 探测表结构 : 使用 order by 确定列数 → 发现5个列 信息收集 : 构造SQL语句获取: 数据库名 数据库版本 当前用户 六、漏洞修复建议 输入过滤 : 对 HTTP_X_FORWARDED_FOR 进行严格过滤 使用正则表达式验证IP格式 参数化查询 : 防御深度 : 使用PDO或MySQLi扩展 开启PHP的魔术引号(不推荐作为唯一防御) 使用Web应用防火墙(WAF) 七、代码审计经验总结 审计技巧 : 关注用户输入点(如HTTP头部、GET/POST参数、Cookie等) 追踪数据流:从输入点到最终使用点 重点检查数据库操作相关函数 常见危险函数 : 数据库查询: mysql_query() , mysqli_query() 命令执行: system() , exec() , passthru() 文件操作: fopen() , file_get_contents() 学习建议 : 不必死记所有函数,掌握快速查找方法 通过实际案例学习比单纯理论学习更有效 建立自己的漏洞模式识别库 八、扩展思考 其他可能的攻击向量 : 通过该注入点进行盲注 尝试联合查询获取其他表数据 尝试写文件或执行系统命令 自动化审计思路 : 使用静态分析工具扫描危险函数 建立数据流追踪规则 结合动态分析验证漏洞 防御体系构建 : 输入验证 输出编码 最小权限原则 安全编码规范 通过这个案例,我们完整展示了从环境搭建、漏洞挖掘、代码分析到最终验证的整个代码审计流程,重点强调了数据流追踪和输入验证的重要性。