Struts2 s2-016漏洞的完整解决方案



Struts2 s2-016漏洞的完整解决方案。Struts2 s2-016漏洞

这里不做过多描述,官方描述见下面网址:

http://struts.apache.org/release/2.3.x/docs/s2-016.html

解决方案(以struts 2.1.8.1版本为例)

1.下载struts 2.1.8.1 源码

struts-2.1.8.1-src.zip

下载完成后,记得进行MD5验证

2.eclipse建立一个war项目

3.将struts-2.1.8.1-src.zip内的源码拖到项目的src目录下

4.找到对应struts-2.1.8.1的xwork-core-2.1.6.jar放入war项目的WEB-INF/lib目录下

此目的就是为了避免java文件带红叉

5.修改org.apache.struts2.dispatcher.mapper.DefaultActionMapper.java

此时文件应该没有红叉.有红叉主要是缺乏servlet-api.jar和xwork-core-2.1.6.jar在buildpath中

改动如下: 这里采用网上jason.zhou的修改

找到handleSpecialParameters方法,做下面黑体字的修改:

public void handleSpecialParameters(HttpServletRequest request,
ActionMapping mapping) {
// handle special parameter prefixes.
Set uniqueParameters = new HashSet();
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
if (key.endsWith(“.x”) || key.endsWith(“.y”)) {
key = key.substring(0, key.length() – 2);
}


// — jason.zhou 20130708 add start — //
if ((key.contains(“redirect:”)) || (key.contains(“redirectAction:”)) || (key.contains(“action:”))) {
return;
}
// — jason.zhou 20130708 add end — //

// 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;
}
}
}
}

6.点中org.apache.struts2.dispatcher.mapper.DefaultActionMapper.java,右键,导出(export),导出为JAR file

存盘为test.jar

7.用winrar打开test.jar,拷贝出org/apache/struts2/dispatcher/mapper/下的DefaultActionMapper类,一共有7个文件

DefaultActionMapper$1.class

DefaultActionMapper$2$1.class

DefaultActionMapper$2$2.class

DefaultActionMapper$2$3.class

DefaultActionMapper$2$4.class

DefaultActionMapper$2.class

DefaultActionMapper.class

8.用winrar打开struts2-core-2.1.8.1.jar

进入org/apache/struts2/dispatcher/mapper/目录,将将上面拷贝出的7个文件拷贝入,覆盖原来的同名文件

9.将struts2-core-2.1.8.1.jar拷贝入你自己的项目,覆盖原来的struts2-core-2.1.8.1.jar

10.启动你的项目,重新s2-016漏洞进行测试

如果发现测试结果正常(不响应.do?action:,.do?redrect:,.do?redirectAction),则证明补丁打好,漏洞被堵住了.