靶场部署在 VMware - Win7。
靶场地址:https://github.com/c0ny1/upload-labs
部分题目可能需要白盒审计。
::$DATA
与双写绕过。::$DATA
绕过。%00
截断绕过,GET 方式。%00
截断绕过,POST 方式。编写一句话木马并更改后缀为 .jpg。之后的实验都基于这个木马。
echo 'Hello!';
@eval($_POST['hello']);
?>
相关文章:
《一句话木马@eval($_POST[“cmd“]);是什么意思》:
https://blog.csdn.net/qq_62708558/article/details/123030828
任何前端验证都是纸老虎。
上传时使用 burp 拦截,并将文件后缀修改回 .php。
上传成功,右键查看文件地址。
木马已成功执行。
尝试蚁剑连接,成功。
上传文件并进行后缀与 Content-Type 绕过。
上传成功。
MIME-Type,资源媒体类型。
MIME(Multipurpose Internet Mail Extensions),多功能网际邮件扩充协议。
常见的 MIME 类型:
之前的方法均失败。不过仍然是黑名单过滤。
由于靶场部署在 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。
除此以外,服务端对不合法的后缀名进行替换为空是常用手段。
这一题使用 .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
已知在靶场服务器的上传文件保存目录下存在 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
上传检测基于黑名单,尝试使用大小写绕过。抓包修改,后缀名部分字母大写。
之后复制链接访问即可。
对于文件名,Windows 系统对大小写不敏感。Linux 系统默认对大小写敏感,如需修改则需要特殊配置。
使用空格绕过。
抓包修改后缀名,在文件名最后加上一个空格。
之后访问即可。
Windows 下 x.jpg【空格】 或者 xx.jpg. 这两类文件是不允许存在的。
如果这样命名,系统在保存时会默认去除末尾的空格和点。
使用点绕过。在文件名最后加上一个点。
上传成功。
Windows 下 x.jpg【空格】 或者 xx.jpg. 这两类文件是不允许存在的。
如果这样命名,系统在保存时会默认去除末尾的空格和点。
原理与 Pass-03 相同,::$DATA
绕过。
点空格点绕过(利用验证规则不完善)。
双写绕过。
服务端对不合法的后缀名进行替换为空是常用手段。
这题通过代码审计可以发现发现 $img_path
变量可控。
使用 %00
截断,让后面的代码不执行。
%00
截断:
与 Pass-12 一样,$img_path
变量依旧可控,但是使用 POST 传送。
POST 传送的数据不需要编码,也就是说数据不会自动解码,此时需要使用 burp 解码。
为山者,基于一篑之土,以成千丈之峭;凿井者,起于三寸之坎,以就万仞之深。
——《刘子》(北齐)刘子