浅谈代码审计
字数 1551 2025-08-03 16:50:47

代码审计全面指南

一、代码审计基础概念

1.1 代码审计定义

代码审计是通过分析应用程序源代码,寻找安全漏洞的过程。主要针对原生PHP和MVC框架进行审计。

1.2 学习前提

  • 需要掌握PHP基础,至少到面向对象水平
  • 推荐学习资源:
    • 云之梦PHP项目教程
    • 李小双代码审计课程(B站:BV1QJ411z714)

二、代码审计方法论

2.1 审计方法分类

  1. 逆向追踪/回溯变量

    • 检查参数是否可控
    • 分析过滤机制(是否全局过滤)
    • 搜索敏感关键词定向挖掘
  2. 正向追踪/跟踪变量

    • 查找接收外部参数的文件
    • 跟踪变量传递过程
  3. 功能点漏洞挖掘

    • 基于黑盒测试经验判断
    • 结合功能点分析
  4. 通读全文

    • 了解程序架构
    • 分析函数集文件、配置文件(config)、安全过滤文件(filter/check)

2.2 审计工具推荐

  1. Xdebug:用于代码调试和分析
    • 安装参考:https://www.cnblogs.com/linqingvoe/p/10907672.html
  2. Seay源代码审计系统:定位危险函数
  3. RIPS:PHP代码审计工具

三、常见漏洞审计技巧

3.1 SQL注入漏洞

关键点:

  • 检查SQL语句拼接处
  • 追踪变量来源(GET/POST/COOKIE等)
  • 分析过滤函数是否完备

典型案例:

  1. 二次编码注入
$id = mysql_real_escape_string($_GET['id']); 
$id = urldecode($id); // 可绕过,使用%2527(%27的二次编码)
  1. 过滤函数分析
  • htmlspecialchars需注意第二个参数:
    • ENT_COMPAT:只转换双引号
    • ENT_QUOTES:转换双引号和单引号
    • ENT_NOQUOTES:不转换任何引号
  1. 字符串替换绕过
$string = str_replace('{','',$string); 
// 可输入%2{7,替换后变为%27(单引号)

3.2 文件包含漏洞

危险函数:

  • require()
  • require_once()
  • include()
  • include_once()

截断方法(PHP5.3前有效):

  1. %00截断(受GPC限制)
  2. 多个点截断(Windows需240个点)
  3. 远程包含时使用?伪截断

3.3 XSS漏洞

类型:

  1. 反射型
echo $_GET['name']; 
echo $_SERVER['HTTP_REFERER'];
  1. 存储型
  • 关注留言板、评论功能
  • 检查入库和出库时的过滤

3.4 文件上传漏洞

关键函数:

move_upload_file

绕过技巧:

  1. 黑名单不完整

    • 尝试php3/php4/php5/phtml等后缀
    • 利用解析漏洞(IIS/Nginx)
  2. Content-Type验证绕过

    • 修改上传包的Content-Type
  3. 程序逻辑缺陷

<script>alert("文件不合法")</script> 
// 仅弹窗未终止程序,文件仍上传
  1. pathinfo绕过
$basename = pathinfo('1.php/.', PATHINFO_EXTENSION); // 返回空

3.5 命令执行漏洞

危险函数:

  • system()
  • exec()
  • shell_exec()
  • passthru()
  • popen()
  • proc_popen()

审计要点:

  • 检查参数是否可控
  • 分析调用链和包含关系

3.6 文件删除漏洞

关键函数:

unlink()

审计要点:

  • 检查路径控制
  • 注意../等目录遍历
  • 关注.lock文件删除可能导致重装漏洞

四、MVC框架审计要点

4.1 MVC架构理解

  • Model(模型)
  • View(视图)
  • Controller(控制器)

4.2 审计重点

  1. 路由分析

    • 理解URL路由机制
    • 参数传递方式差异
  2. 参数接收方式

    • 可能是$_GET或框架特有方法(如input)
  3. 数据库内核分析

    • 使用Xdebug跟踪SQL构建过程
    • 检查过滤机制是否完备

4.3 数据库内核审计示例

$result = model('sort')->find("id=$id");
// 跟踪find方法,检查where条件是否过滤

五、实用建议

  1. 不要害怕代码审计:耐心分析每个功能点
  2. 使用Xdebug:有效跟踪变量和调用链
  3. 关注过滤函数:分析其实现和限制
  4. 理解业务逻辑:结合功能点分析潜在风险
  5. 保持学习:跟进新的漏洞类型和绕过技术

六、资源推荐

  1. 学习资源

    • 云之梦PHP项目教程
    • 李小双代码审计课程(B站)
  2. 工具

    • Xdebug
    • Seay源代码审计系统
    • RIPS
  3. 实践平台

    • 漏洞靶场
    • 开源项目审计
代码审计全面指南 一、代码审计基础概念 1.1 代码审计定义 代码审计是通过分析应用程序源代码,寻找安全漏洞的过程。主要针对原生PHP和MVC框架进行审计。 1.2 学习前提 需要掌握PHP基础,至少到面向对象水平 推荐学习资源: 云之梦PHP项目教程 李小双代码审计课程(B站:BV1QJ411z714) 二、代码审计方法论 2.1 审计方法分类 逆向追踪/回溯变量 : 检查参数是否可控 分析过滤机制(是否全局过滤) 搜索敏感关键词定向挖掘 正向追踪/跟踪变量 : 查找接收外部参数的文件 跟踪变量传递过程 功能点漏洞挖掘 : 基于黑盒测试经验判断 结合功能点分析 通读全文 : 了解程序架构 分析函数集文件、配置文件(config)、安全过滤文件(filter/check) 2.2 审计工具推荐 Xdebug :用于代码调试和分析 安装参考:https://www.cnblogs.com/linqingvoe/p/10907672.html Seay源代码审计系统 :定位危险函数 RIPS :PHP代码审计工具 三、常见漏洞审计技巧 3.1 SQL注入漏洞 关键点: 检查SQL语句拼接处 追踪变量来源(GET/POST/COOKIE等) 分析过滤函数是否完备 典型案例: 二次编码注入 : 过滤函数分析 : htmlspecialchars 需注意第二个参数: ENT_COMPAT :只转换双引号 ENT_QUOTES :转换双引号和单引号 ENT_NOQUOTES :不转换任何引号 字符串替换绕过 : 3.2 文件包含漏洞 危险函数: require() require_once() include() include_once() 截断方法(PHP5.3前有效): %00 截断(受GPC限制) 多个点截断(Windows需240个点) 远程包含时使用 ? 伪截断 3.3 XSS漏洞 类型: 反射型 : 存储型 : 关注留言板、评论功能 检查入库和出库时的过滤 3.4 文件上传漏洞 关键函数: move_upload_file 绕过技巧: 黑名单不完整 : 尝试php3/php4/php5/phtml等后缀 利用解析漏洞(IIS/Nginx) Content-Type验证绕过 : 修改上传包的Content-Type 程序逻辑缺陷 : pathinfo绕过 : 3.5 命令执行漏洞 危险函数: system() exec() shell_exec() passthru() popen() proc_popen() 审计要点: 检查参数是否可控 分析调用链和包含关系 3.6 文件删除漏洞 关键函数: unlink() 审计要点: 检查路径控制 注意 ../ 等目录遍历 关注 .lock 文件删除可能导致重装漏洞 四、MVC框架审计要点 4.1 MVC架构理解 Model(模型) View(视图) Controller(控制器) 4.2 审计重点 路由分析 : 理解URL路由机制 参数传递方式差异 参数接收方式 : 可能是 $_GET 或框架特有方法(如 input ) 数据库内核分析 : 使用Xdebug跟踪SQL构建过程 检查过滤机制是否完备 4.3 数据库内核审计示例 五、实用建议 不要害怕代码审计 :耐心分析每个功能点 使用Xdebug :有效跟踪变量和调用链 关注过滤函数 :分析其实现和限制 理解业务逻辑 :结合功能点分析潜在风险 保持学习 :跟进新的漏洞类型和绕过技术 六、资源推荐 学习资源 : 云之梦PHP项目教程 李小双代码审计课程(B站) 工具 : Xdebug Seay源代码审计系统 RIPS 实践平台 : 漏洞靶场 开源项目审计