大佬教程收集整理的这篇文章主要介绍了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@
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_