DVWA靶场通关笔记-文件上传(Low级别)

目录

一、文件上传

二、代码审计

1、渗透准备

2、源码分析

(1)index.php

(2)low.php

二、渗透实战

1、构造脚本

2、上传脚本

3、获取脚本地址

4、访问脚本


本系列为通过《DVWA靶场通关笔记》的文件上传关卡(low,medium,high,impossible共4关)渗透集合,通过对相应关卡源码的代码审计找到讲解渗透原理并进行渗透实践,本文为文件上传Low级别关卡的渗透部分。

一、文件上传

文件上传是指攻击者通过上传恶意文件(如可执行脚本或恶意软件)到服务器,从而在服务器上执行恶意代码或进行其他攻击行为。它通常出现在应用程序允许用户上传文件的场景中。攻击者可能上传恶意脚本(如PHPASP等),并尝试通过浏览器访问这些脚本,从而在服务器上执行恶意代码。

防御文件上传风险的关键措施包括:严格验证上传文件的类型和大小,限制上传文件的存储位置,对上传的文件进行安全检查,避免直接使用用户上传的文件名,以及禁用上传目录的脚本执行权限。

二、代码审计

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

mooyuan安全

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值