由Upload-labs的几关引发的思考
字数 1445 2025-08-26 22:11:51
Upload-labs 文件上传漏洞实战与思考
1. Windows 文件创建特性
1.1 .htaccess 文件创建问题
- 在 Windows 上直接创建
.htaccess文件会报错,因为系统将其视为无文件名的扩展名 - 解决方法:
- 方法一:创建
.htaccess.(Windows 会自动忽略最后的点) - 方法二:使用命令行
echo [内容] > .htaccess
- 方法一:创建
1.2 Windows 文件名处理特性
1.php.→ 弹窗后变为1.php1.php[空格]→ 直接变为1.php1.php[空格].→ 弹窗后变为1.php- 注意:过多特殊字符组合可能导致系统异常,需重启解决
2. Upload-labs 关卡分析
2.1 黑名单绕过技术
Pass-05:大小写绕过
- 源码缺少
strtolower()转换 - 构造后缀如
.phP即可绕过
Pass-06:空格绕过
- 源码缺少
trim()去空格 - 构造
ma.php[空格]绕过
Pass-07:点号绕过
- 源码缺少
deldot()删除末尾点 - 构造
ma.php.→ 系统处理后变为ma.php
Pass-09:路径拼接问题
- 直接使用原始文件名拼接路径
$img_path = UPLOAD_PATH.'/'.$file_name - 可利用 Windows 特性构造特殊文件名绕过
2.2 其他配置文件利用
.user.ini 文件
- 比
.htaccess适用范围更广(支持 Nginx/Apache/IIS 的 FastCGI PHP) - 可在目录下创建
.user.ini修改 PHP 配置 - 官方说明:PHP 会从执行文件目录向上扫描到 web 根目录
2.3 二次渲染绕过 (Pass-16)
源码分析
- 使用 GD 库函数 (
imagecreatefromjpeg/png/gif) 重新生成图片 - 上传文件先保存,然后进行二次渲染
绕过方法
- 使用专门工具生成绕过 GD 库渲染的图片马
- 经验:
- 选择稍大的图片成功率更高
- Shell 代码越短成功率越高
- 可尝试多张不同图片
- 可将 GD 处理后的图片再次处理上传
2.4 getimagesize 绕过 (Pass-14)
getimagesize()会验证图片有效性- 可结合 ImageMagick 特性绕过检测
- 参考:P牛博客《当ImageMagick遇上getimagesize》
3. 关键函数与过滤机制
3.1 常见过滤函数
$file_name = deldot($file_name); // 删除末尾点
$file_ext = strrchr($file_name, '.'); // 获取扩展名
$file_ext = strtolower($file_ext); // 转换为小写
$file_ext = str_ireplace('::$DATA', '', $file_ext); // 去除::$DATA
$file_ext = trim($file_ext); // 首尾去空
3.2 strrchr() 函数特性
- 从字符串最后出现的位置开始截取
- 影响特殊构造的文件名处理结果
3.3 magic_quotes_gpc 影响
- 开启时会对
%00等特殊字符添加反斜线 - 导致
%00截断攻击失效
4. 防御建议
- 使用白名单而非黑名单
- 严格处理文件名:去点、去空格、大小写统一
- 避免直接使用原始文件名拼接路径
- 对上传内容进行二次渲染或校验
- 禁用危险服务器配置(如
.htaccess、.user.ini执行) - 保持中间件和 PHP 版本更新
5. 参考资源
- Upload-labs 项目地址:https://github.com/c0ny1/upload-labs
- P牛博客:https://www.leavesongs.com/
- 绕过GD库渲染的WEBSHELL生成器
- 神秘的.user.ini文件解析