upload-labs通关过程由自己一步步做出过程解析,有什么意见或建议请留言,我会采纳修改。
upload-labs文件包链接:https://pan.baidu.com/s/1FjDOTzKD6dAj4enFI1bgyg
提取码:8888
目录
Pass-01
Pass-02
Pass-03
Pass-04
Pass-05
Pass-06
Pass-07
Pass-08
Pass-09
Pass-10
Pass-11
Pass-12
Pass-13
pass-14
pass-15
pass-16
pass-17
pass-18
pass-19
pass-20
前端验证绕过
页面另存为本地文件,更改前端限制
关闭浏览器js代码禁用
使用代理拦截上传
方法3:使用Burp Suit代理,拦截,将所有JS限制删除,再上传phpinfo.php文件。(三种方法原理一样)
MIME-Type验证
MIME-Type介绍:
MIME(Multipurpose Internet Mail Extensions)多用途互联网邮件扩展类型。是设定某种扩展名的文件用一种应用程序来打开的方式类型,当该扩展名文件被访问的时候,浏览器会自动使用指定应用程序来打开。多用于指定一些客户端自定义的文件名,以及一些媒体文件打开方式。
将 Content-Type: application/octet-stream的文件类型改为源码中允许上传的文件类型,如image/jpeg,然后放行就通关啦。
黑名单绕过
基于文件后缀名验证方式的分类:
1、基于白名单验证:只针对白名单中有的后缀名,文件才能上传成功。
2、基于黑名单验证:只针对黑名单中没有的后缀名,文件才能上传成功。
这一关禁止.jsp、.php、.asp、.aspx后缀名的文件上传。所以这一关就比较简单啦,可上传php1、php2、phtml、php5等等。
注:上传成功后,文件名会被更改,所以需要查看文件上传的位置以及文件名。
点空格点绕过 ". ."
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,并将其上传:
大小写绕过
点空格点绕过
方法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。
空格绕过
方法1:与四、五关原理相同,用bs抓包,在文件后缀加空格,然后放包就通过啦。
点绕过
方法1:与前几关原理相同,用bs抓包,在文件后缀加点,然后放包就通过啦。
::$DATA 绕过
NTFS文件系统包括对备用数据流的支持。这不是众所周知的功能,主要包括提供与Macintosh文件系统中的文件的兼容性。备用数据流允许文件包含多个数据流。每个文件至少有一个数据流。在Windows中,此默认数据流称为:$ DATA。
方法1:由源码看出,这关没有::$DATA字符去除,所以用该字符绕过,用bs抓包,在文件后缀加::$DATA,然后放包就通过啦。
方法2:也可用点空格点绕过
点空格点绕过
方法1:读取源码便知,与上几关类似
双写绕过
方法1:由源码可知,$deny_ext中的元素文件类型都加入上传黑名单,有该类文件上传,str_ireplace函数将文件后缀名替换为空格。
因此可以使用文件双写绕过,bs抓包,将文件后缀.php改为.pphphp
截断突破上传限制(get)
原理:URL转码会将 %00 转码为特殊字符。
条件:php5.5.9版本
方法1:上传php脚本文件,用bs抓包,在文件路径后加文件名.php%00,再将文件名(filename)后的文件后缀改为.jpg(允许上传的文件类型)。
截断突破上传限制(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,然后放包。
伪图片绕过
方法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)
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 = "上传出错!";
}
}
}
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 = "上传出错!";
}
}
}
二次渲染的gif文件绕过
方法1:现在制作一个gif图片马,copy就可以了。也可以winhex制作。制作后便上传,发现无法利用。然后将上传的图片重新下载下来,放入winhex,进行对比。可以找到二次渲染后不变的地方,而这个地方就是可以插入一句话的地方。
上传修改好的图片马,蚁剑连接成功。
条件竞争
条件:要知道源码
声明:这一关条件竞争,属于套娃脚本,根据源码可知,文件是先上传至服务器路径,在进行判断,不符合在删除,我们就趁上传至服务器的时间差,完成套娃脚本执行,生成新的脚本文件。
方法一:
利用文件上传后,后台判断、删除的时间漏洞执行shell脚本命令,创建另一个shell脚本文件
上传脚本文件内容为以下的.php格式
' ) ; ?>
bs拦截——创造变量a——行动——发送至攻击器
positions下——清除变量——添加变量a
payload下——没有负载——生成次数——开始攻击
这一关相比17关,上传的文件就必须是白名单中的文件。
Pass-18.jpg是包含17关的webshell.php的内容的图片马。毕竟是先检查后缀的。
这里上传的文件以及生成的shell.php会出现在upload-labs目录中。
然后再访问http://ip/upload-labs/include.php?file=./对应的文件名。就可以生成shell.php。
也可以直接上传13~15关的那种图片马,当然也需要知道重新命名后的文件名,再利用文件包含即可。同13~15关差不多,唯一多了一步就是需要确定上传的文件的文件名以及位置。
本关卡直接点绕过上传
方法1:保存名称后加点
执行图片路径,php文件可以解析,表示上传成功。
与13,15关相同,直接上传图片马即可。
具体请参照13关,15关。