前言
本系列为【炼石计划@Java代码审计】知识星球实战50套开源系统删减版,也就是每一套分享部分内容给大家学习。如果觉得写得还不错,并且想要从实践中学习JavaWeb代码审计的朋友,欢迎了解加入【炼石计划@Java代码审计】知识星球,与500位志同道合的朋友共同学习成长。
文末获取配套练习环境。
上期回顾
【JavaWeb系统代码审计实战】某RBAC管理系统(一)SpringBoot介绍与项目安装
【JavaWeb系统代码审计实战】某RBAC管理系统(二)信息收集与SQL注入代码审计
进入正题
5.3、越权漏洞挖掘
在渗透测试阶段挖掘漏洞时发现了越权漏洞,我们现在从代码审计角度跟踪一下删除流程。
通过URL路径api/user
查看相关Controller,搜索发现为UserController
,位于src/main/java/com/codermy/myspringsecurity/plus/admin/controller/UserControlle
。进一步查找关于删除用户的的方法,发现在该文件的第115行~123行,通过userId
删除用户,如下图所示:
跟踪一下删除用户逻辑流程。
①、通过上述代码,发现UserController
从前端接收userId
参数,调用userService.deleteUser(userId)
进行删除,此处无任何权限关联。
②、通过userService
找到userServiceImpl
实现类,位于src/main/java/codermy/myspringsecurity/admin/service/impl/UserServiceImpl
。从中找到deleteUser()
方法,如下图所示:
③、从中可以看到,该方法首先使用了checkUserAllowed()
方法根据userId
校验用户是否允许操作。然后分别调用了roleUserDao.deleteRoleUserByUserId(userId);
,userJobDao.deleteUserJobByUserId(userId);
,userDao.deleteUserById(userId);
通过userId
删除用户,并且通过用户ID删除用户和岗位关联。按住CTRL
键左击deleteUserxxx
调用的方法,可以跳转到DAO层文件。如下图所示:
跟着删除用户整体流程逻辑走下来,发现userId是从用户侧获取的,也没有将userId与所删除的数据做关联,而且userId也不是从session中获取的,从而导致任意用户都可以调用该接口进行删除。
并且用户ID值极易进行遍历,从而进行批量任意用户删除。
5.4、XSS漏洞挖掘
在开发一个网站项目时,开发人员不可能将所有的参数分别做过滤或转义。最好的办法是统一写个过滤/转义XSS的Filter。
在本项目中全局搜索,没发现XSS相关过滤器(Filter)或拦截器(Interceptor)。初步判断存在XSS漏洞。
对后端简单分析后,初步判断存在XSS漏洞,然后我们对前端进行分析,是否有转义机制。
在了解了整个项目之后,发现前端使用了Thymeleaf模板引擎
和Layui框架
。
Thymeleaf中th:text
标签进行渲染的时候,默认对特殊字符进行了转义,th:utext
不会将字符转义。也就是说使用了th:utext
标签会出现XSS漏洞。经过全局搜索,发现只有两处使用了th:text
标签。没有地方使用th:utext
标签。
其经过分析src/resouces/templates/
下的html文件。发现本项目前端还使用了Layui框架
。
全局搜索Layui
关键字,得到layui使用版本为2.5.6
通过翻阅Layui的github中ISSUES发现该版本存在XSS漏洞。链接https://github.com/sentsin/layui/issues/711
Layui.table:
https://www.layuion.com/doc/modules/table.html#use
table 模块是我们的又一走心之作,在 layui 2.0 的版本中全新推出,是 layui 最核心的组成之一。它用于对表格进行一些列功能和动态化数据操作,涵盖了日常业务所涉及的几乎全部需求。
Layui.table有三种渲染方式,本项目中使用了了方法渲染
,使用了table.render
。
在渗透测试阶段挖掘到了XSS漏洞。经过从代码层分析,该漏洞的出现主要分为两点:
-
一是:后端没有对用户输入的字符进行转义或过滤。
-
二是:使用的前端框架存在XSS漏洞版本,也没有对返回到前端的参数进行过滤或转义。
5.5、SpringSecurity框架下未授权漏洞挖掘
本项目SprintSecurity配置代码位于src/main/java/codermy/myspringsecurityplus/security/config/SpringSecurityConfig
。
SpringSecurity会配置一些放行的静态资源,有时错误的配置会将一些关键资源放行,造成未授权访问。这有可能是开发人员便于调试,有可能是粗心导致的。比如本项目中直接放行了spring acatutor
监控页面,按理说这个页面需要登录才可以访问。不登录就可以未授权访问这个页面是存在很大风险的。如下图所示:
SpringSecurity配置是链式结构,可以同时配置多项过滤。
5.6、图形验证码绕过
搜索关键字captcha
等,找到相关代码。如下图所示:
经搜索,图形验证码代码位于src/main/java/com/codemy/mysringsecurityplus/security/filter/VerifyCoderFilter.java
让我们分析代码逻辑。
首先,判断了请求方法和请求路径。两者都为True进入验证码逻辑部分。如下图所示:
然后获取属性值。使用request.getSession()
获取cookie的session值,使用request.getParameter("captcha")
获取请求body中captcha参数值,使用request.getSession().getAttribute("captcha")
获取cookie中captcha值。如下图所示:
接下来,仅判断了从请求参数中获取的captcha
值是否为空,为空的话先删除缓存里的验证码信息,然后报错。如下图所示:
仅判断从参数中获取的值是否为空逻辑是不严谨的。但在代码下方是有完整的验证逻辑。我们继续分析下。
判断从Cookie中获取captcha属性值是否为空。为空报错。
最后使用StrUtil.equalsIgnoreCase()
函数忽略大小写判断,从cookie中获取的captcha值和从请求中获取的captcha值是否相同。如果不同的话就会报错。如下图所示:
开发人员有时为了便于调试程序,可能会暂时关闭繁琐的验证逻辑。到了最后程序正式上线忘记了将注释删除掉,粗心的举动导致问题的发生。
当然,不同的程序会存在不同的问题。需要我们细心分析。
环境领取
欢迎点击下方链接获取配套练习环境。
【备注,后台回复关键字前八套环境
即可获取不限速下载链接】
炼石计划@Java代码审计
欢迎点击下方链接了解加入【炼石计划@Java代码审计】知识星球,在这里我们专注Java代码审计技术的提升。现阶段正在进行的为50套JavaWeb系统代码审计实战。赶紧和500位志同道合的朋友卷起来吧!
[加入后请务必查看指定文章使用手册]
炼石计划@PHP代码审计
欢迎点击下方链接了解加入【炼石计划@PHP代码审计】知识星球,在这里我们专注PHP代码审计技术的提升。七大阶段学习,让你最终掌握PHP代码审计。抱团学习取暖,避免走弯路,实现弯道超车。
原文始发于微信公众号(闪石星曜CyberSecurity):【JavaWeb系统代码审计实战】某RBAC管理系统(三)越权,未授权,XSS代码审计
- 左青龙
- 微信扫一扫
- 右白虎
- 微信扫一扫
评论