代码审计 xxxdisk前台Getshell
字数 1300 2025-08-27 12:33:31
XXXDISK网盘系统前台Getshell漏洞分析与利用
0x00 漏洞概述
XXXDISK网盘系统存在一个无需登录的前台Getshell漏洞,该漏洞组合利用了Windows NTFS ADS流文件上传绕过、权限绕过和宽字节注入等多个安全问题,最终可实现远程代码执行。
0x01 受影响版本
- 系统版本:XXXDISK网盘系统GBK版本(通过查看返回包的charset确认)
- 平台:Windows系统(利用NTFS ADS特性)
0x02 漏洞分析
1. Windows文件上传绕过
系统使用黑名单机制限制上传文件类型,关键函数get_real_ext通过filter_extension对后缀进行修改添加.txt防止解析。但存在以下问题:
- 可通过Windows NTFS ADS流特性绕过:构造文件名如
1.php::$DATA - 文件上传函数位于
modules/upload.inc.php - 文件真实名称采用强随机生成机制
2. 权限绕过问题
在mydisk.php中,虽然调用了phpdisk_core::user_login()进行认证,但认证失败仅返回302跳转,未执行exit,导致可以无授权访问上传功能。
3. 宽字节注入漏洞
系统存在多处宽字节注入点,其中关键一处位于ajax.php:
$file = unserialize(base64_decode($data)); // $data用户可控
$db->query_unbuffered(is_utf8() ? $sql : iconv('utf-8','gbk',$sql)); // 编码转换导致注入
这是一个INSERT型注入,存在回显,无需盲注。
0x03 漏洞利用链
完整的利用流程如下:
-
未授权文件上传:
- 直接访问上传接口绕过认证
- 利用NTFS ADS流特性上传恶意文件
-
获取上传文件信息:
- 通过宽字节注入获取文件真实名称
- 需要将文件属性
in_share设置为1以获取回显 - 使用
file_name或file_description字段作为回显位
-
获取文件ID:
- 方法1:如果有账号,上传测试文件获取file_id后减1
- 方法2:爆破file_id(实际测试中速度较快)
-
最终Getshell:
- 通过注入获取真实文件名
- 访问上传的Webshell文件
0x04 详细利用步骤
1. 构造恶意文件上传
使用NTFS ADS流特性构造上传请求:
文件名: shell.php::$DATA
文件内容: <?php phpinfo();?>
2. 宽字节注入Payload
构造注入Payload获取上传文件信息:
# 设置in_share=1使文件可被查看
# 利用file_description字段回显数据
[构造特定的INSERT语句注入]
3. 获取文件ID
通过以下方式之一:
- 注册测试账号上传文件获取基准file_id
- 爆破可能的file_id范围
4. 访问Webshell
通过注入获取的真实文件名访问Webshell:
http://target.com/uploads/[随机文件名].php
0x05 防御建议
-
文件上传修复:
- 使用白名单机制替代黑名单
- 彻底禁止特殊字符文件名
- 在非Windows服务器上部署
-
权限修复:
- 认证失败后立即退出程序
- 添加CSRF防护
-
SQL注入修复:
- 使用预编译语句
- 统一编码处理
- 严格过滤反序列化输入
0x06 总结
该漏洞利用链展示了如何组合多个中低危漏洞实现高危攻击。关键点包括:
- Windows NTFS ADS流特性绕过
- 认证逻辑缺陷导致的未授权访问
- 宽字节注入获取关键信息
- 完整的攻击链构造思路
此案例也说明了安全防御需要全面考虑,单一防护措施往往不足以阻挡攻击者的组合攻击手法。