季纳尔多 發表於 2016-8-20 09:09:43

Struts2 S2-016漏洞修复总结

Struts2的S2-016漏洞是之前比较重大的漏洞,也是一些老系统的历史遗留问题 <br /><br />此漏洞影响struts2.0-struts2.3的所有版本,可直接导致服务器被远程控制从而引起数据泄漏,影响巨大 <br /><br />漏洞修复总结有4种方式: <br /><br /><strong>1、升级版本 <br /></strong><br />这也是Apache官方给出的建议,把Struts2的版本升级到2.3.15以上的版本,这种方式只需要替换一些jar包,归纳如下: <br /><br />commons-lang3-3.2.jar <br />freemarker-2.3.22.jar <br />javassist-3.11.0.GA.jar <br />ognl-3.0.6.jar <br />struts2-core-2.3.24.jar <br />struts2-spring-plugin-2.3.24.jar <br />xwork-core-2.3.24.jar <br /><br />只需要用上述jar包(版本可能会有差距)替换老系统中的旧版本jar包; <br /><br />但是这种方式存在一定的缺陷,如果系统非常复杂,可能会有版本不兼容,jar版本冲突,导致系统功能不能 使用的情况; <br /><br /><strong>2、覆盖JAR包</strong> <br /><br /><img alt="" src="https://img.jbzj.com/file_images/article/201608/201608200912081.jpg" /><br /><br />下载上述图片,把后缀名改为zip,把里面解压出来的三个文件夹添加到漏洞的系统的src目录下 <br /><br />然后再web.xml文件中添加代码:<br /><br><div class="msgheader"><div class="right"><span style="CURSOR: pointer" class="copybut"><u>复制代码</u></span></div>代码如下:</div><div class="msgborder" id="phpcode7"><br />&lt;listener&gt; <br />&lt;listener-class&gt;org.hdht.commonweb.listener.MyServletContextListener&lt;/listener-class&gt; <br /> &lt;/listener&gt; <br /></div><br />最后发布项目,重启服务器 <br /><br /><strong>3、修改Struts2的源码 <br /></strong><br />找到项目中的struts2-core-2.2.3.jar,反编译得到源码,在eclipse中新建一个java项目,把反编译的源码导进去 <br /><br />修改org\apache\struts2\dispatcher\mapper\DefaultActionMapper.java这个文件中的handleSpecialParameters方法 <br /><br />在while循环(for循环)中加入下面代码:<br /><br><div class="msgheader"><div class="right"><span style="CURSOR: pointer" class="copybut"><u>复制代码</u></span></div>代码如下:</div><div class="msgborder" id="phpcode8"><br />if (key.endsWith(".x") || key.endsWith(".y")) {<br />               key = key.substring(0, key.length() - 2);<br />             }<br /></div><br /><br />保存,这个新项目可能会有错误,需要导入两个jar包,xwork-core-2.1.6.jar和servlet-api.jar <br /><br />把这个新项目导出成jar包,把下图中的7个类,替换掉原先struts2-core-2.2.3.jar中的7个类<br /><img alt="" src="https://img.jbzj.com/file_images/article/201608/201608200912082.png" /><br /><br /><strong>4、结合上面的第2和第3种方式</strong> <br /><br />还是需要用到struts2的源码,同第3步,反编译得到源码,导入到一个新的项目中 <br /><br />下载第2步中的压缩包,解压之后得到三个文件,把这三个文件夹添加到新项目的 org\apache\struts2\dispatcher\mapper包中,如下图 <br /><img alt="" src="https://img.jbzj.com/file_images/article/201608/201608200912083.png" /><br /><br /><br />然后,再修改org\apache\struts2\dispatcher\mapper\DefaultActionMapper.java这个文件中的handleSpecialParameters方法 <br /><br />在while循环中加入如下代码:<br /><br><div class="msgheader"><div class="right"><span style="CURSOR: pointer" class="copybut"><u>复制代码</u></span></div>代码如下:</div><div class="msgborder" id="phpcode9"><br />if (JavaEEbugRepair.repair_s2_017(key)) {<br />                return;<br />            }<br />            if ((key.contains("action:")) || (key.contains("redirect:")) || (key.contains("redirectAction:"))) {<br />                return;<br />            }<br /></div><br /><br />保存,把新项目导出成jar包 <br /><br />把原来jar中的7个类替换,加入新包repair,再把替换之后的jar复制到项目中,替换之前的jar包 <br /><br />总结: <br /><br />以上4种方式基本能处理所有项目的S2-016漏洞;<br />
頁: [1]
查看完整版本: Struts2 S2-016漏洞修复总结