WEB安全--Java安全--shiro550反序列化漏洞
一、前言
什么是shiro?
shiro是一个Apache的Java安全框架
它的作用是什么?
Apache Shiro 是一个强大且灵活的 Java 安全框架,用于处理身份验证、授权、密码管理以及会话管理等功能
二、shiro550反序列化原理
1、用户首次登录并勾选记住密码功能,第一个请求包会多一个remember-me的参数
2、然后第一个回包中就会将用户登录信息进行>>序列化>>AES加密>>base64编码,并将该值存到Cookie的rememberMe参数中,并返回给客户端
3、当客户端发起第二个请求包时,该数据包中的Cookie就会携带rememberMe和它的值(密文)
然后服务端取出Cookie中的密文进行>>base64解码>>AES解密>>反序列化,然后就能取出用户登录信息进行校验
三、漏洞原因
在AES加解密的过程中,使用的是相同的秘钥,而在shiro版本<=1.2.24的版本中使用了固定的密钥kPH+bIxk5D2deZiIxcaaaA==,
所以攻击者就能通过相同的方式伪造Cookie中的密文,写入恶意代码,在服务端对Cookie中的数据进行反序列化时就会执行恶意代码。
图示:
四、利用思路总结
在我们知道shiro550版本框架存在反序列化漏洞后,就可以通过下面方式实现命令执行:
1、客户端首次用账号密码登录,勾选记住密码
2、响应包中的set-Cookie中存放着加密的用户信息密文
3、客户端再次访问服务端,请求包中的Cookie中就会存在rememberMe: 加密的用户信息密文
4、拦截这个请求包
5、构造payload(如CC链),将payload>>序列化>>AES加密>>base64编码
6、用构造的payload密文替换请求包中的rememberMe中的加密的用户信息密文
7、放包(请求包),服务端接收到我们更改后的请求包
8、JVM取出Cookie中的rememberMe中的密文进行>>base64解码>>AES解密>>反序列化
9、反序列化的readObject()触发CC链,实现命令执行