【代码审计】 一次新手级别入门的代码审计
字数 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 审计流程

  1. 了解应用功能架构
  2. 定位用户输入点
  3. 跟踪数据处理流程
  4. 识别危险函数调用
  5. 验证漏洞可利用性

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 代码审计工具

  1. 静态分析工具

    • RIPS
    • PHPStan
    • Psalm
    • SonarQube
  2. 动态分析工具

    • Burp Suite
    • OWASP ZAP
  3. 辅助工具

    • 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 实战练习

  1. 下载开源PHP项目
  2. 使用grep搜索危险函数
  3. 追踪用户输入流向
  4. 尝试构造攻击payload
  5. 验证漏洞存在性
  6. 提出修复方案

五、进阶审计技巧

5.1 框架审计

  • 了解框架安全机制
  • 检查框架配置是否正确
  • 识别自定义代码中的安全问题

5.2 业务逻辑漏洞

  • 权限绕过
  • 支付逻辑缺陷
  • 验证码绕过
  • 并发竞争条件

5.3 二次漏洞

  • 反序列化漏洞
  • 文件操作竞争条件
  • 缓存投毒

六、参考资料

  1. OWASP PHP安全指南
  2. PHP官方安全手册
  3. RIPS静态分析工具文档
  4. 常见PHP框架安全最佳实践

七、总结

PHP代码审计需要结合静态分析和动态测试,重点关注用户输入处理、危险函数调用和业务逻辑缺陷。通过系统化的审计流程和持续练习,可以有效提升代码审计能力。

PHP代码审计入门教学文档 一、代码审计基础概念 1.1 什么是代码审计 代码审计是通过分析应用程序源代码来发现潜在安全漏洞的过程,主要目标是识别可能导致系统被攻击的编码缺陷。 1.2 PHP代码审计特点 PHP作为动态语言,类型转换灵活,容易产生安全问题 常见漏洞类型:SQL注入、XSS、文件包含、文件上传、命令执行等 需特别注意用户输入处理、数据库操作、文件操作等关键点 二、PHP常见漏洞类型及审计方法 2.1 SQL注入漏洞 审计要点: 修复建议: 使用预处理语句(PDO/mysqli) 对输入进行严格过滤和类型转换 使用框架提供的安全查询方法 2.2 XSS(跨站脚本)漏洞 审计要点: 修复建议: 输出时使用htmlspecialchars()等函数转义 设置Content Security Policy(CSP) 使用模板引擎自动转义 2.3 文件包含漏洞 审计要点: 修复建议: 禁止动态包含用户可控参数 使用白名单限制包含文件 设置open_ basedir限制文件访问范围 2.4 文件上传漏洞 审计要点: 修复建议: 检查文件类型(MIME类型和扩展名) 重命名上传文件 设置上传目录不可执行 限制上传文件大小 2.5 命令执行漏洞 审计要点: 修复建议: 避免直接执行用户输入 使用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 示例漏洞分析 4.2 实战练习 下载开源PHP项目 使用grep搜索危险函数 追踪用户输入流向 尝试构造攻击payload 验证漏洞存在性 提出修复方案 五、进阶审计技巧 5.1 框架审计 了解框架安全机制 检查框架配置是否正确 识别自定义代码中的安全问题 5.2 业务逻辑漏洞 权限绕过 支付逻辑缺陷 验证码绕过 并发竞争条件 5.3 二次漏洞 反序列化漏洞 文件操作竞争条件 缓存投毒 六、参考资料 OWASP PHP安全指南 PHP官方安全手册 RIPS静态分析工具文档 常见PHP框架安全最佳实践 七、总结 PHP代码审计需要结合静态分析和动态测试,重点关注用户输入处理、危险函数调用和业务逻辑缺陷。通过系统化的审计流程和持续练习,可以有效提升代码审计能力。