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