鉴权&JWT&Shiro
身份验证-未授权访问&鉴权技术
1、搜索类别:业务关键字&相关操作类&封装关键字
2、功能点也适用,直接找鉴权技术特征目录进行代码追溯
-找有没有Interceptor,拦截器里有没有鉴权
-找有没有Filter,过滤器里有没有鉴权
-找有没有Shiro,看版本及里面的逻辑配置
-找有没有Jwt,看后面写的四个方向确定
-找以上都没有,看看是不是自写代码逻辑鉴权
资料补充:
Interceptor是一种拦截器,也称之为拦截器链(InterceptorChain),主要用于拦截请求、响应或处理过程中的某些事件,比如权限认证、日志记录、性能测试等。在 Java 中,Interceptor可以用来扩展框架,增加或修改某个方法的行为,或者对应用流程做些前置处理、后置处理、环绕处理等。
Filter被称为过滤器,过滤器实际上就是对Web资源进行拦截,做一些处理后再交给下一个过滤器或Servlet处理,通常都是用来拦截request进行处理的,也可以对返回的 response进行拦截处理。开发人员利用filter技术,可以实现对所有Web资源的管理,例如实现权限访问控制、过滤敏感词汇、压缩响应信息等一些高级功能。
Shiro是一个强大且易用的Java安全框架,执行身份验证、授权、密码和会话管理。使用Shiro的易于理解的API,您可以快速、轻松地获得任何应用程序,从最小的移动应用程序到最大的网络和企业应用程序。
Jwt:JSON WebToken,将用户信息加密到token里,服务器不保存任何用户信息,只保存密钥信息,通过使用特定加密算法验证token,通过token验证用户身份。基于token的身份验证可以替代传统的cookie+session身份验证方法。这使得JWT成为高度分布式网站的热门选择,在这些网站中,用户需要与多个后端服务器无缝交互。
使用Interceptor拦截器进行鉴权
案例-NewbeeMall-使用拦截器进行鉴权
下载:https://github.com/newbee-ltd/newbee-mall
Interceptor->AdminLoginInterceptor->preHandle->uri.startsWith
如果路径的开头是以/admin开头并且Session中的loginUser属性为 null
利用:构造结构路径为/;/admin或//admin后访问(不影响解析)
源码中搜shiro和jwt引用,发现没有,看源码
发现Interceptor拦截器
如果路径的开头是以/admin开头并且Session中的loginUser属性为 null
看到后台所有页面都在/admin目录下
利用:构造结构路径为/;/admin或//admin后访问(不影响解析)
为了绕过前面的判断
使用Filter过滤器进行鉴权
案例-华夏ERP-使用过滤器进行鉴权
下载:https://github.com/jishenghua/jshERP
urlPatterns->LogCostFilter->doFilter->requestUrl,ignoredList,allowUrls
/login.html/../account/getAccount
/xiaodi.css/../account/getAccount
/user/login/../../account/getAccount
/*的意思是访问任何/下面的路径都会触发过滤方法
/login.html/../account/getAccount
/xiaodi.css/../account/getAccount
/user/login/../../account/getAccount
使用Shiro框架进行鉴权
案例-Tumo-Shiro框架鉴权
下载:https://github.com/TyCoding/tumo
1、引用shiro做身份验证
pom.xml Maven配置文件
2、查看shiro配置信息
anon一般代表不需要鉴权的配置,**则表示该接口下的所有接口。
tumo.shiro.anon_url=\
/login,/logout,/register,\
/,/about,/p/,/links,/comment/,/link/list,/article/list,\
/css/,/js/,/img/**
anon:匿名过滤器,/login这几个目录下所有资源都能访问
/article/list为例
3、寻找利用点
CommentController.java
@RequestMapping(“/comment”)
@GetMapping(“/{id}”)
@DeleteMapping(“/{id}”)
4、测试
GET /comment/1
DELETE /comment/1
注意:除此之外还可以看下这个版本漏洞是否可以绕过
使用Jwt技术进行鉴权
JWT审计看以下:
1、生成时使用空加密(逻辑代码问题)
2、服务端未校验签名(逻辑代码问题)
3、密钥默认未被修改(搭建后未修改)
4、密钥爆破可能性大(密钥过于简单)
案例1-FastCMS-密钥默认未被修改
下载:https://gitee.com/xjd2020/fastcms
-看数据包获取Jwt技术
-代码逻辑或引用Jwt包
createToken->AuthConfigs->secretKey->application.yml
抓包,记得返回响应包
jwt
exp是时间戳,是认证到期时间
案例2-Nacos-密钥默认未被修改
下载:https://github.com/alibaba/nacos/releases
参考:https://blog.csdn.net/qq_50854662/article/details/129660330
启动:startup.cmd -m standalone
nacos.core.auth.plugin.nacos.token.secret.key
登陆时修改返回的JWT值
此时用户为nacos
填写密钥修改