????????upload-labs通关过程由自己一步步做出过程解析,有什么意见或建议请留言,我会采纳修改。
upload-labs文件包???????链接:https://pan.baidu.com/s/1FjDOTzKD6dAj4enFI1bgyg? 提取码:8888
Pass-01
前端验证绕过
-
页面另存为本地文件,更改前端限制 -
关闭浏览器js代码禁用 -
使用代理拦截上传


?Pass-02
MIME-Type验证
MIME-Type介绍:
MIME(Multipurpose Internet Mail Extensions)多用途互联网邮件扩展类型。是设定某种扩展名的文件用一种应用程序来打开的方式类型,当该扩展名文件被访问的时候,浏览器会自动使用指定应用程序来打开。多用于指定一些客户端自定义的文件名,以及一些媒体文件打开方式。
- 方法1:由pass2源码可以看到mime-type元素标签,bs代理中更改Content-Type图片类型的描述,如下图,就可以通过啦。

?将 Content-Type: application/octet-stream的文件类型改为源码中允许上传的文件类型,如image/jpeg,然后放行就通关啦。


??Pass-03
?黑名单绕过
基于文件后缀名验证方式的分类: 1、基于白名单验证:只针对白名单中有的后缀名,文件才能上传成功。 2、基于黑名单验证:只针对黑名单中没有的后缀名,文件才能上传成功。 这一关禁止.jsp、.php、.asp、.aspx后缀名的文件上传。
所以这一关就比较简单啦,可上传php1、php2、phtml、php5等等。
注:上传成功后,文件名会被更改,所以需要查看文件上传的位置以及文件名。
- ?方法1:读取源码,可知pass3为黑名单上传,直接投机取巧,更改文件后缀上传.php5、php4、php3等黑名单中不包含的文件类型就可通过。
??Pass-04
点空格点绕过? ". ."
Windows下xx.jpg[空格]或xx.jpg.这两类文件都是不允许存在的,若这样命名,windows会默认除去空格或点。此处会删除末尾的点,但是没有去掉末尾的空格,因此上传一个.php空格文件即可。
方法1:根据源码去除后缀规则,先去除末尾点,再去除::$DATA,再去除尾部空格的顺序,可以在后面再加一个点,这样就可以利用·windows文件规则上传文件

?用bs代理,抓包,(将拦截的包发送到重发器中进行操作,防止一次操作不成功,可以多次重复操作,当然,也可以直接修改包,直接省略括号内的操作也可)

在文件后缀尾部直接加点空格点,然后放包。

方法2:黑名单验证,.htaccess
禁止的有点多,但是没有htaccess。
htaccess文件介绍:
htaccess文件是Apache服务器中的一个配置文件,它负责相关目录下的网页配置。通过htaccess文件,可以帮我们实现:网页301重定向、自定义404错误页面、改变文件扩展名、允许/阻止特定的用户或者目录的访问、禁止目录列表、配置默认文档等功能。 其中.htaccess文件内容: SetHandler application/x-httpd-php 设置当前目录所有文件都使用PHP解析,那么无论上传任何文件,只要文件内容符合PHP语言代码规范,就会被当作PHP执行。不符合则报错。
创建1.htaccess,并将其上传:
<FilesMatch "上传的图片马的文件名"
SetHandler application/x-httpd-php
</FilesMatch>
Pass-05
大小写绕过
点空格点绕过
方法1:读取源码可知,这一关可以根据大小写绕过通关。

方法2:与pass4中的方法1相同,bs抓包,文件后缀加点空格点
方法3:这一关,先上传一个以auto_prepend_file=1.gif为内容的.user.ini文件,然后再上传一个内容为php的一句话的脚本,命名为1.gif,.user.ini文件里面的意思是:所有的php文件都自动包含1.gif文件。.user.ini相当于一个用户自定义的php.ini。
Pass-06
空格绕过
方法1:与四、五关原理相同,用bs抓包,在文件后缀加空格,然后放包就通过啦。

Pass-07
点绕过
方法1:与前几关原理相同,用bs抓包,在文件后缀加点,然后放包就通过啦。

Pass-08
::$DATA 绕过
NTFS文件系统包括对备用数据流的支持。这不是众所周知的功能,主要包括提供与Macintosh文件系统中的文件的兼容性。备用数据流允许文件包含多个数据流。每个文件至少有一个数据流。在Windows中,此默认数据流称为:$ DATA。
方法1:由源码看出,这关没有::$DATA字符去除,所以用该字符绕过,用bs抓包,在文件后缀加::$DATA,然后放包就通过啦。

方法2:也可用点空格点绕过
Pass-09
点空格点绕过
方法1:读取源码便知,与上几关类似

Pass-10
?双写绕过
方法1:由源码可知,$deny_ext中的元素文件类型都加入上传黑名单,有该类文件上传,str_ireplace函数将文件后缀名替换为空格。

?因此可以使用文件双写绕过,bs抓包,将文件后缀.php改为.pphphp

?Pass-11
截断突破上传限制(get)
原理:URL转码会将 %00 转码为特殊字符。
条件:php5.5.9版本
方法1:上传php脚本文件,用bs抓包,在文件路径后加文件名.php%00,再将文件名(filename)后的文件后缀改为.jpg(允许上传的文件类型)。

?Pass-12
截断突破上传限制(get)
原理:和Pass-11的漏洞非常类似,唯一的不同是请求方式由GET变成了POST,%00的写法对GET有效,因为GET方式将信息提交到地址栏,%00会被转码,但是POST却不会对其进行转码,因此需要修改 HEX 信息。POST方式直接写00即可。
条件:php5.5.9版本
方法1:上传php脚本文件,用bs抓包,在文件路径后加文件名.php+(“+”作为定位标记,在16进制中为2b,方便后面操作查)再将文件名(filename)后的文件后缀改为.jpg(允许上传的文件类型)。

?进去16进制模式,将2b改为00,然后放包。

?Pass-13
伪图片绕过
方法1:读取源码可知,pass13判断文件格式方法为前两个字节

将php脚本用记事本打开,在行首加GIF89a,上传即可。

?方法2:图片挂马:将图片和脚本放在同一目录下,执行cmd命令,在cmd中执行
copy /b 图片+php脚本 新文件名,然后直接上传伪图片zgr_shell.png

?最后用pass13中include.php文件包含解析图片马(http://192.168.51.228/upload-labs-env/include.php?file=zgr_shell.php)
pass-14
getimagesize()突破
本pass使用getimagesize()检查是否为图片文件!
方法1:直接上传合成的图片马,参照pass13的方法2.
function isImage($filename){
$types = '.jpeg|.png|.gif';
if(file_exists($filename)){
$info = getimagesize($filename);
$ext = image_type_to_extension($info[2]);
if(stripos($types,$ext)>=0){
return $ext;
}else{
return false;
}
}else{
return false;
}
}
$is_upload = false;
$msg = null;
if(isset($_POST['submit'])){
$temp_file = $_FILES['upload_file']['tmp_name'];
$res = isImage($temp_file);
if(!$res){
$msg = "文件未知,上传失败!";
}else{
$img_path = UPLOAD_PATH."/".rand(10, 99).date("YmdHis").$res;
if(move_uploaded_file($temp_file,$img_path)){
$is_upload = true;
} else {
$msg = "上传出错!";
}
}
}
pass-15
exif_imagetype()突破
本pass使用exif_imagetype()检查是否为图片文件!
跟 Pass-13一样,直接上传图片马即可绕过!
方法1:跟 Pass-13一样,直接上传图片马即可绕过!
function isImage($filename){
//需要开启php_exif模块
$image_type = exif_imagetype($filename);
switch ($image_type) {
case IMAGETYPE_GIF:
return "gif";
break;
case IMAGETYPE_JPEG:
return "jpg";
break;
case IMAGETYPE_PNG:
return "png";
break;
default:
return false;
break;
}
}
$is_upload = false;
$msg = null;
if(isset($_POST['submit'])){
$temp_file = $_FILES['upload_file']['tmp_name'];
$res = isImage($temp_file);
if(!$res){
$msg = "文件未知,上传失败!";
}else{
$img_path = UPLOAD_PATH."/".rand(10, 99).date("YmdHis").".".$res;
if(move_uploaded_file($temp_file,$img_path)){
$is_upload = true;
} else {
$msg = "上传出错!";
}
}
}
pass-16
二次渲染的gif文件绕过
方法1:现在制作一个gif图片马,copy就可以了。也可以winhex制作。制作后便上传,发现无法利用。然后将上传的图片重新下载下来,放入winhex,进行对比。可以找到二次渲染后不变的地方,而这个地方就是可以插入一句话的地方。

上传修改好的图片马,蚁剑连接成功。
pass-17
条件竞争
条件:要知道源码?
声明:这一关条件竞争,属于套娃脚本,根据源码可知,文件是先上传至服务器路径,在进行判断,不符合在删除,我们就趁上传至服务器的时间差,完成套娃脚本执行,生成新的脚本文件。

方法一:
利用文件上传后,后台判断、删除的时间漏洞执行shell脚本命令,创建另一个shell脚本文件
上传脚本文件内容为以下的.php格式
<?php fputs( fopen('xie.php','w') , '<?php eval($_POST[xie]) ?>' ) ; ?>
bs拦截——创造变量a——行动——发送至攻击器

positions下——清除变量——添加变量a

?payload下——没有负载——生成次数——开始攻击
?**攻击过程中要不断刷新执行上传文件路径
pass-18
这一关相比17关,上传的文件就必须是白名单中的文件。
Pass-18.jpg是包含17关的webshell.php的内容的图片马。毕竟是先检查后缀的。
这里上传的文件以及生成的shell.php会出现在upload-labs目录中。
然后再访问http://ip/upload-labs/include.php?file=./对应的文件名。就可以生成shell.php。
也可以直接上传13~15关的那种图片马,当然也需要知道重新命名后的文件名,再利用文件包含即可。同13~15关差不多,唯一多了一步就是需要确定上传的文件的文件名以及位置。
pass-19
本关卡直接点绕过上传
方法1:保存名称后加点

?验证是否上传成功:右击图片,复制图片地址?
?执行图片路径,php文件可以解析,表示上传成功。

?pass-20
与13,15关相同,直接上传图片马即可。
具体请参照13关,15关。
|