尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

NSSCTF Web第一页刷题复盘:从信息收集到漏洞利用的完整方法论

NSSCTF Web第一页刷题复盘:从信息收集到漏洞利用的完整方法论 第一次打开 NSSCTF 的 Web 模块时我其实是有点懵的。页面上题目排得密密麻麻难度标签从入门到进阶让人下意识想从最上面那页开始刷。可真一题题做下来才发现Web 第一页的题目看着都不难但真正卡住你的从来不是知识点本身而是“根本不知道从哪下手”这件事。这篇文章就是我把 NSSCTF Web 第一页的题从头到尾刷完之后的完整记录。它不是题解合集也不会只告诉你某个 payload 怎么写而是把每道题背后共通的思路、工具用法、踩过的坑全部摊开来讲清楚。适合刚接触 CTF Web 方向、刷题没有章法、或者想系统梳理一遍基础漏洞类型的读者。第一页的题本质上是同一套方法论在反复变着花样考你把这套方法论吃透了后面再往后翻页会顺很多。1. 先把工具箱配齐适合 CTF 新手的环境准备先说结论做 Web 方向的题不需要多高端的配置一台能开浏览器的电脑就够了。但工具的选型和配置过程确实有不少人栽过跟头。我见过太多人一上来就装了一堆扫描器、攻击框架结果题目还没看两眼先被工具的使用成本劝退了。1.1 你需要的不是“神奇工具”而是稳定的工作流NSSCTF 平台的题一般有两种给法一种是把题目环境直接挂出来你打开就是一个靶场 URL另一种是给一个附件附件里是源码或者配置文件。第一页的题几乎全是前者也就是你拿到一个域名和端口自己去探索。所以最核心的工具其实只有三个浏览器、Burp Suite、一个能随时改请求的终端。别的都算锦上添花。1.2 浏览器侧的准备别只当它是一个查看器普通浏览器自带的开发者工具F12是信息收集的第一现场。你需要熟练做到三件事查看元素、看网络请求、改页面里的隐藏字段。以 Chrome 为例按 F12 打开开发者工具后我最常用的几个面板Elements元素看页面里的 HTML 结构尤其是注释、隐藏 input、被禁用按钮。很多第一页的题会把提示直接写进注释里。Network网络看页面加载了哪些资源每一个请求的 URL、响应头、Cookie 都是信息。Console控制台看前端报错有些题目会故意在控制台打一个 flag 或者一段提示。另外推荐装两个插件一个是Hack-Tools它把 Burp Suite 里常用的编码、解码、哈希计算功能做成了浏览器侧边栏在做编码绕过类题目时非常顺手另一个是Cookie-Editor可以直接在浏览器里查看和修改 Cookie 值。第一页越权类题目经常就是改一个 Cookie 里的身份字段就过了。1.3 第一次抓包Burp Suite 的正确打开方式Burp Suite 社区版完全够用不需要破解也不用买专业版。下载安装之后第一步不是急着抓包而是把代理配好。默认 Burp 监听在127.0.0.1:8080你在浏览器里配好代理之后访问一个 HTTP 站点的流量就会被 Burp 截获。但 NSSCTF 很多靶场是 HTTPS 协议所以还需要在浏览器设置里导入 Burp 的 CA 证书否则你会看到一堆 TLS 握手报错根本看不到请求内容。这一步是新手最容易忽略的也不是什么技术难点就是流程问题。配置完成后打开 Burp 的Proxy面板把抓到的请求右键发送到Repeater。Repeater 值得你花十分钟认真理解它允许你手动修改请求里的任意字段然后原样再发一次看看响应有什么变化。CTF 里绝大多数 Web 题最终都是靠这种“改包-重放-看响应”的循环解出来的。1.4 一点建议先学会“发请求”再学“打漏洞”第一页的题里有好几道根本不涉及什么漏洞利用就是让你构造一个特殊请求比如加一个请求头、注册一个特定格式的账号、提交一个特殊参数。所以你不需要急着去学那些复杂的扫描器只需要会用 Repeater 或者 curl能任意修改请求内容就具备了第一页所有题的解题基础。我的习惯是Burp 负责交互式调试命令行负责脚本化测试。等后面遇到需要跑字典、批量发请求的题目时再用 Python 的requests库把它们串起来。第一页阶段Burp 的 Repeater 已经能覆盖 90% 的题了。2. 第一页的真正内容信息收集定生死很多新手刷第一页题时有个错觉Web 题就是找漏洞、打漏洞。实际上第一页有一半以上的题目答案就藏在“你根本没仔细看”的地方。我把这类题的共性总结成一句话——漏洞利用是最后一步信息收集才是主战场。2.1 右键查看源代码最基础也最容易被忽略第一页有不少题的突破口就写在 HTML 注释里或者写死了页面作者、后台路径之类的信息。有一次我卡了快二十分钟最后只是把页面滚动到最底部发现注释里写着!-- flag: nssctf{...} --那一刻真的是又好气又好笑。所以拿到题的第一时间不要急着点按钮先按 F12 看 Elements。养成习惯后你会发现CTF 的出题人往往会“善意”地留一条线索给你只是藏得不够深而已。遇到登录框先看账号密码的初始值遇到跳转页面先看 URL 里的参数结构。这些都是信息。2.2 响应头不只看内容还要看包头页面能正常渲染不代表一切都正常。NSSCTF 第一页里有一道题flag 就放在响应头的自定义字段里比如X-Flag: nssctf{...}这种。你用浏览器打开页面看到的只是一张平平无奇的表情包但只要抓包看响应头答案就蹦出来了。这也是为什么我建议所有题目都要过一遍 Burp浏览器的开发者工具虽然也能看到响应头但 Burp 看原始报文更直观任何异常字段都藏不住。检查响应头时重点关注两点一是有没有可疑的自定义字段二是服务器版本或框架版本号。有些题会故意用老旧框架版本暗示你去找对应的 CVE虽然第一页极少出现这种进阶玩法但这个习惯要从一开始就建立。2.3 robots.txt搜索引擎的规则文件也是出题人的留言板robots.txt 本来是用来告诉搜索引擎哪些路径可以爬、哪些不能爬的。但在 CTF 里它是入门级的信息泄露点地位和源码注释差不多。访问靶场域名下的/robots.txt经常能看到类似于这样的内容User-agent: * Disallow: /admin/ Disallow: /flag.txt Disallow: /backup.zip看到 Disallow 不要真的遵守它反而要第一时间去访问这些路径。第一页的题里隐藏后台、备份文件、敏感目录十有八九都是靠这一条挖出来的。2.4 备份文件出题人最爱的“手滑泄露”还有一种高频信息收集手法是扫描备份文件。比如网站根目录下藏着一个index.php.bak或者一个www.zip。第一页题里有的直接把备份文件放在/backup.zip有的则需要你用常见字典去试。这时候可以用简单的字典枚举或者干脆手动试几个文件名index.php.bak、config.php.swp、.git、www.zip。第一页的题不会考特别冷门的备份文件名基本都是这几种常见组合。我有一次就是靠猜flag.txt直接拿到答案的简单到让人怀疑人生。3. 一道典型题的完整拆解弱比较与哈希绕过信息收集做完了接下来才是真正动手“挖洞”的部分。第一页里有一类题特别有代表性考的是 PHP 的弱类型比较和哈希绕过。我拿我做过的其中一道题来做完整拆解你跟着走一遍以后遇到同类题就不会再慌了。3.1 题目场景还原题面给了一个 PHP 页面逻辑如下通过 GET 方式接收两个参数a和b要求a和b不相等但是md5(a)要等于md5(b)。看到这个条件你第一反应可能是不可能两个不同的字符串怎么可能哈希后相等确实如果是强碰撞以普通 PC 的计算能力去撞 MD5 几乎不可能。但这里的关键是代码用的是什么比较操作符。很多题目代码长这样?php $a $_GET[a]; $b $_GET[b]; if ($a ! $b md5($a) md5($b)) { echo flag{...}; } ?注意这行md5($a) md5($b)用的是双等号不是全等符号。这就是漏洞所在。3.2 PHP 弱类型比较的底层逻辑PHP 里的和是两种完全不同级别的比较。会比较类型和值而在比较时会做类型转换简单说就是“能转换成同一个值就认为相等”。有个经典的现象是以0e开头的纯数字字符串在做数学运算或者和数字比较时会被当成科学计数法。比如字符串0e123456PHP 会把它解析成0 × 10 的 123456 次方结果就是整数0。于是两个不同的0e开头的字符串在下就会被认为相等因为它们都等于整数 0。更关键的是确实存在一批字符串它们的 MD5 值恰好是0e加一串数字。业界流传最广的两个字符串是md5(240610708) 0e1311987123175... md5(QNKCDZO) 0e830400451993494...这两个字符串完全不同但它们的 MD5 哈希值都是0e开头所以在 PHP 5/PHP 7 的多数版本下条件md5(a) md5(b)就神奇地成立了。这也就是“魔法哈希”的由来。3.3 构造 Payload理清原理后这道题的答案就非常简单了。直接在浏览器 URL 里访问http://靶场地址/index.php?a240610708bQNKCDZO或者用 Python 脚本发请求方便记录和调试import requests url http://靶场地址/index.php params {a: 240610708, b: QNKCDZO} resp requests.get(url, paramsparams) print(resp.text)发送过去页面就会输出 flag。我第一次解出来的时候还在想是不是自己哪里算错了明明是两个完全不同的字符串硬是给绕过去了。3.4 为什么这道题对新手这么重要因为它揭示了一个特别重要的“元知识点”代码的逻辑看起来严格不代表真的严格一切以实际运行时的类型转换规则为准。如果代码用的是md5($a) md5($b)上面这个 payload 就失效了需要换数组绕过传入a[]1b[]2让md5()函数因为参数是数组而返回null此时null null成立。第一页里有一道变体题就是这么考的你看同一个考点换了比较符解法就完全不同。所以做题时一定要先把题目代码读清楚搞清楚用的是弱比较还是强比较再去选对应的绕过手段。4. 越权与逻辑漏洞不要只盯着注入第一页还有一类题占比不低就是“访问控制”和“越权”问题。很多新手习惯把注意力放在 SQL 注入、命令执行这类听起来很酷的漏洞上结果忽略了一个事实Web 题目考的不只是“漏洞利用”还有“逻辑设计失误”。4.1 一道访问控制题的典型场景NSSCTF 第一页的某一题界面看起来是一个后台管理系统登录需要管理员账号。普通用户注册进去之后只能看到自己的个人信息但页面顶部莫名其妙有一个“管理员菜单”点进去就被拦截提示权限不足。这种题的突破口一般有两个其一页面在渲染时是否根据 Cookie 或某个参数来判断身份其二后台功能的请求后端有没有真正做二次鉴权。对于 CTF 题而言绝大多数是前者——前端或接口层做了一个简易判断后端完全没有校验。测试方法很简单注册一个普通账号登录后在 Burp 里把所有请求都记录下来逐个查看身份标识字段。常见的字段名有role、is_admin、user_type、permission等值可能是user、0、1这样简单的文本。4.2 前端权限判断看起来像墙其实是纸我刚才提到的那种情况代码层面大概是这样// 前端根据 localStorage 里的值控制菜单显示 let userInfo JSON.parse(localStorage.getItem(userInfo)); if (userInfo.role admin) { document.getElementById(adminMenu).style.display block; }这种代码等于没做权限控制因为前端的一切都可以被修改。你在 Cookie-Editor 插件里把role的值从user改成admin刷新页面管理员菜单就出现了里面直接就是 flag。不要觉得这种题简单到侮辱智商现实世界里因为“前端隐藏功能”而导致的越权漏洞比比皆是。开发者的本意可能是“普通用户看不到入口就不会去操作”可攻击者从来不按界面操作而是直接构造请求。CTF 第一页把这套逻辑做成题其实是在教你一种非常重要的思维永远不要相信客户端传来的权限标识服务端必须自己判断是否放行。4.3 目录遍历一道题教你猜路径另一种常见的访问控制题是把后台路径藏起来但又不完全藏起来。比如你看到普通用户的欢迎页 URL 是/index.php?pagewelcome那试着把参数改一下访问/index.php?pageadmin就能看到后台页面。或者干脆直接在域名后面加/admin、/manage这样的路径碰碰运气。我处理这类题的习惯是先把页面上所有能点的链接、能注的参数列成一张表然后逐个尝试替换关键词。比如把user换成admin把view换成edit把home换成flag。第一页的题在路径命名上通常很有规律你只要敢试就很容易撞出来。4.4 越权题的通用测试思路做完几道越权题后我总结出一个可以复制的方法论先用一个普通账号完整走一遍应用的全部功能用 Burp 记录所有请求。逐条检查请求里的身份字段Cookie、请求头、POST 参数。把普通身份字段改成管理员身份字段重放一遍观察响应差异。如果响应里出现了不在界面上的菜单、数据或者接口说明权限判断失效继续深入。这个方法不仅适用于 CTF在真实渗透测试里也一样管用。很多系统逻辑漏洞就是这么测出来的并不需要什么高深的攻击技巧需要的是细心和耐心。5. 第一道真正的“文件包含”题伪协议读源码第一页题目里让我印象最深的一题是文件包含。它比前面的弱比较、越权更接近真实漏洞利用而且把“读源码”这套思路完整地演示了一遍。5.1 题面与分析靶场首页给了几个导航链接URL 长这样http://靶场地址/index.php?pagehome http://靶场地址/index.php?pageabout http://靶场地址/index.php?pagecontact点不同链接页面会加载不同的内容。这种传参数给文件名的模式非常典型的文件包含考点。出题人通常希望你把page参数的值改成一个特殊协议去读取后端源码。最经典的路径就是php://filter伪协议。它的利用方式是用base64编码输出目标文件从而避免文件中含有 PHP 代码直接被执行或报错。访问下面这个地址http://靶场地址/index.php?pagephp://filter/convert.base64-encode/resourceindex.php5.2 看到 Base64 后不要慌页面会返回一大串 Base64 编码的字符。把这段字符复制出来用命令解码echo Base64字符串 | base64 -d或者在浏览器控制台里执行atob(Base64字符串);解出来的内容就是index.php的原始源码。第一次从这道题里“自己骗出源码”的体验是很有成就感的它让我真正理解了为什么很多安全文章反复强调“源码是最宝贵的信息”。5.3 从源码里继续挖下一层读到index.php源码后我在里面发现它 include 了config.php。于是用同样的方法去读http://靶场地址/index.php?pagephp://filter/convert.base64-encode/resourceconfig.php这一下就直接读到了数据库账号密码和 flag。整个链路很清晰文件包含入口 - 伪协议读源码 - 源码暴露敏感信息 - 拿到 flag。它展示的不只是一道题而是“信息泄露如何一步步升级为全面突破”的真实过程。另一处容易被忽略的细节是代码里对page参数好像只做了黑名单过滤把../和http://屏蔽了但没有过滤php://。出题人故意留了这条线也是在提醒你过滤不全面等于没过滤。5.4 文件包含的进阶思路学会了php://filter之后第一页的题基本就没什么能拦住你的了。但我想多提一句后续可能遇到的变体有的题会限制只能包含以.php结尾的文件于是出题人会建议你用php://filter/convert.base64-encode/resourceindex.php因为它输出的内容也是以正常格式返回的不会触发后缀限制有的题则会过滤php://那就需要换data://伪协议或者尝试把 payload 编码绕过。实战里还有一个非常实用的经验文件包含题目中读源码永远是第一优先目标。只有拿到源码你才知道有哪些文件、哪些参数、哪些过滤规则。不要一上来就想着怎么去 RCE读源码的收益又大又稳。写在最后第一页不是终点但它决定了你的起点刷完 NSSCTF Web 第一页我觉得自己学会的其实不是某个具体的 payload而是一整套做 Web 题的稳定节奏先收集信息再判断漏洞点最后才构造利用。这个节奏看着简单却是新手和熟手之间最大的区别。分享两个我自己的小习惯。第一个是每做完一题就在本地建一个“题卡”记录题目名、考点、payload 和踩坑过程。刚开始会嫌麻烦但积累到几十题之后你会发现自己形成了一本可以随时翻阅的错题集复习效率高很多。第二个是遇到卡了半小时以上的题果断换个状态先去洗澡回来再看官方题解或者别人的 writeup。死磕未必出效率但看完题解一定要能复盘出来——出题人为什么会这样设计卡住你的点到底是对知识点不理解还是信息收集没做全。第一页里那些看似简单的小题其实精准地覆盖了 Web 安全的各个基础面信息泄露、弱类型、逻辑漏洞、文件包含。把它们吃透了后面无论在 NSSCTF 继续翻页还是去参加其他平台的比赛你都会发现见过类似的题型心里有底得多。我现阶段也还在继续往后刷不过这是下一次分享的事了。
返回列表