本系列文章将详细分析 Java 流行框架 Struts2 的历史漏洞,今后关于 Struts2 新的漏洞分析,也将更新于 Struts2-Vuln 项目上。该系列仅是笔者初学 Java代码审计 的一些记录,也希望能够帮助到想学习 Java代码审计 的朋友 。如有任何问题,欢迎 issue 。分析文章均来自 个人博客 ,转载请注明出处。
漏洞概要
Struts2-004是一个目录遍历漏洞。
影响版本: Struts 2.0.0 - 2.0.11.2、Struts 2.1.0 - 2.1.2 。更多详情可参考官方通告:https://cwiki.apache.org/confluence/display/WW/S2-004
漏洞环境
Apache Tomcat/6.0.10+struts-2.0.8
下载地址:http://archive.apache.org/dist/struts/binaries/struts-2.0.8-all.zip
https://archive.apache.org/dist/tomcat/tomcat-6/v6.0.10/bin/apache-tomcat-6.0.10.zip
漏洞分析
本次漏洞,主要问题出现在 FilterDispatcher 类对静态资源文件的处理。当请求资源文件路径以 /struts 开头时,就会调用 findStaticResource 方法寻找资源。
跟进 findStaticResource 方法,我们发现如果文件后缀不为 .class ,则调用 findInputStream 来读取文件内容,而且文件路径会进行一次 URLdecode ,但是这里没有对文件名进行任何过滤,这也导致了路径穿越问题。
例如,访问:http://localhost:8081/struts2_004/struts/..%252f
漏洞修复
下图右边为官方修复后的代码(左图struts-core-2.0.8,右图为struts-core-2.0.12),可以明显看到修复代码,使用 URL.getFile() 获取文件的真实路径,然后在用 endWith 来判断后缀,二者结合可以有效解决路径穿越问题。