关于CVE-2016-4437漏洞描述
Apache Shiro 1.2.5之前的版本中,当没有为“记住我”功能配置密码密钥时,远程攻击者可通过未指定的请求参数执行任意代码或绕过预期的访问限制。
影响版本:Apache Shiro <= 1.2.4
漏洞原理
Apache Shiro框架提供了Remember Me功能,用户登录成功后会生成经过加密并编码的Cookie,即使关闭了浏览器,再次访问时无需进行登录操作即可以之前的身份访问网站。
默认情况下,Shiro使用CookieRememberMeManager,这将对用户身份进行序列化、加密和编码,以便以后检索。因此,当它收到来自未经身份验证的用户请求时,它将通过执行以下操作来查找其记住的身份:
- 检索rememberMe的cookie值
- Base64解码
- 使用AES解密
- 使用Java序列进行反序列化操作(ObjectInputStream)
但是,默认加密密钥是硬编码的,这意味着任何有权访问源代码的人都知道默认加密密钥是什么。因此,攻击者可以创建恶意对象,对其进行序列化、编码,然后将其作为cookie发送。然后Shiro将解码并反序列化,这意味着你的恶意对象现在在服务器上。通过仔细构造对象,可以让它们运行一些恶意代码。
(以上说明来自Apache官方说明:SHIRO-550官方说明)
所以我们就可以将我们想要上传的指令进行逆向操作,即使用Java序列进行序列化操作->使用AES加密->Base64编码,将得到的值作为rememberMe的值上传,这样就可以完成利用。
工具准备
- 攻击机kali(192.168.15.133)
- Linux服务器(CentOS7:192.168.15.148)
- Linux服务器下Docker环境
- shiro_exp.py(用于生成rememberMe的值,本文后面展示源码)
- ysoserial.jar(一个概念验证工具,用于生成利用不安全的Java对象反序列化的有效负载)
环境搭建
(需要预先配置好Docker环境)