什么,shiro又报路径遍历漏洞?
上周五,我正在外地出差,群里突然蹦出一条消息, shiro 报出路径遍历漏洞,CVE编号是CVE-2023-34478。 CVE 官方描述如下 :
Apache Shiro, before 1.12.0 or 2.0.0-alpha-3, may be susceptible to a path traversal attack that results in an authentication bypass when used together with APIs or other web frameworks that route requests based onnon-normalized requests. Mitigation: Update to Apache Shiro 1.12.0+ or 2.0.0-alpha-3+
这已经是我今年收到的第三条 shiro 安全漏洞了,这次又是咋回事什么是遍历,到底严不严重, POC 是什么。由于漏洞太新,网上资料太少。 360 这些安全厂商也只是把内容翻译成中文,说:
Apache shiro 如果使用非规范化请求路由请求的API或其他web框架一起使用时,可能导致身份验证绕过。
这个解释主打的就是一个直译,英文官网说non-normalized requests,咱们就翻译为非规范化请求。非规范化请求是造成漏洞攻击的核心原因什么是遍历,那什么是非规范化请求呢?网上查了一些资料,没查到有用的信息。那我们就换一种方案,我们直接去看 shiro 为了修改这个漏洞,改了哪些代码,就可以推导出什么是非规范化请求了。
通过搜索 shiro 在 github 上的提交记录,找到相应的 commit : 。
shiro 通过修改InvalidRequestFilter, 它加了一个isNormalized方法,如果返回 false ,则认为该请求不合法,直接拒绝。
private static final List<String> FORWARDSLASH = Collections.unmodifiableList(Arrays.asList("%2f", "%2F"));
private static final List<String> PERIOD = Collections.unmodifiableList(Arrays.asList("%2e", "%2E"));
/**
* Checks whether a path is normalized (doesn't contain path traversal sequences like
* "./", "/../" or "/.")
* @param path the path to test
* @return true if the path doesn't contain any path-traversal character sequences.
*/
private boolean isNormalized(String path) {
if (path == null) {
return true;
}
for (int i = path.length(); i > 0;) {
int slashIndex = path.lastIndexOf('/', i - 1);
int gap = i - slashIndex;
if (gap == 2 && path.charAt(slashIndex + 1) == '.') {
return false; // ".", "/./" or "/."
}
if (gap == 3 && path.charAt(slashIndex + 1) == '.' && path.charAt(slashIndex + 2) == '.') {
return false;
}
i = slashIndex;
}
return true;
}
注释上写着:
Checks whether a path is normalized (doesn’t contain path traversal sequences like “./”, “/../” or “/.”)
意思就是非规范化请求表示含有路径遍历的请求,如”./”,”/../”或者”/.”。这些路径可以直接跳到上一级目录,这也是典型的路径遍历漏洞利用方式。 之前常见的文件下载路径遍历漏洞,假设有一个文件下载请求:
:port/download?path=relative-path
正常请求这个relative-path传的是下载文件的相对路径,绝对路径由应用本身控制,但是攻击者可以通过传../../abc,跑到绝对路径控制之外,这样就可以遍历下载整个操作系统里的文件了。
URL 也同样支持../语法。下面两个请求是等价的,访问的是同样的请求地址:
:port/api/v1/need-auth
vs
:port/api/v1/no-need-auth/../need-auth
下面的请求先跑到/no-need-auth, 再通过../跑到上级路径v1,再跑到/need-auth,就又回到了:port/api/v1/need-auth。
那这样有什么用呢?看下图
Shiro 通过修改 InvalidRequestFilter 进行拦截,如果发现有路径遍历参数,则直接拒绝。
综上所述,如果要攻击成功,需要具备以下条件
如果满足以上三点要求,则可能被攻击成功,否则没有影响。不过为了安全起见,各项目也应规划升级。
限 时 特 惠: 本站每日持续更新海量各大内部创业教程,加站长微信免费获取积分,会员只需38元,全站资源免费下载 点击查看详情
站 长 微 信: thumbxmw