☰
攻防世界Inget题目解析:从PHP $_GET到CTF入门实战
2026/9/28 5:38:08 网站建设 项目流程

最近刷攻防世界,又碰到一道叫 Inget 的题目。说实话,这道题难度不高,但特别适合刚入坑 CTF 的新手,因为它的考点非常集中:HTTP 请求里的 GET 参数传递,以及 PHP 中最基础的 $_GET 超全局变量。如果你还在纠结“拿到一个 CTF 题目到底从哪里下手”,那这道题就是绝佳的练手材料。标题里的“胎教版”其实就是我想用最啰嗦的方式,把每一步都拆开揉碎讲给你听,保证你跟着操作就能把 flag 拿到手。

1. 初看题目:Inget 到底在考什么

1.1 题目名里的暗示

CTF 的题目名称往往不是随便取的,很多时候都在提醒你核心考点的方向。Inget 这个单词乍一看有点怪,英语里并没有这个常见词,但如果你熟悉 Web 开发,很容易联想到 “in GET” 或者是 “inget = 参数名 inget”。我第一反应就是:这道题大概率跟 GET 请求有关,而且“inget”很可能就是要传的关键参数名。

再结合攻防世界新手区的题目特点,多数题目不会上来就搞复杂的 SQL 注入、命令执行,而是先考察基本功:能不能看懂一段 PHP 代码,能不能熟练地构造一个 HTTP 请求。这道题就是这种思路——名字已经给你答案了,关键看你有没有意识到。

1.2 页面源码里的关键线索

访问靶机之后,页面非常简单,通常只有一行提示文字,类似 “Please input the inget parameter” 或者直接就是一段 PHP 代码。我实际刷题时习惯先右键查看网页源代码,有些时候题目会把关键代码直接写在 HTML 注释里,省得你去猜。

这道题也不例外。源码里有一段类似这样的 PHP 逻辑:

<?php error_reporting(0); include "flag.php"; $key = $_GET['inget']; if ($key == "welcome") { echo $flag; } else { echo "Wrong key!"; } ?>

看到这段代码,思路就非常清晰了:服务器接收 GET 参数inget,然后拿它和字符串welcome做比较,相等就输出$flag,不相等就报错。所以我们的目标就是:把inget参数的值设置为welcome,发给服务器。

1.3 解题思路雏形

如果你已经接触过 Web 开发,可能觉得这题简单到不值一提。但新手真正卡住的地方往往不是“看不懂代码”,而是“知道该干什么,却不知道用什么工具、在哪一步操作”。所以我的解题思路可以拆成三句话:

  1. 找到接收参数的位置:这里的入口就是 URL 里的查询字符串。
  2. 确定参数名和值:参数名是inget,值是welcome。
  3. 把参数拼到 URL 里发给服务器:http://目标地址/?inget=welcome。

接下来我就从前置知识开始带着你一步步走,确保每一步都明明白白。

2. 前置知识:搞懂 HTTP 的 GET 请求与 $_GET

2.1 GET 请求的 URL 结构

我们平时在浏览器地址栏输入网址、点击链接、搜索关键词,其实背后大多数都是 GET 请求。GET 请求的数据不是放在请求体里,而是直接拼接在 URL 后面,用?作为分隔符,多个参数之间用&连接。

一个典型的带参数的 URL 长这样:

http://example.com/index.php?name=admin&page=1

拆开来看:

  • http://example.com/index.php:资源路径,告诉服务器访问哪个文件。
  • ?:查询字符串的开始。
  • name=admin:第一个参数,参数名name,参数值admin。
  • &:多个参数之间的分隔符。
  • page=1:第二个参数,参数名page,参数值1。

所以如果我们要给inget传值welcome,只需要在 URL 末尾加上?inget=welcome。这里的“?”一定是英文问号,不要在中文输入法下打一个全角问号,否则会解析出错,这个问题我看到很多新人踩过。

2.2 PHP 超级全局变量 $_GET

在 PHP 中,$_GET是一个超全局变量,专门用来收集通过 GET 方法提交的参数。浏览器发来的 URL 经过解析后,PHP 会自动把查询字符串里的参数放到$_GET这个数组里。

比如 URL 是/index.php?inget=welcome,那么在 PHP 代码里:

$_GET['inget'] // 值就是 "welcome"

代码里写$key = $_GET['inget'];,意思就是把inget参数的值赋给变量$key。接着if ($key == "welcome")做一次相等判断,如果相等就输出 flag,不等就输出错误提示。

这里需要注意,$_GET['inget']要求 URL 里必须存在名为inget的参数。如果你访问的是index.php而不带任何参数,PHP 在读取$_GET['inget']时会给出一个未定义索引的警告,虽然代码里用了error_reporting(0)把错误报告关掉了,但在某些环境下页面仍然可能表现异常。所以正确的做法是老老实实把参数带上。

2.3 构造 GET 参数的三种常见方式

新手只要学会一种就够了,但为了让你之后刷题更顺手,我建议掌握三种:

方式一:浏览器地址栏直接输入

最简单,打开浏览器,把 URL 手动拼好,然后回车访问。适合快速验证。缺点是如果参数很多或者值里有特殊字符,容易在输入过程中出错。

方式二:curl 命令行

在终端中使用:

curl "http://目标地址/?inget=welcome"

这种方式非常直观,还能通过-v参数查看完整的 HTTP 请求和响应过程,对理解协议有好处。之后做更复杂的题目,curl 也会是常用工具。

方式三:Burp Suite 或浏览器开发者工具

使用 Burp Suite 拦截请求,或者在浏览器开发者工具里修改请求参数。这种方式适合需要对请求头、Cookie、请求体做细致操作的时候。对于这道题,用前两种就够了,但提前熟悉 Burp 的界面会让你后面刷题省力很多。

3. 实操解题:从“盲猜”到“拿 flag”

3.1 第一步:打开靶机,查看页面与源码

进入攻防世界,找到 Inget 这道题,点击启动靶机,浏览器会自动打开一个环境地址。地址长得可能像http://123.xxx.xxx.xxx:8080/这种,不同平台格式不一样。看到页面后,不要急着乱点,先按Ctrl + U查看网页源代码。

这一步非常关键。很多新手一上来就只知道看页面上的文字,完全忽略 HTML 注释和隐藏片段。这道题的源码提示就藏在注释或者直接展示在页面里,也可能是直接给出了 PHP 代码。无论哪种形式,你都能找到一段类似if ($key == "welcome")的判断语句,这时候就知道该传什么参数了。

如果你在源码里看到了include "flag.php";这种代码,那么 flag 很可能就在服务器的某个文件里,而本地源码是不会直接给你看内容的。你能做的,就是通过让条件成立,让 PHP 把$flag变量输出出来。

3.2 第二步:直接地址栏构造参数

假设目标地址是http://123.456.7.8:12345/,那么我在地址栏里输入:

http://123.456.7.8:12345/?inget=welcome

注意,如果靶机地址本身已经带路径,比如http://xxx/index.php,那就直接在后面加问号和参数:

http://xxx/index.php?inget=welcome

回车之后,页面不再显示 “Wrong key!”,而是输出了一段 flag 字符串。拿下。

这里有一个小细节:如果页面在?inget=welcome之后还有路径信息,比如你原来的 URL 是/dir/page.php?inget=welcome,但服务器上的代码在index.php里,那可能需要访问/index.php?inget=welcome而不是/dir/page.php。所以当你发现拼了参数还是没反应时,先确认你是不是访问了正确的入口文件。

3.3 第三步:用 curl 命令验证

为了养成专业习惯,我更推荐用 curl 来做验证。打开终端(Windows 下可以用 PowerShell 或者 CMD,也可以用 Git Bash),输入:

curl http://123.456.7.8:12345/?inget=welcome

执行结果会直接输出页面响应内容。如果加了-v参数:

curl -v http://123.456.7.8:12345/?inget=welcome

你还能看到完整的请求报文:

GET /?inget=welcome HTTP/1.1 Host: 123.456.7.8:12345 User-Agent: curl/...

这种原始报文能帮你直观理解 GET 请求到底长什么样。我之前带新人刷题时,经常让他们用curl -v看一次请求过程,他们对协议的理解立刻上一个台阶。

3.4 第四步:用 Burp Suite 抓包重放

Burp Suite 是 Web 类 CTF 绕不开的工具。虽然这道题用不上这么重的手段,但提前练一下抓包重放没坏处。

流程是这样:

  1. 打开 Burp Suite,默认端口8080,设置浏览器代理指向127.0.0.1:8080。
  2. 在浏览器里访问不带参数的靶机地址,Burp 会拦截到一条 GET 请求。
  3. 把请求发送到 Repeater,在请求行里修改 URL,加上参数?inget=welcome,点击 Send。
  4. 观察响应包里的内容。

如果你用的是 Burp 的 Repeater,原始请求长这样:

GET /?inget=welcome HTTP/1.1 Host: 123.456.7.8:12345 ...

响应里就能看到 flag。手动修改请求的体验比地址栏更接近“黑客操作”的感觉,也是后续学习手工注入的基础。

4. 常见问题与排查实录

4.1 参数名写错或大小写问题

PHP 的$_GET数组的键是区分大小写的。也就是说,$_GET['inget']和$_GET['Inget']是两个完全不同的键。如果你在 URL 里写成?Inget=welcome,PHP 代码仍然寻找的是inget,那么$key就取不到值,比较结果自然是错误。

我在带新人时遇到过好几次这种问题,明明步骤都按教程做了,就是不出 flag,最后发现只是首字母大写了。所以看到参数名之后,请原样复制,不要自己重新打字。如果你是手打英文,也要注意大小写。

4.2 值中包含特殊字符导致 URL 编码问题

这道题的值是welcome,很干净,没有特殊字符。但如果以后你遇到需要传空格、引号、&、#等字符的时候,直接拼进 URL 就会出问题。因为:

  • 空格会被浏览器自动编码为%20或+;
  • &会被当作新的参数分隔符;
  • #是片段标识符,后面内容不会发送到服务器。

所以当你需要传hello world这样的值,应该写成:

?inget=hello%20world

或者用 curl 时直接加引号:

curl "http://xxx/?inget=hello world"

curl 会自动做一部分处理,但保险起见,最好手动把空格改成%20。

4.3 为什么改了 URL 还是不生效?

遇到“我明明加了?inget=welcome,页面还是报错”的情况,不要慌,按顺序排查这几项:

  1. 检查 URL 是不是以http://开头,不要漏了协议。
  2. 检查是不是在中文输入法下输入了问号,全角问号?和后缀的路径会连在一起,服务器根本不认识。
  3. 检查地址栏是不是被浏览器的搜索功能“劫持”了。如果你访问的域名格式不对,浏览器可能直接把它当成关键词去搜索,而不是发请求。
  4. 检查是否有多余空格,URL 里空格会被处理成%20,导致路径不对。
  5. 如果页面有跳转或者 CDN 缓存,多刷新几次或者用无痕模式再试。

这道题最常踩的就是前两种,都是非常低级但很影响心情的问题。

4.4 弱类型比较那些坑

在更进阶的版本里,if ($key == "welcome")还会涉及 PHP 弱类型比较的绕过。比如如果代码写的是if ($_GET['inget'] == 0),那么你传?inget=abc,abc和0做比较时,PHP 会把abc尝试转成数字,转换结果是0,于是0 == 0成立,就能拿到 flag。这就是经典的弱类型比较绕过。

不过这道题的判定条件是$key == "welcome",是一个字符串和字符串之间的比较,并没有利用弱类型绕过的空间。老老实实传welcome就行。

但如果你在刷其他题目时看到类似代码,要敏感:如果比较的两个值中有一个是数字,另一个是字符串,结果可能会出人意料。这算是 CTF 里一个非常经典的知识点,新手可以了解一下。

5. 从这道题延伸出去:CTF 入门如何快速上手

5.1 养成先看源码的习惯

这道题教会我最重要的一点:拿到一个 Web 题目,第一步永远是查看源码。很多人在页面上一通乱点,东试西试,却忘了源码里早就写好了答案。浏览器里Ctrl + U查看源文件,F12打开开发者工具,这两个快捷键我建议你刻进 DNA 里。

哪怕是以后做更复杂的题目,源码里也经常藏着注释、隐藏字段、JS 脚本,甚至是完整的后端逻辑。不要觉得“页面显示什么就是什么”,网页只是前端给你看的表象,真正的逻辑藏在代码里。

5.2 用好开发者工具

除了查看源码,开发者工具里的 “Network” 标签也很重要。打开它,勾选 “Preserve log”,刷新页面,就能看到浏览器发出的每一个请求。点开任意一个请求,能看到 URL、请求方法、状态码、响应头、响应体。这道题你可以在 Network 里看到:

Name: index.php Method: GET Status Code: 200 Query String Parameters: inget=welcome

这些信息会让你对 HTTP 通信有非常直观的认识。以后遇到 Ajax 请求、JSON 交互,都能在这里看清细节。

5.3 遇到“名字奇怪的参数”怎么办

很多题目都会故意起一个看起来很奇怪的名字,比如Inget、flag、key、admin等等。这时候不要把它当成普通英文单词去理解,而是把它当成一个“代号”。题目叫 Inget,重点多半就是这个参数名。你可以在源码里搜索inget,看看它出现在哪些地方,哪段逻辑会用到它。

如果源码不可见,也可以用目录扫描工具探测常见文件,或者尝试用?传几个常见参数名,观察页面响应差异。不过那是后话,当前这道题已经把一切写明白了,照做即可。

5.4 个人实战经验与建议

说实话,这种入门题对老手来说没什么难度,但我觉得它很有价值。因为它模拟了最真实的场景:目标明确,代码逻辑简单,考点单一。新人如果能独立完成这道题,并且能解释清楚每一步的原理,那说明你已经迈出了 Web 安全的第一步。

我刷题时还有一个习惯:每做完一道题,就在笔记里记录它的考点和解法。比如这道 Inget,我记的是“GET 参数传递 + $_GET 使用”。等积累多了,你会发现很多复杂题目都是由这些基础点组合出来的。比如某个题先让你传一个cmd参数,后面再配合命令执行;某个题让你传一个file参数,后面就是文件包含。基础打牢了,后面才能走得快。

最后再分享一个实际验证的小技巧:如果你不确定参数有没有传对,可以在 URL 里故意传一个错误值,比如?inget=test,如果页面输出 “Wrong key!”,说明你的参数确实被接收了,只是判定没通过。这时候再改成正确值welcome,如果页面变成了 flag,那就一切都对上了。用错误值做对照,能快速定位是“参数没传进去”还是“值不对”,这个方法在以后各种题目里都很好用。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询