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. 信息收集

  1. 注册普通用户账号
  2. 登录后获取当前用户的session cookie值
  3. 查找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

  1. 修改关键字段(如将"name"从"teng"改为"admin")
  2. 使用工具重新加密:
python flask_session_cookie_manager3.py encode -s "secret_key" -t "{伪造的session内容}"

4. 替换Session

  1. 使用浏览器开发者工具修改cookie
  2. 或使用Burp Suite等工具拦截请求修改session值
  3. 刷新页面验证权限提升

四、防御措施

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题目为例:

  1. 发现存在admin用户
  2. 注册普通用户并登录
  3. 通过源码泄露发现SECRET_KEY为'ckj123'
  4. 解密当前session,修改name字段为admin
  5. 重新加密并替换cookie
  6. 刷新页面获取flag

七、总结

Flask session伪造漏洞的核心在于SECRET_KEY的保护和session存储方式的选择。开发人员应当:

  1. 妥善保护SECRET_KEY
  2. 考虑使用服务器端session存储方案
  3. 实施深度防御策略,不单一依赖session进行权限验证

安全研究人员在审计Flask应用时,应重点关注session处理逻辑和SECRET_KEY的保护情况。

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: 示例解密后的session结构: 3. 伪造Session 修改关键字段(如将"name"从"teng"改为"admin") 使用工具重新加密: 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 安装 使用示例 解密session: 加密session: 六、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的保护情况。