2020年研究回顾总结
内容提要
本文总结了2020年网络安全研究,重点分析了SSTI模板注入、CommonsCollections反序列化、Fastjson及Shiro漏洞。核心是利用Java反射机制构造恶意链,实现远程代码执行。文中详述了各漏洞的Gadget链及利用方法,如通过反射修改权限或加载恶意类,并提及回显技术,为安全研究提供参考。
延伸解读
Java反射在漏洞利用中的核心地位
文章反复强调,SSTI、CommonsCollections、Fastjson等漏洞的利用链最终都依赖Java反射机制。例如,SSTI通过模板语法调用反射获取Runtime类,反序列化链则通过反射修改私有字段或调用方法。理解反射的底层原理,是分析这些漏洞的关键。
反序列化漏洞的利用条件与限制
文中指出,CommonsCollections3利用BadAttributeValueExpException触发,需借助反射修改私有字段;而CommonsCollections4则利用PriorityQueue的排序特性。此外,Shiro-550与Shiro-721的利用条件差异明显:前者只需已知密钥,后者需登录且爆破密钥,实用性较低。这提醒我们,漏洞利用的可行性受环境配置和版本影响。
回显技术的多样性
文章介绍了两种反序列化回显方法:defineClass异常回显和URLClassLoader远程加载。前者通过自定义类加载器加载恶意字节码,并利用异常抛出执行结果;后者则从远程或本地加载jar/class文件。这两种技术为攻击者提供了灵活的命令执行结果获取方式,也反映了防御方需关注类加载器的使用。
Q&A
SSTI模板注入漏洞的形成原因是什么?
SSTI服务端模板注入漏洞普遍存在于使用模板引擎进行模板解析和数据渲染的场景,其形成原因通常是模板语法加上Java反射,通过反射调用底层JDK方法实现攻击。
CommonsCollections3反序列化漏洞的Gadget链是如何利用反射的?
CommonsCollections3利用BadAttributeValueExpException类,通过反射修改其私有字段的权限,触发TiedMapEntry.toString(),进而调用LazyMap.get(),最终通过ChainedTransformer中的InvokerTransformer反射调用Runtime.exec()执行命令。
CommonsCollections4反序列化漏洞中PriorityQueue和TemplatesImpl是如何配合的?
CC4利用PriorityQueue的优先队列特性,在比较元素时触发TransformingComparator.compare(),进而调用InvokerTransformer反射调用TemplatesImpl.newTransformer(),加载植入的恶意字节码,最终执行命令。
反序列化回显中defineClass异常回显的原理是什么?
defineClass异常回显利用java.lang.ClassLoader的defineClass方法将恶意字节码转化为Class类,加载恶意类后执行命令,并将命令执行结果通过抛出异常的方式回显出来。
URLClassLoader远程加载文件回显是如何实现的?
URLClassLoader可以从远程或本地加载jar/class文件,通过URLClassLoader加载恶意类,然后反射调用其方法执行命令,实现回显。
Fastjson反序列化漏洞的触发条件是什么?
Fastjson在序列化时加入SerializerFeature.WriteClassName特征,会在结果中增加@type字段,反序列化时根据@type指定的类名实例化对象,攻击者可通过构造恶意@type值触发漏洞。
Shiro-550和Shiro-721漏洞的主要区别是什么?
Shiro-550使用已知密钥碰撞,条件较低;Shiro-721需要登录后爆破rememberMe的key值,条件较高。两者都是通过AES加密恶意Payload并Base64编码后发送,服务器解密后反序列化执行命令。
Weblogic IIOP 2551反序列化漏洞的利用方式是什么?
该漏洞利用IIOP协议,通过JtaTransactionManager类触发反序列化,使用JNDI绑定恶意对象,最终通过JtaTransactionManager的lookupUserTransaction方法加载远程恶意类执行命令。