目录
本系列为通过《DVWA靶场通关笔记》的文件上传关卡(low,medium,high,impossible共4关)渗透集合,通过对相应关卡源码的代码审计找到讲解渗透原理并进行渗透实践,本文为文件上传Low级别关卡的渗透部分。
一、文件上传
文件上传是指攻击者通过上传恶意文件(如可执行脚本或恶意软件)到服务器,从而在服务器上执行恶意代码或进行其他攻击行为。它通常出现在应用程序允许用户上传文件的场景中。攻击者可能上传恶意脚本(如PHP、ASP等),并尝试通过浏览器访问这些脚本,从而在服务器上执行恶意代码。
防御文件上传风险的关键措施包括:严格验证上传文件的类型和大小,限制上传文件的存储位置,对上传的文件进行安全检查,避免直接使用用户上传的文件名,以及禁用上传目录的脚本执行权限。
二、代码审计
1、渗透准备
配置security为低等low级别,具体如下图红框所示。

进入到文件上传关卡low页面,完整URL地址具体如下所示。
http://127.0.0.1/DVWA/vulnerabilities/upload/

2、源码分析
(1)index.php
进入DVWA靶场源目录,找到low.php源码。

这段代码实现了 DVWA (Damn Vulnerable Web Application) 中的文件上传演示页面,主要功能包括:
安全级别控制:根据用户Cookie中的security值(低、中、高、不可能),加载不同安全级别的处理逻辑环境检查:验证上传目录是否可写以及PHP-GD扩展是否安装表单展示:显示文件上传表单,允许用户上传文件辅助功能:提供安全文档链接,帮助用户理解文件上传风险。
经过注释后的详细代码如下所示。
<?php
// 定义网站根目录路径常量,用于后续文件包含
define( 'DVWA_WEB_PAGE_TO_ROOT', '../../' );
// 引入DVWA页面基础功能库
require_once DVWA_WEB_PAGE_TO_ROOT . 'dvwa/includes/dvwaPage.inc.php';
// 初始化页面,验证用户身份并启动PHPIDS(PHP入侵检测系统)
dvwaPageStartup( array( 'authenticated', 'phpids' ) );
// 创建新页面实例
$page = dvwaPageNewGrab();
// 设置页面标题
$page[ 'title' ] = 'Vulnerability: File Upload' . $page[ 'title_separator' ].$page[ 'title' ];
// 设置页面ID
$page[ 'page_id' ] = 'upload';
// 设置帮助按钮和源代码按钮关联的页面
$page[ 'help_button' ] = 'upload';
$page[ 'source_button' ] = 'upload';
// 连接数据库
dvwaDatabaseConnect();
// 根据安全级别选择不同的实现文件
$vulnerabilityFile = '';
switch( $_COOKIE[ 'security' ] ) {
case 'low':
$vulnerabilityFile = 'low.php';
break;
case 'medium':
$vulnerabilityFile = 'medium.php';
break;
case 'high':
$vulnerabilityFile = 'high.php';
break;
default:
$vulnerabilityFile = 'impossible.php';
break;
}
// 包含对应安全级别的处理文件
require_once DVWA_WEB_PAGE_TO_ROOT . "vulnerabilities/upload/source/{$vulnerabilityFile}";
// 检查上传目录是否可写
$WarningHtml = '';
if( !is_writable( $PHPUploadPath ) ) {
$WarningHtml .= "<div class=\"warning\">Incorrect folder permissions: {$PHPUploadPath}<br /><em>Folder is not writable.</em></div>";
}
// 检查PHP-GD扩展是否安装(用于图像处理)
if( ( !extension_loaded( 'gd' ) || !function_exists( 'gd_info' ) ) ) {
$WarningHtml .= "<div class=\"warning\">The PHP module <em>GD is not installed</em>.</div>";
}
// 构建页面主体内容:文件上传表单
$page[ 'body' ] .= "
<div class=\"body_padded\">
<h1>Vulnerability: File Upload</h1>
{$WarningHtml}
<div class=\"vulnerable_code_area\">
<form enctype=\"multipart/form-data\" action=\"#\" method=\"POST\">
<input type=\"hidden\" name=\"MAX_FILE_SIZE\" value=\"100000\" />
Choose an image to upload:<br /><br />
<input name=\"uploaded\" type=\"file\" /><br />
<br />
<input type=\"submit\" name=\"Upload\" value=\"Upload\" />\n";
// 如果是不可能级别,添加CSRF令牌字段
if( $vulnerabilityFile == 'impossible.php' )
$page[ 'body' ] .= " " . tokenField();
$page[ 'body' ] .= "
</form>
{$html}
</div>
<h2>More Information</h2>
<ul>
<li>" . dvwaExternalLinkUrlGet( 'https://www.owasp.org/index.php/Unrestricted_File_Upload' ) . "</li>
<li>" . dvwaExternalLinkUrlGet( 'https://blogs.securiteam.com/index.php/archives/1268' ) . "</li>
<li>" . dvwaExternalLinkUrlGet( 'https://www.acunetix.com/websitesecurity/upload-forms-threat/' ) . "</li>
</ul>
</div>";
// 输出HTML页面
dvwaHtmlEcho( $page );
?>
(2)low.php
进入DVWA靶场源目录,找到low.php源码,如下图所示。

打开源码low.php,分析可知这段代码实现了一个不安全的文件上传安全风险,参数为POST型参数,因为其未对参数进行任何过滤,如下所示。

这段代码实现了一个基本的文件上传功能:
- 接收通过POST方法提交的文件上传表单(表单名为'Upload')
- 设置文件上传目标路径为hackable/uploads/目录
- 使用basename()处理原始文件名
- 尝试将临时文件移动到目标位置
- 返回上传成功或失败的信息
很明显代码中没有对传入文件进行任何检查防止其为不合法脚本,故而存在文件上传安全风险。
<?php
// 检查用户是否点击了上传按钮
if( isset( $_POST[ 'Upload' ] ) ) {
// 构建上传文件的目标路径
// DVWA_WEB_PAGE_TO_ROOT 是网站根目录常量
$target_path = DVWA_WEB_PAGE_TO_ROOT . "hackable/uploads/";
// 将用户上传的文件名添加到路径中(使用basename防止目录遍历)
$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>";
}
}
?>
综上所述,本关卡未对脚本进行任何过滤,存在的文件上传风险。
| 类型 | 具体问题 | 潜在风险 |
|---|---|---|
| 未验证文件类型 | 代码未检查上传文件的MIME类型或扩展名 | 攻击者可上传PHP等可执行脚本 |
| 未重命名文件 | 直接使用用户提供的文件名 | 可能导致覆盖重要文件或执行恶意脚本 |
| 未设置权限限制 | 上传目录可能具有执行权限 | 上传的恶意脚本可被服务器执行 |
| 未检查文件内容 | 未验证文件实际内容是否与类型匹配 | 可伪装文件类型上传恶意代码 |
| 未限制文件大小 | 无上传大小限制 | 可能导致拒绝服务攻击 |
二、渗透实战
1、构造脚本
构造文件上传的脚本test.php,内容为获取服务器的php版本信息,脚本code内容如下所示。
<?php phpinfo();?>

2、上传脚本
进入DVWA靶场的文件上传关卡low级别,选择test.php,点击上传如下所示。

3、获取脚本地址
上传后路径如下所示,相对于当前路径/dvwa/vulnerabilities/upload/,webshell被上传至../../hackable/uploads/test.php路径下,故而这个webshell的路径应该如下所示。
http://127.0.0.1/dvwa//hackable/uploads/test.php

4、访问脚本
完整的渗透URL地址如下所示,并在浏览器地址栏输入,如下所示获取服务器的php信息,渗透成功。
http://127.0.0.1/dvwa//hackable/uploads/test.php

1352

被折叠的 条评论
为什么被折叠?



