目录
文章仅供学习,有问题欢迎指出。
1. 文件上传漏洞
漏洞编号
CVE-2018-18086
- web系统没有对文件进行检测或逻辑上做的不够严谨,文件上传这个操作是没有任何问题的,关键是上传之后是如何处理,解释文件的。
危害
文件上传漏洞可能导致以下危害 :
- 控制服务器:上传 WebShell 等脚本文件,获取服务器控制权。
- 远程命令执行:执行服务器上的任意命令,可能导致数据泄露或破坏。
- 内网渗透:利用服务器作为跳板,进一步渗透内网系统。
- 挖矿或构建僵尸网络:上传病毒或木马文件,利用服务器资源进行非法活动。
- 钓鱼或挂马:修改 Web 页面,进行欺诈或恶意代码植入。
1.1. 漏洞原理
- 核心问题
Web应用允许用户上传文件(如头像、图片、文档等),但未对上传文件的类型、内容、路径、权限进行充分验证,导致攻击者可上传恶意文件。 - 常见攻击目标
-
- 上传可执行脚本文件(如
.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脚本木马
- 大马
体积大,功能全,可以调用系统关键函数,以代码加密进行隐藏
- 小马
体积小,功能少;一般只有一个上传功能,用于上传大马
- 一句话木马
代码短;使用场景大,可单独生成文件,可插入文件;安全性高,隐藏性强,可变形免杀;框架不变,数据执行,数据传递;(像文章开头的php一句话木马)。
可以使用webshell管理器进行连接,也可指webshell是一句话木马
- 打包马
主要用于打包网站源码
- 拖库马
主要用于导出网站数据库
- 内存马
无文件落地;极难检测和发现;难以清除
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既可
放包,验证,成功