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

news/2025/1/9 4:17:17/文章来源:https://www.cnblogs.com/GuijiH6/p/18647155

文件上传

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

low

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

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

源码审计

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

<?phpif( 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字节,过滤并不严谨

<?phpif( 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文件,就可以正常上传

<?phpif( 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值的校验,对文件的内容也做了严格的检查。

<?phpif( 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();
?>

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

论文阅读:Transformer-XL: Attentive Language Models Beyond a Fixed-Length Context

Transformer可以接收一整段序列,然后使用self-attention机制来学习它们之间的依赖关系,但其在语言建模时受到固定长度上下文的限制(固定长度的输入、绝对位置编码的限制、注意力机制的计算复杂度)。 Transformer-XL以此为基础,引入一个片段级递归机制和一种新的位置编码方…

WPS 关闭个性化推荐

WPS>打开文件位置>打开第一个文件夹>继续打开文件夹>找到ksomisc.exe工具并双击打开>高级>功能定制:关闭个性化推荐I have a dream : Sandy beach B-J-N.

搭建一个简单的UVM验证平台

转载自 https://zhuanlan.zhihu.com/p/713891980 一. UVM 方法学简介 UVM(Universal Verification Methodology),又称作通用验证方法学。它起源于OVM(Open Verification Methdology),是由Cadence,Mentor和Synopsys联合推出的主流验证方法学;UVM方法学可以帮助我们搭建…

react学习之antd

antd为 Web 应用提供了丰富的基础 UI 组件,我们还将持续探索企业级应用的最佳 UI 实践。它最初是基于 React 的组件库,但随着技术的发展,现在也提供了基于 Vue.js 的版本——Antd Vue。无论你是 React 还是 Vue 的开发者,都可以利用 Antd 来丰富你的 Web 应用界面。antd 为…

windos server添加新用户

以Windows Server 2022举例子(该机器本身是一台轻量应用服务器)。 首先添加新用户:以管理员身份登录,选择“更改账户设置”: 选择 “其他用户” --> “将其他人添加到这台电脑”: 选择 “用户”: 单击鼠标右键,选择 “新用户”: 填写要创建的新用户信息: 选…

LLM2Vec: 解锁大语言模型的隐藏能力

LLM2Vec:重新定义大语言模型在自然语言处理中的应用一种名为 ** LLM2Vec ** 的新方法正在改变我们对大语言模型(LLMs)在自然语言处理(NLP)中的使用方式。 研究人员提出了一种创新方法,将通常仅用于生成文本的大型语言模型转化为更强大的文本理解和组织工具。这项技术有可…

将未来帧中的点 pts​ 对齐到当前帧

已知当前的rt矩阵,和未来下一帧的rt矩阵和未来下一帧的5个点pts,求把pts对齐到当前帧。import numpy as npdef align_points(rt_current, rt_future, pts_future):# 计算从未来帧到当前帧的相对变换矩阵rt_relative = np.linalg.inv(rt_current) @ rt_future# 将点转换为齐次…

基于甘特图的任务调度与跟踪工具

在当今复杂的项目管理领域,工具的种类繁多且功能各异。常见的项目管理工具包括禅道、Trello、Jira、Microsoft Project等。这些工具在不同层面上助力项目管理,从任务分配到进度跟踪,从团队协作到资源管理。甘特图作为一种直观且有效的任务调度与跟踪工具,在众多项目管理工具…

2024年项目管理软件的创新突破:数据分析与自动化的结合

项目管理软件在现代企业中的作用愈加重要,尤其是在快速变化和竞争激烈的环境中。随着技术不断发展,项目管理软件也在不断创新,以适应新的工作方式和需求。2024年,项目管理软件将不仅仅是一个任务管理工具,而是一个集成化平台,支持团队协作、数据分析、资源优化等多项功能…

分布匹配蒸馏:扩散模型的单步生成优化方法研究

扩散模型在生成高质量图像领域具有显著优势,但其迭代去噪过程导致计算开销较大。分布匹配蒸馏(Distribution Matching Distillation,DMD)通过将多步扩散过程精简为单步生成器来解决这一问题。该方法结合分布匹配损失函数和对抗生成网络损失,实现从噪声图像到真实图像的高效…

服务器负载过高,硬件升级后仍无法访问网站

当您的服务器因负载过高提示需要升级,且在完成硬件升级后仍然无法访问网站时,可能是由于多个方面的问题导致的。为了确保网站能够正常运行,请按照以下步骤进行排查和优化: 1. 检查Web服务状态 首先,确保Web服务器(如Apache、Nginx)正在运行。通过SSH登录到服务器,使用命…

配置无误的网站无法访问 - 云服务器问题

当遇到配置看似正确却仍无法访问的情况时,可以从以下几个方面进行排查:检查80端口状态:首先确认服务器的80端口是否畅通。使用命令行工具如netstat或ss来查看端口监听情况,确保Nginx确实在监听80端口。如果发现端口未被占用,可能是因为Nginx服务未启动或配置文件中指定了错…