文件上传

文件上传漏洞是由于对上传文件的内、类型没有做严格的过滤、检查,使得攻击者可以通过上传木马文件获取服务器的webshell文件

low

上传一个php文件,上传成功,并且可以在WWW\DVWA\hackable\uploads目录下找到该文件

此难度没有做任何过滤,所有文件都可以上传

源码审计

没有做任何过滤,很危险的行为

<?php

if( isset( $_POST[ 'Upload' ] ) ) { // 检查表单是否提交了"Upload"按钮
// 定义目标上传路径
$target_path = DVWA_WEB_PAGE_TO_ROOT . "hackable/uploads/"; // 设置目标路径为一个固定目录
$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} successfully uploaded!</pre>"; // 提示用户图像成功上传,并显示路径
}
}
?>

medium

先上传一个php文件

只允许上传jpg/png图片,那么就上传这两种图片

上传成功

源码审计

只允许上传文件类型jpg/png内容,以及文件大小小于10000字节,过滤并不严谨

<?php

if( isset( $_POST[ 'Upload' ] ) ) { // 检查表单是否提交了"Upload"按钮
// 定义目标上传路径
$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' ]; // 获取上传文件的类型
$uploaded_size = $_FILES[ 'uploaded' ][ 'size' ]; // 获取上传文件的大小 // 检查是否为图像文件
if( ( $uploaded_type == "image/jpeg" || $uploaded_type == "image/png" ) && // 如果是JPEG或PNG格式
( $uploaded_size < 100000 ) ) { // 并且文件大小小于100000字节(约100KB) // 尝试将文件移动到上传文件夹
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>'; // 提示用户只接受JPEG或PNG格式的图像
}
}
?>

high

根据提示只允许上传图片文件,上传一个jpg图片结果上传失败

上传并抓包,发送到重放器

添加文件头即可,GIF89a

源码审计

限制了文件后缀及文件内容是否有效,对文件类型过滤不严谨,如果添加文件头,则会被解析为一个jpg文件,就可以正常上传

<?php

if( isset( $_POST[ 'Upload' ] ) ) { // 检查是否有提交的"Upload"表单
// 定义目标写入路径
$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' ]; // 获取上传文件的临时存储路径 // 检查文件是否为图像
if( ( strtolower( $uploaded_ext ) == "jpg" || strtolower( $uploaded_ext ) == "jpeg" || strtolower( $uploaded_ext ) == "png" ) && // 如果扩展名是jpg、jpeg或png(不区分大小写)
( $uploaded_size < 100000 ) && // 并且文件大小小于100000字节(约100KB)
getimagesize( $uploaded_tmp ) ) { // 并且临时文件是有效图像 // 尝试将文件移动到上传文件夹
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>'; // 提示用户只接受JPEG或PNG格式的图像
}
}
?>

impossible

源码审计

非常严格的过滤,对上传的文件进行了重命名(搞了一个MD5的加密),还增加了token值的校验,对文件的内容也做了严格的检查。

<?php

if( isset( $_POST[ 'Upload' ] ) ) { // 检查是否提交了"Upload"表单
// 检查反CSRF令牌
checkToken( $_REQUEST[ 'user_token' ], $_SESSION[ 'session_token' ], 'index.php' ); // 验证用户令牌是否与会话令牌匹配 // 文件信息
$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' ]; // 获取上传文件的临时存储路径 // 设置目标写入路径
$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; // 生成临时文件的完整路径 // 检查文件是否为图像
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 ) ) { // 检查文件是否为有效图像 // 去除任何元数据,通过重新编码图像(推荐使用php-Imagick替代php-GD)
if( $uploaded_type == 'image/jpeg' ) { // 如果文件类型为JPEG
$img = imagecreatefromjpeg( $uploaded_tmp ); // 创建JPEG图像
imagejpeg( $img, $temp_file, 100); // 以最高质量重新编码并保存到临时文件
}
else { // 如果文件类型为PNG
$img = imagecreatefrompng( $uploaded_tmp ); // 创建PNG图像
imagepng( $img, $temp_file, 9); // 以最高压缩率重新编码并保存到临时文件
}
imagedestroy( $img ); // 销毁图像资源以释放内存 // 尝试将文件从临时文件夹移动到目标路径
if( rename( $temp_file, ( getcwd() . DIRECTORY_SEPARATOR . $target_path . $target_file ) ) ) { // 如果移动成功
// 上传成功
$html .= "<pre><a href='{$target_path}{$target_file}'>{$target_file}</a> successfully uploaded!</pre>"; // 显示上传成功的消息,并提供文件链接
}
else { // 如果移动失败
// 上传失败
$html .= '<pre>Your image was not uploaded.</pre>'; // 提示用户图像未上传
} // 删除任何临时文件
if( file_exists( $temp_file ) ) // 如果临时文件存在
unlink( $temp_file ); // 删除临时文件
}
else { // 如果文件不符合条件
// 提示无效文件
$html .= '<pre>Your image was not uploaded. We can only accept JPEG or PNG images.</pre>'; // 提示用户只接受JPEG或PNG格式的图像
}
} // 生成反CSRF令牌
generateSessionToken();
?>

DVWA靶场File Upload(文件上传) 漏洞所有级别通关教程及源码审计的更多相关文章

  1. DVWA之File Upload (文件上传漏洞)

    目录 Low: Medium: 方法一:抓包修改文件的type 方法二:00截断 High: Impossible : Low: 源代码: <?php if( isset( $_POST[ 'U ...

  2. DVWA靶机--简单的文件上传漏洞

    简单的文件上传漏洞(靶机安全级别:low) 事先准备好一句话木马,密码为pass 上传一句话木马,显示上传路径(一般网站是不会显示路径的,这里靶机为了方便你测试漏洞,直接显示出了路径: ../../h ...

  3. jQuery File Upload 文件上传插件使用一 (最小安装 基本版)

    jQuery File Upload 是一款非常强大的文件上传处理插件,支持多文件上传,拖拽上传,进度条,文件验证及图片音视频预览,跨域上传等等. 可以说你能想到的功能它都有.你没想到的功能它也有.. ...

  4. jQuery File Upload文件上传插件简单使用

    前言 开发过程中有时候需要用户在前段上传图片信息,我们通常可以使用form标签设置enctype=”multipart/form-data” 属性上传图片,当我们点击submit按钮的时候,图片信息就 ...

  5. jQuery File Upload 文件上传插件使用二 (功能完善)

    使用Bootstrap美化进度条 Bootstrap现在几乎是人尽皆知了,根据它提供的进度条组件, 让进度条显得高大尚点 正因为其功能强大,js模块文件之间牵连较深 不好的地方耦合度非常高 重要的参数 ...

  6. jquery file upload 文件上传插件

    1. jquery file upload 下载 jquery file upload Demo 地址:https://blueimp.github.io/jQuery-File-Upload/ jq ...

  7. PHPcms9.6.0任意文件上传漏洞直接getshell 利用教程

    对于PHPcms9.6.0 最新版漏洞,具体利用步骤如下: 首先我们在本地搭建一个php环境,我这里是appserv或者使用phpnow (官网下载地址:http://servkit.org/) (只 ...

  8. DVWA各等级文件上传漏洞

    file upload 文件上传漏洞,攻击者可以通过上传木马获取服务器的webshell权限. 文件上传漏洞的利用是 够成功上传木马文件, 其次上传文件必须能够被执行, 最后就是上传文件的路径必须可知 ...

  9. DVWA 黑客攻防演练(五)文件上传漏洞 File Upload

    说起文件上传漏洞 ,可谓是印象深刻.有次公司的网站突然访问不到了,同事去服务器看了一下.所有 webroot 文件夹下的所有文件都被重命名成其他文件,比如 jsp 文件变成 jsp.s ,以致于路径映 ...

  10. 【DVWA】File Upload(文件上传漏洞)通关教程

    日期:2019-08-01 17:28:33 更新: 作者:Bay0net 介绍: 0x01. 漏洞介绍 在渗透测试过程中,能够快速获取服务器权限的一个办法. 如果开发者对上传的内容过滤的不严,那么就 ...

随机推荐

  1. 为什么说Kafka还不是完美的实时数据通道

    本文主要谈谈Kafka用于实时数据通道场景的缺陷,以及如何在架构上进行弥补. Kafka归属于消息队列类产品,其他竞品还有RabbitMQ.RocketMQ等,总的来说它们都是基于生产者.中介和消费者 ...

  2. PHP中$GLOBALS和global的区别,简单了解符号表、zval

    前言 单位里有一套老代码,写了这么一个换库逻辑. function conn() { global $conn; if ($conn) { unset($conn); } $conn = mysqli ...

  3. Web渗透10_CSRF SSRF

    1 CSRF漏洞 CSRF 跨站请求伪造(英语:Cross-site request forgery),也被称为 one-click attack 或者 session riding,通常缩写为 CS ...

  4. Web渗透02_信息搜集

    以两个测试工具官方给出的用于工具实践的网站.一定不要拿在运营的网站做测试. http://testfire.net http://vulnweb.com DNS信息搜集 关注域名注册商,管理员的邮箱电 ...

  5. VueJS实现迷糊查询

    原文请查看公共号 前置条件: 开发环境:windows 开发框架:vue2.5 ,vue-cli 4.0+ 编辑器:HbuilderX 兼容版本:vue2.5     Chrome 99.0.4844 ...

  6. 如何使用ConsulManager来优雅的管理主机监控与站点监控

    概述 ConsulManager是一个使用Flask+Vue开发的Consul WEB管理工具,比官方自带的WEB UI实现了更多的功能. 可以方便的对Consul Services进行增删改查,支持 ...

  7. 如何使用强化学习算法解决贪吃蛇问题(Neural Network Learns to Play Snake)

    相关: Neural Network Learns to Play Snake https://github.com/greerviau/SnakeAI/ RL算法是有很多baseline算法的,算法 ...

  8. SSH通过本地开端口打远程隧道

    ssh -R 你想让别人连得端口:带外IP:22 root@内网跳板机 -p内网跳板机端口 例如: ssh -R 8888:172.22.200.1:22 root@10.11.11.11 -p202 ...

  9. 题解:CF687C The Values You Can Make

    CF687C The Values You Can Make 题解 题目翻译感觉不明不白的(至少我看了几遍没看懂),这里给个较为清晰的题面. 题目描述 给你 \(n\) 个硬币,第 \(i\) 个硬币 ...

  10. .NET Core 反射底层原理浅谈

    简介 反射,反射,程序员的快乐. 前期绑定与后期绑定 在.NET中,前期绑定(Early Binding)是指在编译时就确定了对象的类型和方法,而后期绑定(Late Binding)或动态绑定是在运行 ...