Upload-labs 的学习笔记(Pass 06~12)

Cyber Security

这篇文章最后更新于 天前,文中描述的信息可能已经过时,请多加查证后再作参考。

image

介绍

upload-labs 是一个使用 php 语言编写的,专门收集渗透测试和 CTF 中遇到的各种上传漏洞的靶场。

下载链接:github.com/c0ny1/upload-labs

在本博客中使用到的工具:

第六题

请先确认您的 Pass-6 点击查看源码后源码中包含以下这段代码与否,如果与您的部分源码不一致,请尝试先查看其它题的题解。

1
2
3
4
5
6
$deny_ext = array(".php",".php5",".php4",".php3",".php2",".html",".htm",".phtml",".pht",".pHp",".pHp5",".pHp4",".pHp3",".pHp2",".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",".ini");
$file_name = trim($_FILES['upload_file']['name']);
$file_name = deldot($file_name);//删除文件名末尾的点
$file_ext = strrchr($file_name, '.');
$file_ext = str_ireplace('::$DATA', '', $file_ext);//去除字符串::$DATA
$file_ext = trim($file_ext); //首尾去空

如上,与第五题的区别是这里没有将文件名转换为小写,所以在将文件名改为不过滤的文件名扩展名即可成功上传,之后就可以从返回的数据中获取文件名,如下:

image

第七题

本题与第五题的区别是没有去空格,在文件名末尾加上空格即可,从返回的链接中获取文件地址。

image

第八题

本题没有删除文件名末尾的点,在文件名结尾加上 . 即可。

image

第九题

本题没有删除 ::$DATA,在文件名结尾加上 ::$DATA 即可。

image

在 Windows 环境下如果文件名的末尾存在 ::$DATA ,将会把::$DATA之后的数据当作文件流处理,本题就是利用这个特点绕过了文件上传检测。 1

第十题

和第五题的源码完全一致,解法参见上一篇博客

第十一题

本题是在文件名中不区分大小写地删除敏感扩展名,但只从头到尾删除了一次,所以可以加两个敏感扩展名绕过,如下:

image

第十二题

本题使用了 %00 截断这一操作系统层的漏洞,但该漏洞需要 php 版本小于 5.3.4 且 php 的 magic_quotes_gpcOFF 状态才能生效2 。所以有一定可能不成功。

由于本题的上传路径可以通过 HTTP GET 的参数控制,所以可以使用 %00 截断绕过,如下:

image

之后直接访问截断前的路径 ./upload/some.php 即可。

第十三题

本题使用了 %00 截断这一操作系统层的漏洞,但该漏洞需要 php 版本小于 5.3.4 且 php 的 magic_quotes_gpcOFF 状态才能生效2 。所以有一定可能不成功。

由于本题的上传路径是通过 HTTP POST 的参数控制的,并不会像上一题一样自动解码,所以需要我们自己把路径的最后一位改成 00 ,在 BurpSuite 中的操作如下:

image
image

把如上的 40 改为 00 后发送,之后直接访问截断前的路径 ./upload/some.php 即可。

参考资料

* 目前本文并未直接复制以下文章的内容

本文作者:Henrize Kim

文章链接: https://henrize.kim/article/bdc77d9fbdc6/

本文使用 CC BY-NC-SA 3.0 协议进行许可,使用时请注意遵守协议。