java代码审计-鉴权

鉴权&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配置文件

1.5.2

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

填写密钥修改