upload-labs

pass01 js检查

js前端验证

通过抓包,更改文件后缀可以绕过

pass02 Cotent-type

mimi

上传1.php 抓包,将Content-Type:改为Content-Type: image/jpeg

pass03 黑名单验证

尝试phtml,php3,php4, php5, pht后缀名绕过

但是前提是要在配置文件里面有这样的一句话

1
AddType application/x-httpd-php .php .phtml .phps .php5 .pht

pass04 黑名单验证.haccess

.htaccess文件

pass05 黑名单验证 xxx.php. .

pass06 XX.PHP

pass07

没有首尾去空.php后加空格绕过

pass08

没有删除文件名末尾的点,.php后加.绕过

pass09

  1. ::$DATA绕过

应用场景:Windows平台,没有使用str_ireplace()::$DATA替换为空,导致可以利用NTFS文件流特性。

利用方式:

假设xxx.php的内容为<?php phpinfo();?>

上传的文件名 服务器表面现象 生成的文件内容
xxx.php:a.jpg 没成功 生成xxx.php
xxx.php::$DATA 生成xxx.php <?php phpinfo();?>
xxx.php::$INDEX_ALLOCATION 生成xxx.php文件夹
xxx.php::$DATA.jpg 生成0.jpg <?php phpinfo();?>
xxx.php::$DATA\aaa.jpg 生成aaa.jpg <?php phpinfo();?>

这里,我们上传一个名为xxx.php::$DATA的木马,然后,在浏览器中访问xxx.php

pass10

pass11 双写绕过

这些全部为黑名单绕过,接下来的主要就是白名单的绕过,直接开干。

pass12 %00截断

适用于文件路径可控的情况且%00只能用于php版本低于5.3的

image-20230223193352106

image-20230223193421729

没有5.3一下的环境,拿的别人的图

图片就凑合看一下吧,找到位置就可以了。接下来就上传,要上传jpg文件。然后去修改地址2509712-20211105233653166-62761255

这里相当于上传了一个12.php文件到upload中,%00就是截断了,

大概就是服务器只识别到空格前面,之后就无法识别,但是内容还在

pass13

参考文章:https://www.cnblogs.com/huajiaobuxiango/p/15968800.html#总结

第十三关和第十二关是差不多的,只不过是接受值变成了post,她两的差别呢就是get会自行解码,post不会自行解码,我们需要对%00进行编码,选中%00右键,按下图操作来

img

编码好,我们就可以上传了

img

上传成功

pass14

Php版本为5.45及以上,如果版本太低,对方服务器可能解析不出图片马的php格式

用图片+php代码,组成一个图片码进行上传,

1
copy nl.png /b + 5.php /a 14copy.png

当然要想解析出来这个图片,还得有这个包含漏洞。

image-20230223195624862

image-20230223214009261

pass15

getimagesize函数

检验开头几个字符判断是否为图片

可用

1
GIF89a

pass16

我这里不能上传图片了

看WP做法也是跟14题一样

pass17

imagecreatefromjpeg()函数
二次渲染是由Gif文件或 URL 创建一个新图象。成功则返回一图像标识符/图像资源,失败则返回false,导致图片马的数据丢失,上传图片马失败。
进行通关
按照原来的方法进行上传,我们可以发现还是可以上传的,但是配合包含漏洞却无法解析,这时我们把上传的图片复制下来用Notepad打开,发现我们原来写的php代码没有了,这就是二次渲染把我们里面的php代码删掉了。
我们
把原图和他修改过的图片进行比较,看看哪个部分没有被修改。将php代码放到没有被更改的部分,配合包含漏洞,就可以了。
使用HxD Hex Editor进行比较
下载地址:https://mh-nexus.de/en/hxd
然后比较
img

具体实现需要自己编写Python程序,人工尝试基本是不可能构造出能绕过渲染函数的图片webshell的,知道怎么解就可以了。

小结一下:

图片渲染是指imagecreatefromjpeg()函数对我们上传的图片进行渲染,可能导致上传的图片码失效,如果上传的图片码中木马没有被渲染,步骤跟14差不多

pass18

第18关主要是对条件竞争的考察,我们看代码他是将图片上传上去,才开始进行判断后缀名,二次渲染.如果我们在上传上去的一瞬间访问这个文件,那他就不能对这个文件删除、二次渲染。就相当于当我们打开一个文件后,想要去删除它,就会提示这个文件在了你给一个

直接上传以一个php文件,然后进行抓包,发送到Intruder下

img

然后如图操作修改

img

再修改一下线程

img

然后发包,用另一个浏览器一直访问18.php地址,只要在上传的一瞬间,他还没来的及删除、修改就可以了。(卡吧)

image-20230223210159217

成功

pass19

这关是检查了后缀名,然后上传,然后在进行二次渲染。这时我们只能上传图片马,而且得配合解析漏洞进行通关

操作和18关的一样,就是访问地址是加上包含漏洞的。

img

没什么问题,这些漏洞其实都是逻辑上的漏洞,二次渲染本身是没什么问题的。

pass20

方法一

move_uploaded_file()函数中的img_path是由post参数save_name控制的,可以在save_name利用%00截断(php版本低于5.3)

如图:

img

访问

img

由于这种前面关卡已经用过,相信作者真正用意不是考这个。

第二种move_uploaded_file()有这么一个特性,会忽略掉文件末尾的/.

所以我们把他修改为如图所示

img
访问

img

pass21

这一关是利用数组绕过验证

img

访问

img

十九关是一个黑名单,php/.就可以绕过,但是二十关他会检测文件后缀名,是一个白名单。所以把他拆分掉第三部分是.png,所以就会上传。实际上他上传上去的东西是
upload-21.php/.png 上传上去的东西就是upload-21.php。实现了绕过。

image-20230223213644335

WAF绕过

如果对方有安全狗一些防护软件,我们应该如何进行绕过
1.要明确上传参数名哪些东西可以更改,哪些不可以
Content-Disposition:一般不可以更改
name:表单参数值,不能更改
filename:文件名,可以更改
Content-Type:文件mime,视情况更改

2.绕过方法
数据溢出,防匹配,比如:filename=“x.php”可以在名字上写入大量的立即数据,让安全狗匹配不到,filename=“aaaaaaaaaasssssssssssfggghgjghtuyrfuy6tfgufujfffx.php”,大量写入,我这里这个量是不够的,自行测试。
符号变异,防匹配,filename=“x.jpg;.php”
数据截断防匹配,(%00;换行)
重复数据防匹配(参数多次写入)