DVWA通关--文件上传(File Upload)

目录

LOW

通关路径

源码分析

MEDIUM

通关路径

源码分析

HIGH

通关路径

源码分析

IMPOSSIBLE

源码分析

总结


LOW

通关路径

1、新建个sh.php文件,内容如下:

<?php assert($_POST['dvwa']);?>

2、尝试直接上传,上传成功,给出了文件保存路径。

看来这关一点防御都没有,任意文件可上传。

3、用蚁剑连接之前可以先在浏览器中试一下文件在不在,能不能被当作php解析。

那一般如果404就是文件不存在,如果php代码以字符串显示了就是不能解析用户上传的php。这两种情况下也就不用搬出蚁剑了。

4、用蚁剑连接一句话木马

源码分析

果然是没有防御的,没有对上传的文件进行任何过滤。

三个主要操作:

(1)全局数组$_FILES用来获取通过 POST 方法上传文件的相关信息。详见PHP 文件上传

(2)basename函数返回路径中的文件名部分

(3)move_uploaded_file函数将上传的文件保存到新位置

MEDIUM

通关路径

1、直接上传上一关中的sh.php,会提示上传失败,只能上传JPEG和PNG格式的文件

2、将上一步中的文件后缀名改成.png,上传sh.png文件并用burpsuite抓包,将抓到的报文右键send to repeater 

3、在repeater中修改filename参数的值,从sh.png修改为sh.php,点send,从response中可以看到文件上传成功,并返回了保存路径。

4、蚁剑连接一句话木马

源码分析

这关增加了MIME校验,如下图高亮部分所示,只允许上传MIME类型(Content-Type请求头)为image/jpeg或image/png的文件。

HIGH

通关路径

1、上一关的sh.png也传不上去了

2、试了一张百度上下载的正常的图片是能上传的,所以这关估计还检查了magic number。

3、图片里面加个一句话木马试试:

16进制形式查看并找个地方添加一句话木马

可以上传成功。

那么就剩下修改文件名了。

4、上传包含一句话木马的文件bai-ma.jpeg的时候,burpsuite抓包,在proxy---http history中找到这个http请求,并send to intruder

5、这里我打算先用爆破的方式来试试这关是否是黑名单过滤。

将文件后缀设置成待爆破参数

可以把文件名后缀做成一个尝试黑名单绕过的字典,可以包含各种php后缀变种,各种中间件、系统解析漏洞相关的后缀。

注意高亮部分不要勾选

爆破结果根据Length进行排序,从结果看,所有后缀都上传失败。很可能是文件后缀白名单过滤。

6、尝试了00截断,但是没有成功,网上查了很多资料,最终在这个博文里面找到了原因:

【文件上传】00截断详解(见步骤4和5)

本关应该是不适合用00截断的,即便满足以下两个条件也不行:

php版本小于5.3.4

php的magic_quotes_gpc=off(php中magic_quotes_gpc函数详解

因为本关提交的数据中并没有文件保存路径,对filename进行00截断后,用$_FILES[ 'uploaded' ][ 'name' ]获取到的文件名已经是00截断后的了,所以白名单校验不通过。

而根据上述链接,如果表单中有文件保存路径,则是通过$_POST获取的,就可以进行00截断

(具体为什么$_FILES[ 'uploaded' ][ 'name' ]获取到的文件名是00截断后的,暂时没有找到原理性依据,如果有哪位大神知道,请赐教)

7、官方给的help中说这关要和其他漏洞,比如文件包含结合,下面试了是可以的。

我用的是蚁剑, 这里似乎要添加cookie头才能成功连上一句话木马。

(不添加的话,测试连接时会出现返回数据为空的警告。至于为什么前面两关不用添加就能连接一句话木马,应该是因为前两关上传的文件不需要登录就可以访问,但存在文件包含漏洞的这个文件必须要登录访问)

源码分析

和猜测的一样,如高亮部分所示这关一方面有检测到实际文件类型,另一方面对上传的文件名后缀也进行了白名单过滤。

主要函数:

(1)getimagesize函数用于获取图像信息(详见php getimagesize 函数 - 获取图像信息

(2)strrpos函数用于查找子字符串在字符串中最后一次出现的位置(详见PHP strrpos() 函数

(3)substr函数返回字符串的一部分

(4)strtolower函数把字符串转换成小写

IMPOSSIBLE

源码分析

就文件上传而言,impossible不但对文件后缀名和MIME进行了白名单过滤,还去除了上传的文件中的php代码,并给上传的文件重命名(虽然这个重命名展示出来了,对安全没有什么卵用)。

主要函数:

(1)uniqid函数基于以微秒计的当前时间,生成一个唯一的 ID

(2)md5函数计算字符串的 MD5 散列。

(3)ini_get函数获取php.ini里变量值

(4)sys_get_temp_dir函数返回 PHP 储存临时文件的默认目录的路径

(5)imagecreatefromjpeg函数以及imagecreatefrompng函数由文件或 URL 创建一个新图象

(6)imagejpeg函数以及imagepng函数输出图象到浏览器或文件

(7)getchwd函数返回当前工作目录

(8)rename函数重命名文件或目录

总结

文件上传漏洞网上有很多挺全的总结了,比如文件上传漏洞 (上传知识点、题型总结大全-upload靶场全解)文件上传绕过总结

这里我就简单说一下。

文件上传常见的可绕过限制和绕过方法见下图

比较全的文件上传靶场应该是upload-labs,可以试试。

猜你喜欢

转载自blog.csdn.net/elephantxiang/article/details/111937097