upload-labs总计20关

下载地址:GitHub - c0ny1/upload-labs: 一个想帮你总结所有类型的上传漏洞的靶场

Pass-01(前端JS验证)

1.网页关闭JavaScript

前端通过JS验证,并弹出提示

关闭JS

2.burpsuite抓包修改文件名

选择上传文件为jpg类型

burpsuite抓包修改文件名

上传成功

Pass-02(后端判断文件类型)

提示:检查文件类型

抓包修改文件类型

Pass-03.Apache配置

黑名单禁止上传php文件。

Apache添加配置,让其他文件也能被解析成php文件

AddType application/x-httpd-php .php .php3 .phtml

AddType application是将指定的后缀名以特定的方式解析

配置文件中添加这段代码,这样.php3和.phtml的后缀,服务器会以php文件解析,但是 Apache没有这个默认配置,一般搭建网站时也不会添加这样的配置。

访问php3类型文件

Pass-04.使用.htaccess文件

大量的黑名单

.htaccess 文件是 Apache Web 服务器中的一个配置文件,用于对特定目录及其子目录进行配置。

每次请求时都会被读取和解析,可能影响服务器性能。 (所以不用重启服务器)

.htaccess 文件可以覆盖 httpd.conf 中的部分配置,但需要 AllowOverride 指令的支持。

在特定目录下允许.htaccess起作用

添加配置使png文件被解析成php文件

但现在网页大量使用白名单,.htaccess直接上传不了

Pass-05.大小写绕过

Windows不区分大小写,Linux严格区分

strrchr() 函数查找字符串在另一个字符串中最后一次出现的位置,并返回从该位置到字符串结尾的所有字符。

str_ireplace() 函数替换字符串中的一些字符(不区分大小写)。

Pass-06.空格绕过

没有trim()函数

windows文件名末尾会忽略空格,所以不能直接修改文件名,通过抓包修改

Pass-07.点绕过

$file_ext = strrchr($file_name, '.');、

由于这样获取后缀名,在末尾加点后,此时的$file_ext ="."

windows会直接删除末尾的点,继续抓包修改

Pass-08.::$DATA绕过

没有去除::$DATA

windows文件名不能包含冒号,所以继续抓包修改

上传成功

Pass-09.删除逻辑绕过

之前几关的过滤都有,但是可以通过逻辑漏洞

先删除点,最后删除空格,所以在后缀名后面添加'. .'(点空格点)

Pass-10.双写绕过

使用替换函数,将后缀名替换为空,最后使用替换过的后缀名,可以双写后缀名绕过。

Pass-11.%00截断

上传表单中的save_path是可控的

在代码中,save_path是用来控制文件上传路径的,所以可以控制文件名。

%00 是 URL 编码的空字符(Null Character),在编程中常用作字符串终止符。

$_GET['save_path']后面拼接的字符串全部被截断了,此时,$img_path = $_GET['save_path']。

修改save_path,既修改了文件名称,也修改了上传路径,方便在服务器中找到文件。

%00截断漏洞在php5.2版本中有用,高版本无效。

Pass-12.post%00截断

POST提交不能用url编码去提交了

方法一:将%00用url解码上传

方法二:用十六进制修改

在test12.php后面加空格,再将空格20修改成00

选中\n,查看源码,可以看到test12.php后面有\0

Pass-13.图片马

  • unpack() 函数:

    • unpack() 是 PHP 中用于将二进制字符串解包为数组的函数。

    • 它根据指定的格式字符串解析二进制数据,并返回一个关联数组。

  • 格式字符串 "C2chars"

    • C:表示无符号字符(unsigned char),占用 1 个字节,取值范围为 0 到 255。

    • 2:表示提取 2 个字节。

    • chars:是返回数组中的键名前缀。提取的两个字节会分别存储在 chars1chars2 中。

总之,这里是判断文件的前两个字节类判断文件类型,我们在图片文件的末尾添加php代码即可(添加完成后,图片必须能打开)

1.可以手动添加php代码

2.也可以通过cmd命令添加

使用cmd命令来添加,可能会失败几次,需要多次换图片尝试

使用文件包含漏洞访问png

前提allow_url_include开启(5.2版本以上默认为off)

文件包含漏洞中的include,会将所有的文件以php文件来解析。

Pass-14.图片马(getimagesize)

通过isImage来获取文件类型,getimagesize() 会读取文件的前几个字节(通常是前 8-16 字节),并根据文件头的特征判断文件类型。

继续上传图片马

Pass-15.图片马(exif_imagetype)

exif_imagetype也是通过文件的前几个字节来判断文件类型的

继续图片马

Pass-16.图片马(imagecreatefromjpeg图片渲染)

imagecreatefromjpeg()会将上传的图片渲染,导致图片内容被打乱,添加的php代码也可能会随之打乱。

下载一个gif图片并上传

对比上传前后两个图像的数据区别,在没有打乱的地方添加php代码。

在00字符处添加php代码,并上传修改过的代码

访问成功。

Pass-17.条件竞争

代码逻辑有问题,先上传了文件,再判断文件类型,可以利用这个极短的空档期去访问php文件,让其在其他目录生成php文件。

抓两个数据包

第一个数据包用来上传文件

第二个数据包用来访问上传的php文件

Payload设置为NULL payloads,发送文件的包次数可以设置为Continue indefinitely(不限次数发包),访问文件的次数设置为3000次

可以看到,在某段时间里,成功次数很高(不用Add $也能成功)

Pass-18. 图片马条件竞争

代码有个小问题,导致文件不能上传到upload目录下,在$dir后面加一个斜杠

这里是先检查后缀名后上传,所以要传图片马。

上传完以后再重命名,所以可以利用空档期访问图片马。

上传文件包

 访问php文件包

像17关一样抓包attack就行了

文件长度很长,说明访问成功了

Pass-19.修改后缀绕过

pathinfo()在这里会获取文件的后缀名,用5,6,7,8关的大小写,空格,点号,::$DATA都可以绕过

补充:

上传文件的函数move_uploaded_file()会忽略文件名最后面的"/.",所以这样也能绕过

Pass-20.上传数组绕过

这一关需要分析一下代码

$file = empty($_POST['save_name']) ? $_FILES['upload_file']['name'] : $_POST['save_name'];
                if (!is_array($file)) {
                    $file = explode('.', strtolower($file)); //分割字符串
                }

                $ext = end($file);
                $allow_suffix = array('jpg','png','gif');
                if (!in_array($ext, $allow_suffix)) {
                    $msg = "禁止上传该后缀文件!";
                }else{
                    $file_name = reset($file) . '.' . $file[count($file) - 1];
                    $temp_file = $_FILES['upload_file']['tmp_name'];
                    $img_path = UPLOAD_PATH . '/' .$file_name;
                    if (move_uploaded_file($temp_file, $img_path)) {
                        $msg = "文件上传成功!";
                        $is_upload = true;
                    } else {
                        $msg = "文件上传失败!";
                    }

save_name以数组的形式上传

如果是数组就不分割$file。正常上传$file是一个字符串,用点号分割,这样能获得一个数组,第一位是文件名,第二位是后缀名

end()函数取数组的最后一位,$ext这里获得上传数组中的jpg。正常上传这里会是后缀名

reset($file)获取数组的第一个元素,也就是upload-20.php

数组中有两个元素,所以count($flie)的值是2,那count($file) - 1的值是1,$file[count($file) - 1]获取数组[1]位置的值,而$file[1]的值是NULL,所以$file_name的值由文件名和点号拼接形成。

正常上传,$file[count($file) - 1]是获取文件的后缀名,这里由于数组中有NULL,所以不会获取到后缀名。

上传路径:

补充:如果有数组元素没有填充,计算数组大小时不会被计算。如图,count的返回值是2。

总结:

1-4关

前端验证,修改文件类型,apache配置绕过,.htaccess文件绕过,这些算是很早期的漏洞,现在几乎不会碰到这样反常识的漏洞了。

5-10关

利用了Windows的特性,使用大小写,空格,点号,$DATA号,以及使用双写绕过,5-9关的内容仅用于Windows场景下。

11-12关

%00阶段,存在于php5.2版本及以下,现在也过时了,但是其中的思想还是值得学习。

13-16关

图片马上传,通过文件的前几个字节判断文件类型,在图片的结尾加上php代码,注意图片仍能打开。但是还要配合文件上传漏洞,否则无法起作用。

16关对图片做了渲染,打乱了图片的内容,需要对比上传前后的图片,在没有改变的位置上添加php代码。GIF的文件格式比较宽松,容易成功,JPG和PNG的文件格式复杂一点,较难成功。

17-18关

条件竞争,逻辑漏洞,在现在的代码中也有存在的可能性。

19关

与利用Windows特性关卡一致

20关

利用上传数组,和代码的逻辑漏洞。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值