Struts2 S2-016,S2-017远程代码执行漏洞解决,修复



最近客户打电话说之前的一个项目存在Struts2 S2-016漏洞,让我们尽快修复升级.然口立马通过struts漏洞利用工具(pass:be60)进行测试,果然存在这个漏洞(远程代码执行漏洞S2-016).

官网描述如下:

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

怎么解决呢?

  1. 按照官网说的升级到2.3.15以后,这样的话可能会出现未知的错误,因为之前版本是2.1.6.

  2. 在原来的版本上进行处理,修改源码.

下面来谈谈解决方案: (struts版本的2.1.6)

  1. 首先下载struts2 2.1.6的源码(struts-2.1.6-all.zip)并解压

  2. 然后再IDE中创建一个java项目并将struts-2.1.6\src\core\src\main\java文件加下的文件拷入src目录下

  3. 修改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-016S2—17漏洞.

4. 修改完成后将项目导出成jar,此时需要注意,由于这个类中的引用文件有些没找到,有红叉,所以这样打包会失败的,还需将xwork-core-2.1.6.jarservlet-api.jar这两个jar包加入项目中,此时该类的红叉消失,再进行导出jar.

            DefaultActionMapper.java有红叉导出的jar包是这样的:

           

             DefaultActionMapper.java加入jar包后无红叉是这样的:

            

5.右键jar包使用解压工具打开jar,将红框选中的7个文件复制替换项目中的这七个文件即可.     

6. 到这里漏洞就解决完成,使用struts漏洞利用工具无S2-016S2-017漏洞.

7.修改好后的struts2-core-2.1.6(pass:0182)文件.

发布了90 篇原创文章 · 获赞 21 · 访问量 47万+

猜你喜欢

转载自blog.csdn.net/yx13649017813/article/details/44646809
今日推荐