★★免责声明★★
文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与学习之用,读者将信息做其他用途,由Ta承担全部法律及连带责任,文章作者不承担任何法律及连带责任。
1、前言
春节后第一篇,祝大家龙年一切顺利,开始调整调整,再过几天就上班啦!我春节期间休息几天没有更新,但跑步不间断,每天室内慢跑60分钟+,所以没有长胖。你春节期间有坚持运动吗?
接下来会分享反序列化几个常见漏洞(shiro、weblogic和fastjson):原理和复现,可能会有3~4个篇幅,具体以实际为准。
2、序列化和反序列化
序列化就是把对象转换成字节流,便于保存在内存、文件、数据库中,保证对象的完整性和可传递性;反序列化即逆过程,由字节流还原成对象。 根据字节流中保存的对象状态及描述信息,通过反序列化重建对象。在PHP中序列化和反序列化对应的函数分别为serialize()和unserialize()。
常见序列化出现场景:
1.远程和进程间通信(RPC/IPC)
2.连线协议、 Web服务、消息代理
3.缓存/持久性存储区
4.数据库、缓存服务器、文件系统
5.HTTP cookie、 HTML表单参数、 API身份验证令牌
3、反序列化漏洞原理
当程序在进行反序列化时,会自动调用一些函数,以PHP为例有__wakeup()
,__destruct()
等函数, Java中有readObject()
方法等,但是如果传入函数的参数可以被用户控制的话,用户可以输入一些恶意代码到函数中,从而导致反序列化漏洞。
常见危害:
1.远程代码执行,如:system(‘whoami’)等
2.重放攻击
3.注入
4.特权提升
4、Shiro反序列化漏洞原理
AES加密的密钥Key被硬编码在代码里,由于Shiro源码开源,意味着每个人通过源代码都能拿到AES加密的密钥。因此,攻击者构造一个恶意的对象,并且对其序列化、AES加密、 base64编码后,作为cookie的rememberMe字段发送。 Shiro将rememberMe进行解密并且反序列化,最终造成反序列化漏洞。
漏洞影响版本
Apache Shiro <=1.2.4
4.1、解析步骤
1.检索RememberMe cookie 的值;
2.Base 64解码;
3.使用AES解密(加密密钥硬编码);
4.进行反序列化操作,生成用户登录信息对象(未作过滤处理),在调用反序列化时未进行任何过滤,导致可以触发远程代码执行漏洞。
4.2、漏洞特征
返回包中存在 rememberMe=deleteMe 字段
5、CVE-2016-4437漏洞复现
docker环境搭建详见《kali系统安装docker和部署vulhub服务》
5.1、启动靶场环境
# 先切到对应目录
cd /home/kali/vulhub-master/shiro/CVE-2016-4437
# 开启靶场
docker-compose up -d
# 查看靶场启动情况
docker-compose ps
5.2、访问靶场
访问:http://your-ip:8080
5.3、查看漏洞说明
在靶场启动同一个目录有一个README.md
文档,说明漏洞原理,测试账号:admin/vulhub
和漏洞重现步骤说明。
5.4、确定注入点
使用Burp suite抓包,未登陆的情况下,请求包的cookie中没有rememberMe字段,返回包set-Cookie里也没有deleteMe字段。
登陆失败或成功,不管有没有勾选RememberMe字段,返回包都会有rememberMe=deleteMe字段。但是如果不勾选RememberMe字段,登录成功后所有请求中Cookie都不会有rememberMe字段
5.4.1、未登录时
5.4.2、登录失败,无勾选
5.4.3、登录成功,勾选,访问其他页面
5.5、利用工具
5.5.1、shiro_attack_2.2
爆破链利用,结合burp suite工具代理使用。
命令执行
6、下期内容预告
下期内容继续分享Shiro另外两个漏洞复现:CVE-2019-12422和CVE-2020-1957,敬请关注我的公众号,持续更新中…
7、资料获取
如果需要Shiro漏洞利用工具,请关注公众号:大象只为你,后台回复:shiro漏洞。