【代码审计】 一次新手级别入门的代码审计
字数 1605 2025-08-10 00:23:58
PHP代码审计入门教学文档
一、代码审计基础概念
1.1 什么是代码审计
代码审计是通过分析应用程序源代码来发现潜在安全漏洞的过程,主要目标是识别可能导致系统被攻击的编码缺陷。
1.2 PHP代码审计特点
- PHP作为动态语言,类型转换灵活,容易产生安全问题
- 常见漏洞类型:SQL注入、XSS、文件包含、文件上传、命令执行等
- 需特别注意用户输入处理、数据库操作、文件操作等关键点
二、PHP常见漏洞类型及审计方法
2.1 SQL注入漏洞
审计要点:
// 危险示例
$id = $_GET['id'];
$sql = "SELECT * FROM users WHERE id = $id";
// 安全示例
$id = intval($_GET['id']);
$sql = "SELECT * FROM users WHERE id = ".$id;
修复建议:
- 使用预处理语句(PDO/mysqli)
- 对输入进行严格过滤和类型转换
- 使用框架提供的安全查询方法
2.2 XSS(跨站脚本)漏洞
审计要点:
// 危险示例
echo $_GET['name'];
// 安全示例
echo htmlspecialchars($_GET['name'], ENT_QUOTES, 'UTF-8');
修复建议:
- 输出时使用htmlspecialchars()等函数转义
- 设置Content Security Policy(CSP)
- 使用模板引擎自动转义
2.3 文件包含漏洞
审计要点:
// 危险示例
include($_GET['page']);
// 安全示例
$allowed = ['home.php', 'about.php'];
if(in_array($_GET['page'], $allowed)) {
include($_GET['page']);
}
修复建议:
- 禁止动态包含用户可控参数
- 使用白名单限制包含文件
- 设置open_basedir限制文件访问范围
2.4 文件上传漏洞
审计要点:
// 危险示例
move_uploaded_file($_FILES['file']['tmp_name'], 'uploads/'.$_FILES['file']['name']);
// 安全示例
$ext = pathinfo($_FILES['file']['name'], PATHINFO_EXTENSION);
if(in_array($ext, ['jpg', 'png'])) {
$newName = md5(uniqid()).'.'.$ext;
move_uploaded_file($_FILES['file']['tmp_name'], 'uploads/'.$newName);
}
修复建议:
- 检查文件类型(MIME类型和扩展名)
- 重命名上传文件
- 设置上传目录不可执行
- 限制上传文件大小
2.5 命令执行漏洞
审计要点:
// 危险示例
system('ping '.$_GET['ip']);
// 安全示例
$ip = escapeshellarg($_GET['ip']);
system('ping '.$ip);
修复建议:
- 避免直接执行用户输入
- 使用escapeshellarg()等函数转义
- 考虑使用替代方案如PHP内置函数
三、代码审计实战技巧
3.1 审计流程
- 了解应用功能架构
- 定位用户输入点
- 跟踪数据处理流程
- 识别危险函数调用
- 验证漏洞可利用性
3.2 危险函数清单
| 漏洞类型 | 相关PHP函数 |
|---|---|
| SQL注入 | mysql_query, mysqli_query, PDO::query |
| 文件包含 | include, require, include_once, require_once |
| 命令执行 | system, exec, passthru, shell_exec, 反引号 |
| 文件操作 | file_get_contents, file_put_contents, fopen |
| 反序列化 | unserialize |
| XSS | echo, print, printf, die |
3.3 输入源追踪
重点关注以下超全局变量:
$_GET$_POST$_REQUEST$_COOKIE$_SERVER$_FILES
3.4 代码审计工具
-
静态分析工具:
- RIPS
- PHPStan
- Psalm
- SonarQube
-
动态分析工具:
- Burp Suite
- OWASP ZAP
-
辅助工具:
- grep (搜索特定函数调用)
- PHP内置函数get_defined_functions()
四、案例分析与实战
4.1 示例漏洞分析
// 示例1:SQL注入
$id = $_GET['id'];
$sql = "SELECT * FROM users WHERE id = $id";
$result = mysql_query($sql);
// 问题:直接拼接用户输入到SQL语句
// 修复:使用预处理语句或至少intval过滤
// 示例2:文件包含
$page = $_GET['page'];
include($page . '.php');
// 问题:可包含任意文件(如../../etc/passwd)
// 修复:使用白名单限制包含范围
4.2 实战练习
- 下载开源PHP项目
- 使用grep搜索危险函数
- 追踪用户输入流向
- 尝试构造攻击payload
- 验证漏洞存在性
- 提出修复方案
五、进阶审计技巧
5.1 框架审计
- 了解框架安全机制
- 检查框架配置是否正确
- 识别自定义代码中的安全问题
5.2 业务逻辑漏洞
- 权限绕过
- 支付逻辑缺陷
- 验证码绕过
- 并发竞争条件
5.3 二次漏洞
- 反序列化漏洞
- 文件操作竞争条件
- 缓存投毒
六、参考资料
- OWASP PHP安全指南
- PHP官方安全手册
- RIPS静态分析工具文档
- 常见PHP框架安全最佳实践
七、总结
PHP代码审计需要结合静态分析和动态测试,重点关注用户输入处理、危险函数调用和业务逻辑缺陷。通过系统化的审计流程和持续练习,可以有效提升代码审计能力。