漏洞复现-CVE-2016-4437-Shiro反序列化
概述
Apache Shiro是一个开源的安全框架,为Java应用程序提供安全功能。在Apache Shiro 1.2.4之前的版本中,存在一种可导致远程代码执行的漏洞,该漏洞由序列化和反序列化不当引起,其中,攻击者通过构造恶意的序列化数据,可以在未经授权的情况下执行任意的Java代码。
该漏洞的漏洞编号为CVE-2016-4437,本文将介绍如何复现该漏洞以及如何进行修复。
环境准备
本次漏洞复现采用Docker搭建环境,具体环境搭建方式如下:
- 拉取 zer0ne/cve-2016-4437 镜像,该镜像自带漏洞环境
docker pull zer0ne/cve-2016-4437
- 运行镜像
docker run -d -p 8080:8080 zer0ne/cve-2016-4437
- 访问 http://127.0.0.1:8080/shiro,即可进入漏洞环境
漏洞复现
漏洞分析
漏洞复现之前,我们先来了解一下 Shiro 框架中的两个类:
- Subject:表示一个执行主体,当前应用与客户端之间的交互都会在 Subject 中进行;
- Session:一个会话对象,保存 Subject 对象在应用程序上下文中的状态。
接下来,我们分析一下漏洞的具体实现方式。
通过分析,我们可以发现漏洞的原因在于 Shiro 框架对 Session 对象的序列化和反序列化。在默认情况下,Shiro 将会把 Session 对象写入 Cookie 中,导致该 Cookie 被篡改,成功实现了会话劫持。
复现步骤
为了复现该漏洞,我们需要模拟攻击者向受害者发送恶意数据,实现代码执行。受害者本来预期操作只是访问某个页面,但却被攻击者利用该漏洞执行了恶意代码。
具体步骤如下:
- 打开 NetCat 连接漏洞目标,我们需要提交恶意请求,尝试执行Payload。执行以下命令:
nc 127.0.0.1 8080
- 设置 Cookie:我们需要将恶意Cookie添加到 HTTP 头中。HTTP 头信息包含3个参数:UID、rememberMe、JSESSIONID。其中 JSESSIONID 是下文关键,也就是 Shiro 会话硬编码的前缀。
GET /shiro HTTP/1.1
Host: 127.0.0.1:8080
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:46.0) Gecko/20100101 Firefox/46.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3
Cookie: UID=test;rememberMe=deleteMe;JSESSIONID=1ohaol8q3ixe712levf23lt6of
- Payload 工具:受害者当前访问的页面地址为 /shiro,而 Shiro 框架在执行 URL 认证时会将 Cookie 中的 JSESSIONID 对应值作为 org.apache.shiro.subject.support.DefaultSubjectContext_SECURITY_MANAGER_SESSION_KEY 的 “键”。而在 DefaultSessionManager 中生成了一个 Session 对象,将它序列化后打包进 Cookie 并返回给浏览器。也就是说,在受害者访问 /shiro 这个地址时,将会触发反序列化攻击:
$ python shiro_cve-2016-4437.py 127.0.0.1 8080
- 实验结果
如果实验成功,我们将在控制台看到返回的 bash 标志表示已经进入了反弹 shell。此外,我们可以在另一个终端窗口中执行:
nc -lvp 1234
当受害者与服务器建立了反向 shell 之后,服务器将会将 shell 输出至控制台,并在终端窗口中启动一个本地监听器,以便我们输入命令。
修复方案
针对该漏洞,Apache Shiro 官方也已发布了修复方案,修复方式如下:
在 Shiro 框架中,可以通过在 shiro.ini 配置文件中增加 SessionStorageEvaluator 配置,来替换默认配置:
# 配置自定义 Session 存储
[main]
sessionDAO = com.demo.WarriorSessionDAO
securityManager.sessionManager.sessionDAO = com.demo.WarriorSessionDAO
通过这种方式,自定义的 Session 存储会替换默认的 Cookie 存储方式,从而解决该漏洞。
总结
本文介绍了 Apache Shiro 中的一个反序列化漏洞,在了解了漏洞的原理之后,实现了漏洞的复现,并介绍了漏洞的修复方案。该漏洞揭示了反序列化漏洞的危害性,提醒我们编写的程序要避免反序列化漏洞的发生。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:漏洞复现-CVE-2016-4437-Shiro反序列化 - Python技术站