
漏洞公告:https://github.com/alibaba/fastjson/wiki/security_update_20170315
0x00 关于漏洞
漏洞公告:https://github.com/alibaba/fastjson/wiki/security_update_20170315
0x01 POC分析
参考的网上的POC
POC
1 | public class FastJsonPoc extends AbstractTranslet { |
DEMO
1 | public class FastjsonVulTest { |
String testJson = "{\"@type\":\"" + NASTY_CLASS + "\",\"_bytecodes\":[\""+evilCode+"\"],'_name':'a.b','_tfactory':{ },\"_outputProperties\":{}}\n";
将JSONString
转换成@type
指定的TemplatesImpl
类,即com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl
_bytecodes
是恶意利用代码的字节码(FastJsonPoc)
设置了4个属性和对应的值:_bytecodes
、_name
、_tfactory
和_outputProperties
通过查看TemplatesImpl
的代码发现,_tfactory
和_outputProperties
属性没有对应getter/setter
方法
_bytecodes
_name
fastjson会在new TemplatesImpl实例并调用其空参构造函数之后,会依次遍历JSONString中设置的属性和值,并按顺序执行set{属性名}/get{属性名}的方法,如果不存在对应该格式的方法(get之后的第一个字母大写跟叔姓名),则直接对该对象对应的属性值进行赋值
所以当fastjson
发现在TemplatesImpl
中找不到setBytecodes()/getBytecodes()
方法时,会直接对TemplatesImpl
中的_bytecodes
属性强赋值,而不会去调用代码里面定义的setTransletBytecodes()/getTransletBytecodes()
这样来看,_name
和_tfactory
属性的setter/getter
方法的格式是不对的,因此又被fastjson
强赋值,但是当遍历到_outputProperties
属性时,发现存在一个getOutputProperties()
方法(然而这个方法并不是_outputProperties
方法的get方法),fastjson
会立即执行调用该方法
(*上边这部分全靠参考大佬的文章才理解,不过不公开,在这说明下)*
在默认情况下,fastjson
只会反序列化公开的属性和域,而com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl
中_bytecodes
却是私有属性,_name
也是私有域,所以在parseObject
的时候需要设置Feature.SupportNonPublicField
,这样_bytecodes
字段才会被反序列化
0x02 代码分析
getOutputProperties()
newTransformer()
getTransletInstance()
AbstractTranslet translet = (AbstractTranslet) _class[_transletIndex].newInstance();
对外部传入的java字节码生成的Class对象进行实例化,此处会调用该对象的构造函数,将触发自定义的代码
getTransletInstance()
1 | if (_bytecodes == null) { |
_bytecodes
就是JSONString
传入的字节码
1 | for (int i = 0; i < classCount; i++) { |
将_bytecodes
(外部传入的字节码)还原成class
对象,执行Runtime.getRuntime.exec()
参考:http://xxlegend.com/2017/04/29/title-%20fastjson%20%E8%BF%9C%E7%A8%8B%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96poc%E7%9A%84%E6%9E%84%E9%80%A0%E5%92%8C%E5%88%86%E6%9E%90/
https://github.com/alibaba/fastjson/wiki/security_update_20170315
- Post title:FastJson Unserialization
- Post author:langu_xyz
- Create time:2017-12-30 21:00:00
- Post link:https://blog.langu.xyz/FastJson Unserialization/
- Copyright Notice:All articles in this blog are licensed under BY-NC-SA unless stating additionally.