Shiro-550反序列化漏洞复现

前言

 过去的几个月里,发生了太多的事,导致多日未更新,不过,却发现粉丝不减反增,让我甚是感慨,感谢各位的关注,话不多说,开干。

近日,由于种种不可描述的原因,扫到个Shiro反序列化漏洞,于是乎开始研究如何复现,便有了下面这篇文章,我将会从以下几个方面进行展开讲述:1.Shiro反序列化漏洞是什么;2.如何复现shiro反序列化漏洞;3.如何修复Shiro反序列化漏洞;

 

Shiro反序列化漏洞是什么?

我们先来了解下Shiro是什么吧,百度曰:Apache Shiro是一个强大且易用的Java安全框架,执行身份验证、授权、密码和会话管理。使用Shiro的易于理解的API,您可以快速、轻松地获得任何应用程序,从最小的移动应用程序到最大的网络和企业应用程序。

那么什么是序列化,什么又是反序列化呢?在Java中,把Java对象转换为字节序列(json/xml)的过程叫序列化。反过来,把字节序列(json/xml)恢复为Java对象的过程就叫反序列化。

那么这个漏洞是怎么来的呢?在Shiro 1.2.4以前的版本里面,Shiro会先将用户信息加密,然后序列化后保存在rememberMe这个Cookie里面,这样一来,可以省去用户短时间内再次登录输入账号密码的操作了。但问题偏偏就出现在这里,很多开发同学并不会去修改这个默认的对称加***,于是给了黑客可趁之机,我可以用这个**去构造任意命令,插入rememberMe这个Cookie,然后实现远程控制服务器的目的。

如何复现Shiro反序列化漏洞?

首先来了解下Shiro 1.2.4及以下版本中rememberMe生成过程:1.序列化对象;2.对序列化的数据进行AES加密;3.将加密后的数据进行base64编码;4.发送rememberMe cookie;

一次偶然的机会,我拿到了xray高级版本的一个月体验,正好今年又新增了shiro漏洞一键检测功能(详情见这里:点我)。

我结合xray和Burp Suite(下文简称bp)来进行复现:

1.把xray的流量打到bp里面,在bp里面开启代理,我这里设置端口为8080


2.xray中找到config.yaml文件,修改下图所示位置,修改为bp代理的ip和端口

3.使用xray高级版shiro插件进行扫描得到下图结果,
xray webscan --url "http://xxx.xxx.com/" --plugins shiro

从结果看来已经拿到了key,但是显然xray并没有回显,但是别忘了,咱们可是走了bp的,可以从那里看下有没有相关的信息,

        显然可以看到下面有一长串的cookie,凭借你敏锐的白帽直觉,这个应该就是xray构造的payload了,通过rememberMe Cookie发送过去
       那么问题就简单了,要想回显,那么在请求头中添加Testcmd,后面带的值为要执行的命令,如下图右边的返回,已经成功拿到ip相关信息,至此,复现完成,告知厂商,再继续下去警察叔叔将会送我一副银手镯了

其实进行到这里你或许会问,为什么要在请求头加Testcmd?你怎么就知道加这个能进行远程执行任意命令?我想说,我现在也纳闷呢,不过,我猜测,这个可能是xray的payload内置的一个自定义请求头,本文操作参考吾爱漏洞大佬的文章,放上大佬链接:shiro新姿势:初探xray高级版shiro插件,欢迎大家留言/私信讨论。

如何修复Shiro反序列化漏洞

有以下办法:

1.升级shiro至1.2.4以上版本

2.修改Key的编码,修改Shiro源代码AbstractRememberMeManager中的Key值,然后替换到jar包里,不公开

3. 生成随机编码,在Shiro配置文件中把SecurityManage加入rememberMeManager的配置,然后调用生成Key值得方法,随机生成,可参考文章(http://www.javashuo.com/article/p-tvmvwpon-ua.html)的做法。