ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

攻防世界Inget题目解析:从PHP $_GET到CTF入门实战

攻防世界Inget题目解析:从PHP $_GET到CTF入门实战 最近刷攻防世界又碰到一道叫 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 开发可能觉得这题简单到不值一提。但新手真正卡住的地方往往不是“看不懂代码”而是“知道该干什么却不知道用什么工具、在哪一步操作”。所以我的解题思路可以拆成三句话找到接收参数的位置这里的入口就是 URL 里的查询字符串。确定参数名和值参数名是inget值是welcome。把参数拼到 URL 里发给服务器http://目标地址/?ingetwelcome。接下来我就从前置知识开始带着你一步步走确保每一步都明明白白。2. 前置知识搞懂 HTTP 的 GET 请求与 $_GET2.1 GET 请求的 URL 结构我们平时在浏览器地址栏输入网址、点击链接、搜索关键词其实背后大多数都是 GET 请求。GET 请求的数据不是放在请求体里而是直接拼接在 URL 后面用?作为分隔符多个参数之间用连接。一个典型的带参数的 URL 长这样http://example.com/index.php?nameadminpage1拆开来看http://example.com/index.php资源路径告诉服务器访问哪个文件。?查询字符串的开始。nameadmin第一个参数参数名name参数值admin。多个参数之间的分隔符。page1第二个参数参数名page参数值1。所以如果我们要给inget传值welcome只需要在 URL 末尾加上?ingetwelcome。这里的“?”一定是英文问号不要在中文输入法下打一个全角问号否则会解析出错这个问题我看到很多新人踩过。2.2 PHP 超级全局变量 $_GET在 PHP 中$_GET是一个超全局变量专门用来收集通过 GET 方法提交的参数。浏览器发来的 URL 经过解析后PHP 会自动把查询字符串里的参数放到$_GET这个数组里。比如 URL 是/index.php?ingetwelcome那么在 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://目标地址/?ingetwelcome这种方式非常直观还能通过-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/?ingetwelcome注意如果靶机地址本身已经带路径比如http://xxx/index.php那就直接在后面加问号和参数http://xxx/index.php?ingetwelcome回车之后页面不再显示 “Wrong key!”而是输出了一段 flag 字符串。拿下。这里有一个小细节如果页面在?ingetwelcome之后还有路径信息比如你原来的 URL 是/dir/page.php?ingetwelcome但服务器上的代码在index.php里那可能需要访问/index.php?ingetwelcome而不是/dir/page.php。所以当你发现拼了参数还是没反应时先确认你是不是访问了正确的入口文件。3.3 第三步用 curl 命令验证为了养成专业习惯我更推荐用 curl 来做验证。打开终端Windows 下可以用 PowerShell 或者 CMD也可以用 Git Bash输入curl http://123.456.7.8:12345/?ingetwelcome执行结果会直接输出页面响应内容。如果加了-v参数curl -v http://123.456.7.8:12345/?ingetwelcome你还能看到完整的请求报文GET /?ingetwelcome HTTP/1.1 Host: 123.456.7.8:12345 User-Agent: curl/...这种原始报文能帮你直观理解 GET 请求到底长什么样。我之前带新人刷题时经常让他们用curl -v看一次请求过程他们对协议的理解立刻上一个台阶。3.4 第四步用 Burp Suite 抓包重放Burp Suite 是 Web 类 CTF 绕不开的工具。虽然这道题用不上这么重的手段但提前练一下抓包重放没坏处。流程是这样打开 Burp Suite默认端口8080设置浏览器代理指向127.0.0.1:8080。在浏览器里访问不带参数的靶机地址Burp 会拦截到一条 GET 请求。把请求发送到 Repeater在请求行里修改 URL加上参数?ingetwelcome点击 Send。观察响应包里的内容。如果你用的是 Burp 的 Repeater原始请求长这样GET /?ingetwelcome HTTP/1.1 Host: 123.456.7.8:12345 ...响应里就能看到 flag。手动修改请求的体验比地址栏更接近“黑客操作”的感觉也是后续学习手工注入的基础。4. 常见问题与排查实录4.1 参数名写错或大小写问题PHP 的$_GET数组的键是区分大小写的。也就是说$_GET[inget]和$_GET[Inget]是两个完全不同的键。如果你在 URL 里写成?IngetwelcomePHP 代码仍然寻找的是inget那么$key就取不到值比较结果自然是错误。我在带新人时遇到过好几次这种问题明明步骤都按教程做了就是不出 flag最后发现只是首字母大写了。所以看到参数名之后请原样复制不要自己重新打字。如果你是手打英文也要注意大小写。4.2 值中包含特殊字符导致 URL 编码问题这道题的值是welcome很干净没有特殊字符。但如果以后你遇到需要传空格、引号、、#等字符的时候直接拼进 URL 就会出问题。因为空格会被浏览器自动编码为%20或会被当作新的参数分隔符#是片段标识符后面内容不会发送到服务器。所以当你需要传hello world这样的值应该写成?ingethello%20world或者用 curl 时直接加引号curl http://xxx/?ingethello worldcurl 会自动做一部分处理但保险起见最好手动把空格改成%20。4.3 为什么改了 URL 还是不生效遇到“我明明加了?ingetwelcome页面还是报错”的情况不要慌按顺序排查这几项检查 URL 是不是以http://开头不要漏了协议。检查是不是在中文输入法下输入了问号全角问号和后缀的路径会连在一起服务器根本不认识。检查地址栏是不是被浏览器的搜索功能“劫持”了。如果你访问的域名格式不对浏览器可能直接把它当成关键词去搜索而不是发请求。检查是否有多余空格URL 里空格会被处理成%20导致路径不对。如果页面有跳转或者 CDN 缓存多刷新几次或者用无痕模式再试。这道题最常踩的就是前两种都是非常低级但很影响心情的问题。4.4 弱类型比较那些坑在更进阶的版本里if ($key welcome)还会涉及 PHP 弱类型比较的绕过。比如如果代码写的是if ($_GET[inget] 0)那么你传?ingetabcabc和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: ingetwelcome这些信息会让你对 HTTP 通信有非常直观的认识。以后遇到 Ajax 请求、JSON 交互都能在这里看清细节。5.3 遇到“名字奇怪的参数”怎么办很多题目都会故意起一个看起来很奇怪的名字比如Inget、flag、key、admin等等。这时候不要把它当成普通英文单词去理解而是把它当成一个“代号”。题目叫 Inget重点多半就是这个参数名。你可以在源码里搜索inget看看它出现在哪些地方哪段逻辑会用到它。如果源码不可见也可以用目录扫描工具探测常见文件或者尝试用?传几个常见参数名观察页面响应差异。不过那是后话当前这道题已经把一切写明白了照做即可。5.4 个人实战经验与建议说实话这种入门题对老手来说没什么难度但我觉得它很有价值。因为它模拟了最真实的场景目标明确代码逻辑简单考点单一。新人如果能独立完成这道题并且能解释清楚每一步的原理那说明你已经迈出了 Web 安全的第一步。我刷题时还有一个习惯每做完一道题就在笔记里记录它的考点和解法。比如这道 Inget我记的是“GET 参数传递 $_GET 使用”。等积累多了你会发现很多复杂题目都是由这些基础点组合出来的。比如某个题先让你传一个cmd参数后面再配合命令执行某个题让你传一个file参数后面就是文件包含。基础打牢了后面才能走得快。最后再分享一个实际验证的小技巧如果你不确定参数有没有传对可以在 URL 里故意传一个错误值比如?ingettest如果页面输出 “Wrong key!”说明你的参数确实被接收了只是判定没通过。这时候再改成正确值welcome如果页面变成了 flag那就一切都对上了。用错误值做对照能快速定位是“参数没传进去”还是“值不对”这个方法在以后各种题目里都很好用。
返回列表