• Shiro安全(五):Shiro权限绕过之Shiro-682&CVE-2020-13933


    0x00 前言

    上一篇文章大概讲述了一下shiro以及spring获取uri的流程,总的来说shiro权限绕过是因为shiro与spring在对同一个请求获取uri时的处理步骤不同导致的,下面讲的两个权限绕过漏洞也是基于该原因

    0x01 Shiro-682

    利用条件

    shiro < 1.5.2

    漏洞环境

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7Day60o6-1659880688266)(C:\Users\91136\AppData\Roaming\Typora\typora-user-images\image-20220807213249296.png)]

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rH291E41-1659880688267)(C:\Users\91136\AppData\Roaming\Typora\typora-user-images\image-20220807213317969.png)]

    漏洞分析

    利用的是 shiro 和 spring 对 url 中的 “;” 处理差别来绕过校验。

    uri获取逻辑

    shiro:具体方法WebUtils#getRequestUri,方法先调用 decodeAndCleanUriString 方法处理请求路径,再调用 normalize 方法标准化路径。当uri中存在封号时,删除掉封号后面所有内容

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2td21GEz-1659880688267)(C:\Users\91136\AppData\Roaming\Typora\typora-user-images\image-20220807212211677.png)]

    spring:方法是 UrlPathHelper#decodeAndCleanUriString ,方法名也叫 decodeAndCleanUriString,但是呢操作完全不同。对于spring来说,对于封号的处理规则是其会删除掉两个反斜线中封号后面的内容,然后解码然后将//转换为/

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XTgucxEI-1659880688267)(C:\Users\91136\AppData\Roaming\Typora\typora-user-images\image-20220807212414665.png)]

    所以说当payload为/admin/;/nice来说

    在shiro眼里就是:/admin

    PS:shiro在geturi后会将最后一个斜线删去,而/admin不匹配/admin/*

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EsAvpwfh-1659880688268)(C:\Users\91136\AppData\Roaming\Typora\typora-user-images\image-20220807212944306.png)]

    在spring眼里就是:/admin/nice

    所以绕过了shiro认证

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8itYpi9G-1659880688268)(C:\Users\91136\AppData\Roaming\Typora\typora-user-images\image-20220807213059969.png)]

    还有其他payload比如,但是无法在高版本使用,因为在高版本上不处理跨目录

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2U3I51ZG-1659880688268)(C:\Users\91136\AppData\Roaming\Typora\typora-user-images\image-20220807213439936.png)]

    就只能借助 shiro 一些配置问题尝试绕过:比如应用程序配置了访问路径 “/admin/**” 为 anon,但是指定了其中的一个 “/admin/nice” 为 authc。这时在不跳目录的情况下,可以使用如下请求绕过:

    http://127.0.0.1:8080/admin/;/nice
    
    • 1

    漏洞修复

    shiro 不再使用 request.getRequestURI() 来获取用户随意输入的请求路径,而是使用 request.getContextPath()request.getServletPath()request.getPathInfo() 进行拼接,直接获取中间件处理后的内容。

    这种获取方式会对uri进行解码,shiro-782就是利用该特性绕过的

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jBsKXwKx-1659880688269)(C:\Users\91136\AppData\Roaming\Typora\typora-user-images\image-20220807213733390.png)]

    0x02 CVE-2020-13933

    利用条件

    shiro < 1.6.0

    漏洞环境

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OUUplCfJ-1659880688269)(C:\Users\91136\AppData\Roaming\Typora\typora-user-images\image-20220807214133634.png)]

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mU3VWEMf-1659880688269)(C:\Users\91136\AppData\Roaming\Typora\typora-user-images\image-20220807214140233.png)]

    漏洞分析

    在shiro 1.5.3中利用servletPath + pathInfo 的加法思路获取uri

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-A1Cs2j81-1659880688270)(C:\Users\91136\AppData\Roaming\Typora\typora-user-images\image-20220807214327819.png)]

    方法逻辑如下,里面均用request.getxxx,request.getXX 方法,会进行 URL 解码操作。

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nXRoxJ3m-1659880688270)(C:\Users\91136\AppData\Roaming\Typora\typora-user-images\image-20220807214345866.png)]

    uri获取逻辑

    Shiro:先 URL 解码,再处理分号,然后标准化路径

    Spring:先处理分号,再 URL 解码,然后标准化路径。下面图就是spring获取uri逻辑

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-82cccSMR-1659880688270)(C:\Users\91136\AppData\Roaming\Typora\typora-user-images\image-20220807212414665.png)]

    当payload为/admin/%3baaa时

    在shiro眼里uri就是:/admin

    在spring眼里uri就是:/admin/;aaa

    所以绕过了shiro认证

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AqmNDWO9-1659880688270)(C:\Users\91136\AppData\Roaming\Typora\typora-user-images\image-20220807214856977.png)]

    漏洞修复

    shiro 没有改动现有的处理逻辑,而是选择了使用全局过滤和处理的方式

    Shiro 创建了一个 global 的 filter:InvalidRequestFilter,用来过滤和阻断有危害的请求,会返回 400 状态码,其中包括:

    • 带有分号的请求;
    • 带有反斜线的请求;
    • 非 ASCII 字符。

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2mEQVhc8-1659880688271)(C:\Users\91136\AppData\Roaming\Typora\typora-user-images\image-20220807215230709.png)]

    0x03 总结

    总的来说就是shiro与spring在对同一个请求获取uri时的处理步骤不同,导致攻击者构造特殊的uri既可以绕过shiro认证且能够访问controller

    0x04 参考文章

    https://su18.org/post/shiro-3

    https://www.yuque.com/tianxiadamutou/zcfd4v/emcdeq

    https://blog.csdn.net/weixin_43263451/article/details/126212097

  • 相关阅读:
    Nginx架构详解
    代码随想录训练营二刷第十六天 | 104.二叉树的最大深度 559.n叉树的最大深度 111.二叉树的最小深度 222.完全二叉树的节点个数
    华为---生成树---MSTP基础配置(四)
    Hadoop 3.2.4 集群搭建详细图文教程
    Java学习任务总结【17】
    【Dart】dart之mixin探究
    Spring——感谢尚硅谷官方文档
    Go常用命令与基础语法
    Win11 + docker + tensorflow serving 完成模型部署
    Arcgis地理配准栅格数据
  • 原文地址:https://blog.csdn.net/weixin_43263451/article/details/126218008