DVWA靶场之File Upload学习分享
字数 1268 2025-08-24 20:49:31
DVWA靶场之File Upload漏洞分析与利用
1. 文件上传漏洞概述
文件上传漏洞是指Web应用程序允许用户上传文件到服务器,但未对上传文件进行充分验证,导致攻击者可以上传恶意文件(如PHP木马)并执行,从而获取服务器控制权。
2. DVWA文件上传漏洞分析
2.1 Low级别漏洞
代码分析:
<?php
if (isset($_POST['Upload'])) {
$target_path = DVWA_WEB_PAGE_TO_ROOT . "hackable/uploads/";
$target_path .= basename($_FILES['uploaded']['name']);
if (!move_uploaded_file($_FILES['uploaded']['tmp_name'], $target_path)) {
$html .= '<pre>Your image was not uploaded.</pre>';
} else {
$html .= "<pre>{$target_path} succesfully uploaded!</pre>";
}
}
?>
漏洞点:
- 仅使用
basename()函数获取文件名,无任何文件类型检查 - 无内容验证,可直接上传任意文件类型
- 上传路径可预测
利用方法:
- 直接上传PHP一句话木马文件(如
1.php) - 使用蚁剑等工具连接获取shell
2.2 Medium级别漏洞
代码分析:
增加了文件类型和大小限制:
- 文件类型必须是jpeg或png
- 文件大小不超过100000B(约97.6KB)
绕过方法:
方法一:修改Content-Type
- 上传PHP文件
- 拦截请求,修改Content-Type为
image/png或image/jpeg - 放行请求
方法二:修改文件后缀
- 将木马文件命名为
shell.png - 上传后拦截请求,修改文件名为
shell.php - 放行请求
方法三:%00截断(需特定环境)
- 将文件名改为
shell.php%00.png - 在PHP版本<5.3.4且magic_quotes_gpc=off时可利用
- 服务器会解析为
shell.php
2.3 High级别漏洞
代码分析:
- 使用
strrpos()检查文件扩展名(必须为.jpg/.jpeg/.png) - 使用
getimagesize()验证文件内容是否为真实图片
绕过方法:
方法一:添加图片文件头
- 创建包含PHP代码的文本文档
- 添加图片文件头(如GIF89)
- 修改文件后缀为.jpg
- 上传并拦截请求,确保Content-Type正确
方法二:图片后附加PHP代码
- 使用命令合并图片与PHP代码:
copy 1.jpg/b + shell.php/a 2.jpg - 上传合并后的文件
利用文件包含漏洞执行:
由于服务器将文件解析为图片,需结合文件包含漏洞执行PHP代码:
/vulnerabilities/fi/?page=file:///var/www/html/hackable/uploads/phpinfo.jpg
2.4 Impossible级别防护
防护措施:
- 对上传文件重命名(使用md5值)
- 添加Anti-CSRF token
- 使用
imagecreatefromjpeg()等函数严格验证图片内容 - 即使上传成功也无法执行恶意代码
3. 防御建议
-
文件类型验证:
- 使用白名单限制允许的文件扩展名
- 检查MIME类型和文件内容
-
文件重命名:
- 使用随机名称存储上传文件
- 避免使用用户提供的文件名
-
权限控制:
- 上传目录禁止执行脚本
- 设置适当的文件权限
-
内容验证:
- 对图片文件使用图像处理函数验证
- 对文档文件进行解析验证
-
其他措施:
- 限制文件大小
- 使用病毒扫描
- 记录上传行为
4. 总结
DVWA的File Upload模块展示了不同安全级别下的文件上传漏洞及其防护措施。从Low级别的无任何防护,到Impossible级别的多重防护,体现了Web安全防护的逐步加强过程。在实际开发中,应至少采用High级别的防护措施,并结合业务需求增加额外的安全验证。