Upload-labs 20关通关笔记
字数 2264 2025-08-26 22:11:15
Upload-labs 20关通关教学文档
概述
Upload-labs是一个使用PHP语言编写的专门收集渗透测试和CTF中遇到的各种上传漏洞的靶场,旨在帮助大家对上传漏洞有一个全面的了解。本教学文档详细解析了20关上传漏洞的绕过方法和技术要点。
环境要求
- PHP/5.6.27
- Apache/2.4.23
- Windows环境
各关详细解析
Pass-01: JS检查绕过
漏洞点:前端JavaScript验证文件类型
绕过方法:
- 禁用浏览器JavaScript
- 使用Burp Suite等工具修改上传包
- 直接修改前端HTML代码
Pass-02: Content-Type验证绕过
漏洞点:仅验证Content-Type
if (($_FILES['upload_file']['type'] == 'image/jpeg') || ($_FILES['upload_file']['type'] == 'image/png') || ($_FILES['upload_file']['type'] == 'image/gif'))
绕过方法:
- 抓包修改Content-Type为
image/jpeg、image/png或image/gif
Pass-03: 黑名单绕过
漏洞点:黑名单过滤不完整
$deny_ext = array('.asp','.aspx','.php','.jsp');
绕过方法:
- 上传
.phtml、.phps、.php5、.pht等后缀(需Apache配置支持) - 上传
.htaccess文件(需满足条件):- mod_rewrite模块开启
- AllowOverride All
- 文件内容:
<FilesMatch "shell.jpg"> SetHandler application/x-httpd-php </FilesMatch>
- 使用Apache解析漏洞
Pass-04: .htaccess绕过
漏洞点:黑名单未包含.htaccess
$deny_ext = array(".php",".php5",".php4",".php3",".php2","php1",".html",".htm",".phtml",".pht",".pHp",".pHp5",".pHp4",".pHp3",".pHp2","pHp1",".Html",".Htm",".pHtml",".jsp",".jspa",".jspx",".jsw",".jsv",".jspf",".jtml",".jSp",".jSpx",".jSpa",".jSw",".jSv",".jSpf",".jHtml",".asp",".aspx",".asa",".asax",".ascx",".ashx",".asmx",".cer",".aSp",".aSpx",".aSa",".aSax",".aScx",".aShx",".aSmx",".cEr",".sWf",".swf");
绕过方法:
- 上传
.htaccess文件
Pass-05: 大小写绕过
漏洞点:未将后缀转换为小写
绕过方法:
- 上传
.Php、.pHp等大小写混合后缀(仅Windows有效)
Pass-06: 空格绕过
漏洞点:未去除文件名末尾空格
绕过方法:
- 上传
.php(末尾带空格)
Pass-07: 点绕过
漏洞点:未去除文件名末尾点
绕过方法:
- 上传
.php.(末尾带点)
Pass-08: ::$DATA绕过
漏洞点:未处理NTFS备用数据流
绕过方法:
- 上传
.php::$DATA(仅Windows有效)
Pass-09: 点+空格+点绕过
漏洞点:move_upload_file直接使用用户可控文件名
绕过方法:
- 上传
.php. .(点+空格+点)
Pass-10: 双写绕过
漏洞点:敏感后缀替换为空
绕过方法:
- 上传
.pphphp(双写绕过)
Pass-11: 00截断(CVE-2015-2348)
漏洞点:move_uploaded_file中的save_path可控
影响版本:
- 5.4.x <= 5.4.39
- 5.5.x <= 5.5.23
- 5.6.x <= 5.6.7
绕过方法:
- 使用00截断:
/file.php\x00.jpg
Pass-12: POST型00截断
绕过方法:
- 同Pass-11,但使用POST方式
Pass-13-16: 图片马绕过
Pass-13: unpack检测
检测方式:读取文件前2字节判断类型
绕过方法:
- 制作图片马:
copy smi1e.jpg /b + shell.php /a shell.jpg
Pass-14: getimagesize()检测
绕过方法:
- 同Pass-13
Pass-15: exif_imagetype()检测
绕过方法:
- 同Pass-13
Pass-16: 二次渲染绕过
检测方式:使用imagecreatefromgif/jpeg/png进行二次渲染
绕过方法:
- 对于GIF:找到渲染前后不变的位置插入PHP代码
- 对于JPG/PNG:参考先知社区文章(https://xz.aliyun.com/t/2657)
Pass-17: 条件竞争
漏洞点:先保存文件再检查后缀
if(move_uploaded_file($temp_file, $upload_file)){
if(in_array($file_ext,$ext_arr)){
// 重命名
}else{
unlink($upload_file);
}
}
绕过方法:
- 利用条件竞争:在文件保存后但未删除前访问执行
- 使用Burp Suite不断发送上传包和请求包
Pass-18: 条件竞争(高级)
漏洞点:move操作在rename之前
绕过方法:
- 同Pass-17,利用move和rename之间的时间差
Pass-19: /.绕过
漏洞点:move_uploaded_file会忽略文件末尾的/.
绕过方法:
- 构造文件名如
smi1e.php/. - 也可使用00截断
Pass-20: 数组+/.绕过
漏洞点:文件名处理逻辑缺陷
$file_name = reset($file) . '.' . $file[count($file) - 1];
绕过方法:
- 构造数组形式文件名:
- $file[0] = 'smi1e.php/'
- $file[2] = 'jpg'
- 最终生成
smi1e.php/.,move_uploaded_file忽略/.后上传smi1e.php
解析漏洞总结
-
Apache解析漏洞:
- 文件名如
test.php.xxx可能被解析为PHP - 多后缀名解析顺序问题
- 文件名如
-
IIS解析漏洞:
- 目录解析:
/xx.asp/xx.jpg - 文件名解析:
xx.asp;.jpg - 畸形解析:
xx.jpg/.php
- 目录解析:
-
Nginx解析漏洞:
- 文件名逻辑漏洞:
xx.jpg%00.php - 配置错误导致的解析漏洞
- 文件名逻辑漏洞:
防御建议
- 使用白名单而非黑名单
- 严格检查文件类型(MIME、文件头等)
- 重命名上传文件
- 限制上传目录执行权限
- 使用随机文件名
- 对上传文件进行二次渲染
- 设置合理的文件大小限制
- 及时更新服务器软件修补已知漏洞
后记
通过这20关的实践,可以全面掌握各种文件上传漏洞的利用和防御方法。在实际渗透测试中,需要根据目标环境灵活组合使用这些技术。