upload-labs靶场
目录
- Pass-01 客户端JS检测
- Pass-02 绕过MIME检测
- Pass-03 利用其他后缀绕过检测
- Pass-04 利用apache配置文件绕过
- Pass-05 大小写绕过
- Pass-06 使用 windows特性
- Pass-07 使用 windows特性
- Pass-08 文件流特性
- Pass-09 构造后缀绕过黑名单
- Pass-10 双写绕过
- Pass-11 get%00截断绕过
- Pass-12 post%00截断绕过
- Pass-13 图片马绕过
- Pass-14 文件幻数检测
- Pass-15 文件幻数检测
Pass-01客户端JS检测
检测方法:
一般都是在网页上写一段javascript脚本,校验上传文件的后缀名,有白名单形式也有黑名单形式。
判断方式:在浏览器加载文件,点击上传按钮时便弹出对话框,内容如:只允许上传.jpg/ .jpegl.png后缀名的文件,而此时并没有发送数据包。
打开F12可以查看点击上传没有请求
案例:
将含有一句话木马的php文件修改后缀为jpg上传,同时打开BP进行抓包,将1.jpg改为1.php后再放包,
成功绕过检测,上传文件
Pass-02绕过MIME检测
MIME (Multipurpose Internet Mail Extensions)是描述消息内容类型的因特网标准。用来表示文档、文件或字节流的性质和格式。在http数据包中在Content-Type字段显示。
- 超文本标记语言.html文件: text/html
- 普通文本.txt文件:text/plain
- PDF文档.pdf: application/pdfPNG
- 图像.png: image/png
- GIF图像.gif: image/gif
- MPEG文件.mpg、.mpeg: video/mpeg
- 二进制流:application/octet-stream
案例:
上传aa.txt文件,BP进行抓包,将Content-Type改为image/png,再放包
成功绕过检测上传
Pass-03利用其他后缀绕过检测
上传其他后缀,例如.php3
Pass-04利用apache配置文件绕过
.htaccess文件(或者"分布式配置文件"”) ,全称是Hypertext Access(超文本入口)。提供了针对目录改变配置的方法。
比如新建一个.htaccess文件:
<FilesMatch “hack2.png”>
setHandler application/x-httpd-php
</FilesMatch>
通过一个.htaccess文件调用php的解析器去解析一个文件名中只要包含"hack2.png"这个字符串的任意文件,所以无论文件名是什么样子,只要包含hack2.png"这个字符串,都可以被以php的方式来解析,一个自定的.htaccess文件就可以以各种各样的方式去绕过很多上传验证机制。
先上传.htaccess文件,再上传hack2.png图片,再进行解析
Pass-05 大小写绕过
使用BP将1.php文件后缀改为.Php
成功绕过
Pass-06使用 windows特性
在windows环境下,test.jpg[空格] 或 test.jpg. 这两类文件都是不允许存在的,若这样命名,windows会默认 除去 空格 或 点
使用BP在1.php后添加空格,绕过
Pass-07使用 windows特性
使用BP在hack2.php后添加 点. 绕过
使用蚁剑连接
Pass-08文件流特性
文件流特性:在php+windows的情况下:如果文件名+“::&DATA"会把::$DATA之后的数据当成文件流处理,不会检测后缀名,且保持”::$DATA"之前的文件名。
删除特殊字符::$DATA绕过,显示目标文件
Pass-09构造后缀绕过黑名单
这一关黑名单,最后上传路径直接使用文件名进行拼接,而且只对文件名进行f i l e n a m e = d e l d o t ( file_name = deldot(file_name=deldot(file_name)操作去除文件名末尾的点,构造后缀绕过黑名单
补充知识:deldot()函数从后向前检测,当检测到末尾的第一个点时会继续它的检测,但是遇到空格会停下来
上传hack2.php,然后用BP改后缀加 点空格点
(即文件名为hack2.php. .)
Pass-10双写绕过
这一关黑名单,使用str_ireplace()函数寻找文件名中存在的黑名单字符串,将它替换成空(即将它删掉),可以使用双写绕过黑名单
补充知识:str_ireplace(find,replace,string,count) 函数替换字符串中的一些字符(不区分大小写)
使用BP双写php进行绕过
Pass-11 get%00截断绕过
%00是一个url编码,url发送到服务器后就被服务器解码,这时还没有传到验证函数,也就是说验证函数里接收到的不是%00字符,而是%00解码后的内容,即解码成了0x00。
在url中%00表示ascll码中的0,而ascii中0作为特殊字符保留,表示字符串结束,所以当url中出现%00时就会认为读取已结束。
系统在对文件名进行读取时,如果遇到Ox00,就会认为读取已经结束。但要注意是文件的十六进制内容里的00,而不是文件名中的00。
步骤:
上传hack2.png图片,使用BP抓包,在/upload/后添加hack2.php%00,绕过显示hack2.php文件
使用蚁剑成功连接
Pass-12 post%00截断绕过
步骤:
上传hack2.php文件,在/upload/后添加hack2.php%00,再将%00手动进行URL解码,发送
hack2.php后的空格为%00解码后的空格,已被截断,因此后面的54** *.png无法复制
Pass-13 图片马绕过
将含有一句话木马的图片马上传后,打开新页面
打开目录下的include.php页面,复制新生成的文件名
此时在图片乱码下,显示phpinfo
Pass-14 文件幻数检测
解法同第13关
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)){
return $ext;
}else{
return false;
}
}else{
return false;
}
}
//getimagesize返回的结果是(width, height, type, attr),
//type是文件类型,结果是int型,attr指的是width, height的文本
//image_type_to_extension是通过返回的int型,寻找对应的字符串,
//比如:1 = GIF,2 = JPG,3 = PNG,4 = SWF,5 = PSD
//stripos是寻找字符串2在字符串1中第一次出现的位置,不区分大小写,
//如果没有出现,返回FALSE
十四关是用了getimagesize
函数来对文件类型做判断
Pass-15 文件幻数检测
十五关是用的exif_imagetype
函数
解法同第13关