• CVE-2020-1957 shiro权限绕过简单分析


    白嫖了腾讯云的服务器,用vulhub起的环境

    参考: CVE-2020-1957–Shiro未授权访问_Anony吧的博客-CSDN博客_shiro未授权访问

    Apache Shiro 认证绕过漏洞(CVE-2020-1957)_维梓梓的博客-CSDN博客

    https://paper.seebug.org/1196/

    菜鸟教程 - 学的不仅是技术,更是梦想!

    漏洞原因:我们请求的URL在整个项目的传入传递过程。在使用了shiro的项目中,是我们请求的URL(URL1),进过shiro权限检验(URL2), 最后到springboot项目找到路由来处理(URL3)

    漏洞的出现就在URL1,URL2和URL3 有可能不是同一个URL,这就导致我们能绕过shiro的校验,直接访问后端需要首选的URL。本例中的漏洞就是因为这个原因产生的。

    HttpServletRequest对象代表客户端的请求,当客户端通过HTTP协议访问服务器时,HTTP请求头中的所有信息都封装在这个对象中,通过这个对象提供的方法,可以获得客户端请求的所有信息。

    ②Java 提供了 String 类来创建和操作字符串。

    ③**getAttribute()**表示从request范围取得设置的属性,必须要通过setAttribute设置属性,才能通过getAttribute取得。设置和取得的值都是Object类型。

    getRequestURI,获取当前url的路径文件,不加参数,带/;

    没学过java 大概理解下这段代码的意思是获取请求包中的url,此时获取的url是 我们传入的原始URL: “/xxx/…;/admin/”

    decodeAndCleanUriString字面意思应该是解码和清除url中一些字符。

    HttpServletRequest对象代表客户端的请求,当客户端通过HTTP协议访问服务器时,HTTP请求头中的所有信息都封装在这个对象中,通过这个对象提供的方法,可以获得客户端请求的所有信息。

    indexOf 返回指定字符在字符串中第一次出现处的索引,如果此字符串中没有这样的字符,则返回 -1。

    substring() 方法返回字符串的子字符串。 newString(“This is text”); Str.substring(4)返回值 : is text

    ⑤ A ? B :C (如果A为真执行B否则执行C) 大概意思是 匹配uri中是否有分号 “ ; ”,如果有,截取分号前面的部分,如果没有则不变。由此,现在url变为“/xxx/…”然后调用normalize() 对decodeAndCleanUriString()处理得到的路径进行标准化处理. 标准话的处理包括:

    • 替换反斜线
    • 替换 // 为 /
    • 替换 /./ 为 /
    • 替换 /…/ 为 /

    (此时uri参数貌似没变动,只是新建了一个semicolonIndex用来截取分号前部分)

    String pathWithinApp =getPathWhthinApplication(request) 我的理解是将request中请求的url提取出来,所以此时 pathWithinApp的值为初始url /xxx/…;/admin/

    getServletPath() 匹配的结果与 web.xml 里的配置有关 用法参照 request.getServletPath() 和 request.getPathInfo() 的用法与区别。 - 教程文章 - 时代Java,与您同行!

    contains() 方法用于判断字符串中是否包含指定的字符或字符串。

    如果servletPath中不包含sanitizedPathWithinApp,那么执行第一个else语句。getRemainingPath英文直译是获取剩余路径,这里可能是一个自定义的函数(我是真的不懂java)结合下面的注释猜测可能是判断pathWithinApp和servletPath是否相同

    第二个else 显示获取pathinfo,如果不为空就返回pathinfo。

    最后返回了servletPath 值为 /admin/ 绕过了验证访问到了admin界面。

    整个请求过程:

    1. 客户端请求URL: /xxx/…;/admin/
    2. shrio 内部处理得到校验URL为 /xxx/… 校验通过
    3. springboot 处理 /xxx/…;/admin/ 最终请求 /admin/ 成功访问了后台请求.

    影响版本:Apache Shiro < 1.5.3

    复现过程:

    docker-compose up -d 启动环境后访问 http://ip:8080

    burp抓包

    将url改为admin会显示302跳转到登录界面

    将url改为/xxx/…;/admin/后绕过了登录

    docker-compose down 关闭环境。

  • 相关阅读:
    CF - D. Letter Picking(博弈 + 区间dp)
    精工书院2022级-C语言编程机考模拟练习课堂
    通过idea实现springboot集成mybatys
    esp-01刷固件/下载软件到内部单片机的方法
    第二十九章 目标检测中的测试模型评价指标(车道线感知)
    java中的函数式接口是什么?
    力扣算法:LC 704-二分查找,LC 27-移除元素--js
    MySQL基础篇
    【算法设计zxd】第5章分治法
    1. Mybatis基础操作
  • 原文地址:https://blog.csdn.net/m0_67393342/article/details/126327009