屯昌县网站建设_网站建设公司_GitHub_seo优化
2025/12/18 1:07:46 网站建设 项目流程

实验环境我们在上一篇文章已经搭建好了,参考【全面实战】从搭建DVWA到全漏洞复现(1)

这里还需要用到一个集成bp和蚁剑或者中国菜刀

  • “中国菜刀/蚁剑”连接木马,拿到webshell(管理服务器文件、执行命令)。

我之前发表过一篇文章,是使用One-fox集成工具安装bp的文章one-fox集成工具Burpsuite配置,这个工具中集成了我们需要使用的,我也在那篇文章中说了bp的配置,此处我们直接实战,有问题可在评论区@我!

《法律与责任声明》

本内容仅用于网络安全中文件上传漏洞的技术研究、学习与交流。

一、合法性要求

  • 严格遵守《中华人民共和国网络安全法》及相关法律法规,严禁将所学技术用于非法活动,如未经授权的攻击、窃取信息等。例如,不得对未授权的真实生产环境网站做漏洞测试。
  • 漏洞测试须在合法授权环境进行,可使用自己搭建的DVWA靶场或获书面授权的目标系统,否则将担法律责任。

二、风险与责任

  • 参考本内容进行DVWA搭建和漏洞复现,可能有系统崩溃、数据丢失等风险,本人不承担直接或间接责任,请操作前备份数据、谨慎行事。
  • 若因参考本内容对第三方造成损失,本人不承担法律责任,使用者自行担责。

三、传播限制

  • 禁止将本内容用于恶意传播,如制作恶意教程、培训非法黑客组织,应维护良好网络安全环境。
  • 发现有人利用本内容非法活动,应及时举报。

四、版权声明

本文为本人独立创作,有完整知识产权。未经书面许可,任何单位或个人不得转载、复制或以其他方式使用,违者依法追责。

注:阅读并使用本内容即表示同意声明条款,不同意请停止使用。

一.引入

1.文件上传漏洞是什么?

文件上传漏洞指的是 Web 应用程序在处理用户上传文件的过程中,由于程序对上传文件的类型、大小、内容等方面的验证存在缺陷,使得攻击者能够上传恶意文件到服务器,并可能导致服务器被攻击、数据泄露等严重后果。简单来说,就是攻击者可以借助这个漏洞把有害文件放到目标服务器上。

2.一句话木马?

一句话木马本质上是一段简短的代码,通常以脚本语言编写,像 PHP、ASP、JSP 等。它能够被上传至 Web 服务器,一旦执行,攻击者就能够远程操控服务器,进而执行任意命令。

3.DVWA的文件上传漏洞实战分为四个等级:

Low

Medium

High

impossible

二. 客户端验证绕过漏洞(low)

1.原理

服务器既不检查文件后缀,也不验证文件类型,只要文件大小≤100K,就能直接上传。

2.实例

首先打开我们的网站

我们登录进来网站后先把等级设为low等级,然后点击submit

我们需要创建一个php文件,其中写入一句话木马

创建简单PHP后门(webshell)的步骤。

具体是:新建一个名为webshell.php的PHP文件,并在其中写入特定的PHP代码,该代码是一种常见的一句话木马形式。一句话木马是用于获取对目标服务器控制权限的恶意代码,通过将其上传到Web服务器中,攻击者可以利用它来执行任意PHP代码,进而可能进行诸如读取、修改、删除服务器文件,执行系统命令等恶意操作。

代码解释:

<?php @eval($_POST["123456"]);?>这段PHP代码的含义如下:

  • <?php?>:这是PHP的开始和结束标记,用于告诉服务器这段代码是PHP代码,需要按照PHP的语法规则进行解析和执行。
  • @:错误抑制操作符。它的作用是抑制紧跟其后的表达式在执行过程中可能产生的任何错误信息,使其不会在页面上显示出来。这样做可以避免因代码执行出错而向外界暴露一些可能敏感的错误提示信息,增加隐蔽性。
  • eval():这是PHP的一个危险函数,它可以将字符串形式的PHP代码作为PHP语句来执行。也就是说,传递给eval()函数的参数如果是一段有效的PHP代码,那么PHP解释器会把它当作正常的代码去运行。
  • $_POST["123456"]$_POST是PHP中的一个超全局变量,用于获取通过HTTP POST方法提交的数据。这里["123456"]表示从$_POST数组中获取键名为123456的值。也就是说,当攻击者通过POST方式向该PHP文件提交数据,并且数据中包含名为123456的键时,其对应的值就会被eval()函数执行。

此处我们直接上传创建的php文件

上传成功后会返回其上传路径

我们在服务器后台也可以看到上传成功

然后在one-fox集成工具打开蚁剑或者是自己下载的蚁剑

第一次使用蚁剑需要梯子下载所需资源(我演示)(有疑问欢迎来问我)

此处可能会出现这种错误

如果你安装的是one-fox,那其目录下应该就包含了需要的文件了,从新打开蚁剑选择到one-fox目录中的蚁剑目录即可!

不需要自己下载

打开蚁剑后在左面空白处右键添加数据,输入目标服务器的ip地址(注意如果是某个端口上需要写那个端口),然后再把刚刚上传后的返回的那个地址放上去,密码输入自己刚刚设置的

可以先测试连接性,然后点击左上角添加

右键可以对其进行虚拟终端,文件管理等


然后我们分析一下它的源码

可以看到四个等级的php代码

此处我们对这段php进行解析,了解其原理并对代码逻辑或者代码使用进行认识

源码分析:(单纯漏洞复现无需了解其源码者可跳过)

1. 检查表单提交
if(isset($_POST['Upload'])){

这行代码使用isset()函数检查$_POST数组中是否存在名为Upload的键。$_POST是一个超全局变量,用于接收通过 POST 方法提交的表单数据。如果存在Upload键,说明用户点击了上传按钮,代码将继续执行后续逻辑。

2. 确定上传目标路径
// Where are we going to be writing to?$target_path=DVWA_WEB_PAGE_TO_ROOT."hackable/uploads/";$target_path.=basename($_FILES['uploaded']['name']);
  • DVWA_WEB_PAGE_TO_ROOT是一个预定义的常量,代表 DVWA 网站根目录的路径。代码将其与hackable/uploads/拼接,得到上传目录的基础路径。
  • $_FILES是另一个超全局变量,用于处理文件上传。$_FILES['uploaded']['name']表示用户上传文件的原始文件名。basename()函数用于提取文件名的基本部分,将其追加到$target_path后面,最终得到文件要上传到的完整路径。
3. 移动上传文件
// 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>";}
  • move_uploaded_file()函数用于将上传到临时目录的文件移动到指定的目标路径。如果移动失败,会向$html变量追加一条错误信息;如果移动成功,会追加一条成功信息。

总之,因为Low级别完全没做安全检查,服务器把上传的PHP文件当成普通文件接收,而PHP文件在服务器上能直接执行,所以木马生效。

目前我们只需要到这里,后续我们可以通过这些知识对其进行一些其他的深入测试。

三. 服务器端 MIME 类型验证绕过漏洞(Medium)

服务器通过MIME类型判断文件是否为图片(只允许image/jpeg、image/png),文件大小≤100K。

1.原理:

服务器端通过检查文件的 MIME 类型(如 image/jpeg、text/plain 等)来判断文件的类型。然而,MIME 类型可以在 HTTP 请求头中被伪造,攻击者可以将恶意文件的 MIME 类型伪装成服务器允许的类型,从而绕过服务器的验证。

2.实例:

将模式改为medium

这个时候再直接上传一句话木马php文件,会提示上传失败。

然后我们还是选择上传那个php文件,bp开启抓包拦截(bp使用方法见[[one-fox集成工具Burpsuite配置]])

抓到数据后我们修改content-type(内容类型)为image/jpg或image/png,文件名改不改都无所谓,

文件名为webshell2.jpg或者是webshell2.png(2是因为方便与之前上传的区分)

然后点击“Forward”放行请求

这边显示上传成功

然后再蚁剑连接

服务器只看了这个MIME类型判断文件类型,不检查文件内容。我们把PHP文件的MIME类型改成图片的,服务器就误以为是图片,允许上传,而文件本质还是PHP脚本,能正常执行。

找其源码

源码分析:(单纯漏洞复现无需了解其源码者可跳过)

基于上一个等级的条件下添加了一些判断

1. 获取文件信息
// File information$uploaded_name=$_FILES['uploaded']['name'];$uploaded_type=$_FILES['uploaded']['type'];$uploaded_size=$_FILES['uploaded']['size'];
  • $uploaded_name:存储用户上传文件的原始文件名。
  • $uploaded_type:存储用户上传文件的文件类型。
  • $uploaded_size:存储用户上传文件的大小,单位为字节。
2. 检查文件类型、大小
// Is it an image?if(($uploaded_type=="image/jpeg"||$uploaded_type=="image/png")&&($uploaded_size<100000))
3. 处理无效文件
else{// Invalid file$html.='<pre>Your image was not uploaded. We can only accept JPEG or PNG images.</pre>';}

如果文件的类型、大小或合法性不符合要求,会向$html变量追加一条提示信息,告知用户文件未上传成功,且只能接受 JPEG 或 PNG 格式的图像文件。

四. 文件名解析漏洞(High)

原理:

双重检查

  • 后缀检查:只允许jpg、jpeg、png后缀,截取文件名最后一个“.”后的字符判断;
  • 文件头检查:用getimagesize()函数读取文件头,必须是合法图片,否则拒绝上传。(这就是我们所讲最好不要把一句话放到图片开头位置)

此处直接上传PHP或改MIME都会报错,就算你把mime改了后又把文件名也改了但识别到文件头信息并不符合,也无法上传

实例

我们真正上传一张图片而我们在这个图片中植入一句话,我们可以直接在图片源码中编辑

注意我们在编辑时不要把代码放在文件开头

最好放到文件末尾

成功!

或者可以使用进制编辑器工具

或者说使用命令生成。但要注意顺序,一定要先写图片后写txt,不然系统就会把txt文件的内容放在开头

copy 1.png/a+2.txt/b 3.jpg`

  • :这是一条copy命令,用于将图片文件1.png的内容与文本文件2.txt进行合并,生成新的图片文件3.jpg。其中:
    • 2.txt是包含要植入信息的文本文件。
    • /b参数表示以二进制模式处理2.txt文件。
    • .png是作为载体的原始图片文件。
    • /a参数表示以ASCII模式处理1.png文件(在这种合并操作的特定情境下使用)。
    • 3.jpg是最终生成的包含植入信息的图片文件。

上传成功

但文件后缀是jpg,服务器不会执行PHP代码,需要把它改成php后缀。

我们这里为实现目的就需要利用命令注入/文件包含漏洞重命名文件帮助我们使其变成php文件或者让其执行文件中的php代码。

命令注入漏洞和文件包含漏洞并不是同一种漏洞

命令注入漏洞

是指攻击者通过提交恶意构造的参数,利用应用程序对用户输入过滤不严格的漏洞,将恶意系统命令注入到应用程序中并执行。

例如,在一个基于Web的文件上传管理系统中,有一个功能是允许用户输入文件名来查看文件的详细信息,系统会执行类似ls -l [用户输入的文件名]的命令。如果攻击者输入; rm -rf /,由于系统没有对输入进行严格过滤,这个恶意命令就可能被执行。

再比如,在一个表单中有一个输入框用于输入用户名,系统会执行grep [用户名] userlist.txt命令来查找用户信息。攻击者可以在输入框中输入; rm -rf /,当系统执行该命令时,就会先执行grep [用户名] userlist.txt,然后执行rm -rf /,导致系统文件被删除。

文件包含漏洞

是指当应用程序在处理包含文件时,没有对用户输入的文件路径进行严格的验证和过滤,导致攻击者可以通过构造特殊的文件路径,包含恶意文件或敏感文件。

比如一个网站的新闻页面通过include($_GET['file'])来动态包含不同的新闻文件,攻击者可以构造一个特殊的URL,如http://example.com/news.php?file=../../etc/passwd(在Unix/Linux系统中,/etc/passwd包含了系统用户的信息),从而获取系统的敏感信息。

再比如,使用../来向上级目录跳转,从而包含系统的敏感文件或恶意文件。在Windows系统中,还可能会利用UNC路径(如\\192.168.1.1\share\malicious.php)来包含远程服务器上的恶意文件。

此处我们先利用命令注入漏洞

这里因为返回结果为乱码使用改了一下文件里的编码参数

就不乱码了

为实现目的此处我们先把等级改为low等级,然后进行命令执行漏洞中执行

127.0.0.1 |rename "C:\2.3\DVWA-2.3\hackable\uploads\3.jpg" "4.php"

这个命令执行漏洞后期会详细做

连接成功

或者还有一种方式是文件包含漏洞

在high模式下,打开文件包含漏洞处(file inclusion)

输入后下方有这些乱码的东西就是执行成功了,然后连接

此时我们再拿蚁剑连接,蚁剑不行就菜刀,反正就这两个来回使用哪个能成用哪个

找其源码

在这个目录下

对其进行解析

源码分析

1. 获取文件信息
// 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'];
  • $uploaded_name:存储用户上传文件的原始文件名。
  • $uploaded_ext:使用strrpos()函数找到文件名中最后一个点号(.)的位置,再使用substr()函数截取点号后面的部分,得到文件的扩展名。
  • $uploaded_size:存储用户上传文件的大小,单位为字节。
  • $uploaded_tmp:存储用户上传文件在服务器临时目录中的路径。
2. 检查文件类型、大小和合法性
// Is it an image?if((strtolower($uploaded_ext)=="jpg"||strtolower($uploaded_ext)=="jpeg"||strtolower($uploaded_ext)=="png")&&($uploaded_size<100000)&&getimagesize($uploaded_tmp)){
  • strtolower( $uploaded_ext ):将文件扩展名转换为小写,避免因大小写问题导致判断失误。代码会检查扩展名是否为jpgjpegpng
  • $uploaded_size < 100000:检查文件大小是否小于 100000 字节(约 97.7KB)。
  • getimagesize( $uploaded_tmp ):尝试获取图像的尺寸信息。如果文件是有效的图像文件,该函数会返回一个包含图像尺寸等信息的数组;如果不是有效的图像文件,函数返回false。只有当这三个条件都满足时,才会继续执行后续的文件移动操作。

五. 竞争条件漏洞(impossible)

对于impossible来说,安全做的非常严格

正在为impossible渗透学习中…

如有需要可参考大佬文章DVWA靶场通关笔记-文件上传(Impossible级别)_dvwa文件上传impossible源代码分析-CSDN博客

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询