通过修改代码进行代码审计
字数 1617 2025-08-09 22:00:40

通过修改代码进行代码审计 - 详细教学文档

1. 前言

代码审计是发现软件漏洞的重要手段。本文以BeesCMS源码为例,详细讲解如何通过修改代码的方式进行有效的代码审计,帮助安全研究人员提高审计能力。

2. 环境准备

2.1 所需工具

  • PhpStudy:用于搭建本地PHP环境
  • Seay源代码审计系统:辅助代码审计工具
  • Burp Suite或类似抓包工具:用于分析HTTP请求

2.2 环境搭建步骤

  1. 下载BeesCMS源码(提取码:4534)
  2. 修改数据库配置文件中的密码为本地数据库密码
  3. 访问install目录完成安装
  4. 设置管理员账号密码

3. 代码审计方法论

3.1 审计流程

  1. 确定审计目标(如文件上传漏洞)
  2. 搜索关键函数和关键字
  3. 分析代码逻辑
  4. 修改代码辅助理解
  5. 验证漏洞存在性
  6. 开发利用方案

3.2 关键搜索技巧

  • 文件上传相关关键字:upload$_FILESmove_uploaded_file
  • 文件处理函数:pathinfo()is_uploaded_file()
  • 过滤函数:strtolower()in_array()

4. 第一次审计尝试

4.1 定位上传点

  1. 搜索$_FILES找到多个可能的上传处理文件
  2. 选择admin_pic_upload.php作为首个分析目标

4.2 代码分析

// 示例代码段
if(is_uploaded_file($_FILES['file']['tmp_name'])){
    // 处理上传文件
    up_file(); // 自定义上传函数
}

4.3 关键发现

  1. up_file()是自定义函数,需要进一步分析
  2. 函数注释表明用于"处理上传后的图片信息"

4.4 修改代码辅助理解

通过修改错误提示信息确认代码执行路径:

// 原代码
echo "上传文件失败";
// 修改为
echo "测试修改-上传文件失败";

4.5 过滤机制分析

$pic_name = pathinfo($_FILES['file']['name']);
$file_type = $pic_name['extension']; // 获取文件扩展名
$type = array('jpg','gif','png'); // 允许的类型

测试发现:

  • pathinfo()函数总是返回最后一个点之后的扩展名
  • 无法通过截断或特殊字符绕过

4.6 结论

该上传点有严格的扩展名检查,未发现可利用漏洞

5. 第二次审计尝试

5.1 选择新目标

分析admin_pic_upload.php中的另一个上传处理函数up_img()

5.2 代码分析

function up_img(){
    $type = array('jpg','gif','png'); // 允许的类型
    $pic_name = pathinfo($_FILES['file']['name']);
    $file_type = $_FILES['file']['type']; // 注意:这里获取的是Content-Type
    $file_type = strtolower($file_type);
    
    if(in_array($file_type, $type)){
        // 允许上传
    }
}

5.3 关键发现

  1. 使用$_FILES['file']['type']获取的是HTTP请求中的Content-Type
  2. 仅检查Content-Type而未验证实际文件内容
  3. Content-Type可被客户端随意修改

5.4 漏洞原理

  • 系统信任客户端提供的Content-Type
  • 攻击者可上传PHP文件但将Content-Type设置为image/jpg绕过检查

6. 漏洞利用

6.1 利用步骤

  1. 准备包含恶意代码的PHP文件
    <?php phpinfo(); ?>
    
  2. 使用Burp Suite拦截上传请求
  3. 修改Content-Type为允许的类型(如image/jpg
  4. 放行请求完成上传

6.2 验证利用

  1. 访问上传的PHP文件
  2. 确认代码被执行(如显示phpinfo页面)

7. 修复建议

7.1 安全改进方案

  1. 不要信任客户端提供的Content-Type
  2. 使用服务器端检测文件真实类型:
    $finfo = finfo_open(FILEINFO_MIME_TYPE);
    $mime = finfo_file($finfo, $_FILES['file']['tmp_name']);
    finfo_close($finfo);
    
  3. 结合扩展名和白名单验证

7.2 其他防御措施

  1. 设置上传目录不可执行
  2. 重命名上传文件
  3. 限制上传文件大小
  4. 使用病毒扫描机制

8. 经验总结

  1. 不要轻易放弃:第一个分析点可能没有漏洞,需要坚持审计其他代码
  2. 修改代码辅助理解:通过修改输出、添加调试信息等方式深入理解代码逻辑
  3. 关注变量来源:区分客户端可控数据和服务器端生成数据
  4. 完整审计流程:从入口点到实际执行,跟踪整个数据处理流程
  5. 差异化发现:不同审计者可能发现不同的漏洞,保持独立思考

9. 扩展学习

  1. PHP文件上传机制:$_FILES超全局变量结构
  2. 常见文件上传绕过技术:
    • 扩展名绕过
    • 内容欺骗
    • 竞争条件
  3. 安全文件处理函数:
    • finfo_file()
    • getimagesize()
    • mime_content_type()

通过这种系统的代码审计方法,安全研究人员可以有效地发现和验证Web应用中的安全漏洞,提高代码审计能力和效率。

通过修改代码进行代码审计 - 详细教学文档 1. 前言 代码审计是发现软件漏洞的重要手段。本文以BeesCMS源码为例,详细讲解如何通过修改代码的方式进行有效的代码审计,帮助安全研究人员提高审计能力。 2. 环境准备 2.1 所需工具 PhpStudy:用于搭建本地PHP环境 Seay源代码审计系统:辅助代码审计工具 Burp Suite或类似抓包工具:用于分析HTTP请求 2.2 环境搭建步骤 下载BeesCMS源码(提取码:4534) 修改数据库配置文件中的密码为本地数据库密码 访问 install 目录完成安装 设置管理员账号密码 3. 代码审计方法论 3.1 审计流程 确定审计目标(如文件上传漏洞) 搜索关键函数和关键字 分析代码逻辑 修改代码辅助理解 验证漏洞存在性 开发利用方案 3.2 关键搜索技巧 文件上传相关关键字: upload 、 $_FILES 、 move_uploaded_file 等 文件处理函数: pathinfo() 、 is_uploaded_file() 等 过滤函数: strtolower() 、 in_array() 等 4. 第一次审计尝试 4.1 定位上传点 搜索 $_FILES 找到多个可能的上传处理文件 选择 admin_pic_upload.php 作为首个分析目标 4.2 代码分析 4.3 关键发现 up_file() 是自定义函数,需要进一步分析 函数注释表明用于"处理上传后的图片信息" 4.4 修改代码辅助理解 通过修改错误提示信息确认代码执行路径: 4.5 过滤机制分析 测试发现: pathinfo() 函数总是返回最后一个点之后的扩展名 无法通过截断或特殊字符绕过 4.6 结论 该上传点有严格的扩展名检查,未发现可利用漏洞 5. 第二次审计尝试 5.1 选择新目标 分析 admin_pic_upload.php 中的另一个上传处理函数 up_img() 5.2 代码分析 5.3 关键发现 使用 $_FILES['file']['type'] 获取的是HTTP请求中的 Content-Type 仅检查 Content-Type 而未验证实际文件内容 Content-Type 可被客户端随意修改 5.4 漏洞原理 系统信任客户端提供的 Content-Type 头 攻击者可上传PHP文件但将 Content-Type 设置为 image/jpg 绕过检查 6. 漏洞利用 6.1 利用步骤 准备包含恶意代码的PHP文件 使用Burp Suite拦截上传请求 修改 Content-Type 为允许的类型(如 image/jpg ) 放行请求完成上传 6.2 验证利用 访问上传的PHP文件 确认代码被执行(如显示phpinfo页面) 7. 修复建议 7.1 安全改进方案 不要信任客户端提供的 Content-Type 使用服务器端检测文件真实类型: 结合扩展名和白名单验证 7.2 其他防御措施 设置上传目录不可执行 重命名上传文件 限制上传文件大小 使用病毒扫描机制 8. 经验总结 不要轻易放弃 :第一个分析点可能没有漏洞,需要坚持审计其他代码 修改代码辅助理解 :通过修改输出、添加调试信息等方式深入理解代码逻辑 关注变量来源 :区分客户端可控数据和服务器端生成数据 完整审计流程 :从入口点到实际执行,跟踪整个数据处理流程 差异化发现 :不同审计者可能发现不同的漏洞,保持独立思考 9. 扩展学习 PHP文件上传机制: $_FILES 超全局变量结构 常见文件上传绕过技术: 扩展名绕过 内容欺骗 竞争条件 安全文件处理函数: finfo_file() getimagesize() mime_content_type() 通过这种系统的代码审计方法,安全研究人员可以有效地发现和验证Web应用中的安全漏洞,提高代码审计能力和效率。