通过修改代码进行代码审计
字数 1617 2025-08-09 22:00:40
通过修改代码进行代码审计 - 详细教学文档
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 代码分析
// 示例代码段
if(is_uploaded_file($_FILES['file']['tmp_name'])){
// 处理上传文件
up_file(); // 自定义上传函数
}
4.3 关键发现
up_file()是自定义函数,需要进一步分析- 函数注释表明用于"处理上传后的图片信息"
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 关键发现
- 使用
$_FILES['file']['type']获取的是HTTP请求中的Content-Type - 仅检查
Content-Type而未验证实际文件内容 Content-Type可被客户端随意修改
5.4 漏洞原理
- 系统信任客户端提供的
Content-Type头 - 攻击者可上传PHP文件但将
Content-Type设置为image/jpg绕过检查
6. 漏洞利用
6.1 利用步骤
- 准备包含恶意代码的PHP文件
<?php phpinfo(); ?> - 使用Burp Suite拦截上传请求
- 修改
Content-Type为允许的类型(如image/jpg) - 放行请求完成上传
6.2 验证利用
- 访问上传的PHP文件
- 确认代码被执行(如显示phpinfo页面)
7. 修复建议
7.1 安全改进方案
- 不要信任客户端提供的
Content-Type - 使用服务器端检测文件真实类型:
$finfo = finfo_open(FILEINFO_MIME_TYPE); $mime = finfo_file($finfo, $_FILES['file']['tmp_name']); finfo_close($finfo); - 结合扩展名和白名单验证
7.2 其他防御措施
- 设置上传目录不可执行
- 重命名上传文件
- 限制上传文件大小
- 使用病毒扫描机制
8. 经验总结
- 不要轻易放弃:第一个分析点可能没有漏洞,需要坚持审计其他代码
- 修改代码辅助理解:通过修改输出、添加调试信息等方式深入理解代码逻辑
- 关注变量来源:区分客户端可控数据和服务器端生成数据
- 完整审计流程:从入口点到实际执行,跟踪整个数据处理流程
- 差异化发现:不同审计者可能发现不同的漏洞,保持独立思考
9. 扩展学习
- PHP文件上传机制:
$_FILES超全局变量结构 - 常见文件上传绕过技术:
- 扩展名绕过
- 内容欺骗
- 竞争条件
- 安全文件处理函数:
finfo_file()getimagesize()mime_content_type()
通过这种系统的代码审计方法,安全研究人员可以有效地发现和验证Web应用中的安全漏洞,提高代码审计能力和效率。