Flask之session伪造
字数 1339 2025-08-12 11:33:52
Flask Session伪造漏洞分析与利用
一、漏洞背景
Flask是一个轻量级的Python Web框架,由于其设计理念,Flask默认将session数据存储在客户端的cookie中(而非服务器端),这导致了session伪造漏洞的可能性。攻击者如果能够获取到应用的SECRET_KEY,就可以伪造任意用户的session,从而提升权限或冒充其他用户。
二、漏洞原理
1. Flask Session工作机制
- Flask的session数据存储在客户端而非服务器端
- 使用SECRET_KEY对session数据进行签名,确保数据不被篡改
- 数据格式:
{数据}.{时间戳}.{签名}
2. 漏洞产生条件
- 攻击者能够获取应用的SECRET_KEY
- 应用没有采取额外的session保护措施
- 应用存在权限控制依赖于session中的用户身份信息
三、漏洞利用步骤
1. 信息收集
- 注册普通用户账号
- 登录后获取当前用户的session cookie值
- 查找SECRET_KEY可能的来源:
- 配置文件(如config.py)
- 环境变量
- GitHub等代码仓库泄露
- 错误信息泄露
2. 解密Session
使用Flask Session Cookie Manager工具解密session:
python flask_session_cookie_manager3.py decode -s "secret_key" -c "session值"
示例解密后的session结构:
{
"_fresh": true,
"_id": "xxx",
"csrf_token": "xxx",
"image": "xxx",
"name": "teng",
"user_id": "1"
}
3. 伪造Session
- 修改关键字段(如将"name"从"teng"改为"admin")
- 使用工具重新加密:
python flask_session_cookie_manager3.py encode -s "secret_key" -t "{伪造的session内容}"
4. 替换Session
- 使用浏览器开发者工具修改cookie
- 或使用Burp Suite等工具拦截请求修改session值
- 刷新页面验证权限提升
四、防御措施
1. 保护SECRET_KEY
- 不要将SECRET_KEY硬编码在代码中
- 使用环境变量存储敏感信息
- 确保.gitignore文件正确配置,避免配置文件上传到公开仓库
2. Session安全配置
- 考虑使用服务器端session存储(如Redis)
- 设置SESSION_COOKIE_HTTPONLY和SESSION_COOKIE_SECURE标志
- 定期更换SECRET_KEY
3. 权限验证
- 不要仅依赖session中的用户身份信息进行权限判断
- 实施多因素认证
- 关键操作增加二次验证
五、工具使用说明
Flask Session Cookie Manager
安装
git clone https://github.com/noraj/flask-session-cookie-manager.git
cd flask-session-cookie-manager
使用示例
解密session:
python3 flask_session_cookie_manager3.py decode -s "ckj123" -c "eyJ1c2VyX2lkIjoxLCJuYW1lIjoidGVuZyJ9.XrUh8w.xxx"
加密session:
python3 flask_session_cookie_manager3.py encode -s "ckj123" -t "{'_fresh': True, '_id': 'xxx', 'name': 'admin'}"
六、CTF实战案例
以[HCTF 2018]admin题目为例:
- 发现存在admin用户
- 注册普通用户并登录
- 通过源码泄露发现SECRET_KEY为'ckj123'
- 解密当前session,修改name字段为admin
- 重新加密并替换cookie
- 刷新页面获取flag
七、总结
Flask session伪造漏洞的核心在于SECRET_KEY的保护和session存储方式的选择。开发人员应当:
- 妥善保护SECRET_KEY
- 考虑使用服务器端session存储方案
- 实施深度防御策略,不单一依赖session进行权限验证
安全研究人员在审计Flask应用时,应重点关注session处理逻辑和SECRET_KEY的保护情况。