最近客户打电话说之前的一个项目存在Struts2 S2-016漏洞,让我们尽快修复升级.然口立马通过struts漏洞利用工具(pass:be60)进行测试,果然存在这个漏洞(远程代码执行漏洞S2-016).
官网描述如下:
http://struts.apache.org/release/2.3.x/docs/s2-016.html
怎么解决呢?
-
按照官网说的升级到2.3.15以后,这样的话可能会出现未知的错误,因为之前版本是2.1.6.
-
在原来的版本上进行处理,修改源码.
下面来谈谈解决方案: (struts版本的2.1.6)
-
首先下载struts2 2.1.6的源码(struts-2.1.6-all.zip)并解压
-
然后再IDE中创建一个java项目并将struts-2.1.6\src\core\src\main\java文件加下的文件拷入src目录下
-
修改org\apache\struts2\dispatcher\mapper\DefaultActionMapper.java这个文件中的handleSpecialParameters方法,在方法中加入如下红色代码:
<span style="font-size:14px;">public void handleSpecialParameters(HttpServletRequest request,
ActionMapping mapping) {
// handle special parameter prefixes.
Set<String> uniqueParameters = new HashSet<String>();
Map parameterMap = request.getParameterMap();
for (Iterator iterator = parameterMap.keySet().iterator(); iterator
.hasNext();) {
String key = (String) iterator.next();
// Strip off the image button location info, if found
<span style="color:#ff0000;"> <span style="color:#000000;">if (key.endsWith(".x") || key.endsWith(".y")) {</span>
</span>
key = key.substring(0, key.length() - 2);
}
<span style="color:#ff0000;">// 增加对action、redirect、redirectAction参数的过滤
if ((key.contains("action:")) || (key.contains("redirect:")) || (key.contains("redirectAction:"))) {
return;
}
</span>
// Ensure a parameter doesn't get processed twice
if (!uniqueParameters.contains(key)) {
ParameterAction parameterAction = (ParameterAction) prefixTrie
.get(key);
if (parameterAction != null) {
parameterAction.execute(key, mapping);
uniqueParameters.add(key);
break;
}
}
}
}
</span>
这样就能修复S2-016和S2—17漏洞.
4. 修改完成后将项目导出成jar包,此时需要注意,由于这个类中的引用文件有些没找到,有红叉,所以这样打包会失败的,还需将xwork-core-2.1.6.jar和servlet-api.jar这两个jar包加入项目中,此时该类的红叉消失,再进行导出jar包.
DefaultActionMapper.java有红叉导出的jar包是这样的:
DefaultActionMapper.java加入jar包后无红叉是这样的:
5.右键jar包使用解压工具打开jar包,将红框选中的7个文件复制替换项目中的这七个文件即可.
6. 到这里漏洞就解决完成,使用struts漏洞利用工具无S2-016和S2-017漏洞.
7.修改好后的struts2-core-2.1.6(pass:0182)文件.