漏洞概要
可参考官方安全公告:https://cwiki.apache.org/confluence/display/WW/S2-004
漏洞分析
攻击者可以使用双重编码的url和相对路径来遍历目录结构并下载“静态”内容文件夹之外的文件。
根据官方概述,得知漏洞存在的类为 FilterDispatcher
过滤器,一般在doFilter
方法中进行操作,我们将doFilter
进行断点
当resourcePath
的路径为/struts
会调用findStaticResource
方法
访问的静态文件不能以.class
结尾,其实这个限制没有什么用,然后遍历配置好的静态文件目录并调用 findInputStream
将访问的路径跟目录拼接在一起,然后 URL 解码,再调用 getResourceAsStream
开始读取文件,就造成了目录遍历漏洞。
POC:
1 | /struts/..%252f/ |
修复
加上了 cleanupPath、URL.getFile 和 endWith 来进行限制。