恒美微站 Logo 恒美微站
  • 首页
  • 关于我们
  • 建站服务
  • 主题模板
  • 案例展示
  • 资讯中心
  • 联系我们

CTF Web安全进阶:从信息收集到漏洞利用的实战技巧

  • 首页
  • 资讯中心
  • /
  • CTF Web安全进阶:从信息收集到漏洞利用的实战技巧

相关资讯

YOLOv8行人跌倒检测系统实战:训练、ONNX部署与PyQt5 GUI 2026/8/26 12:06:58
yolov8-pose行人跌倒检测系统实战:从数据标注到GUI部署 2026/8/26 12:06:58
基于UNet的遥感图像语义分割毕设实战详解 2026/8/26 12:06:58

最新资讯

TJA1043T唤醒机制详解:硬件触发与软件确认协同设计
华为机试高频题:C++实现坐标移动指令解析与避坑指南
2025届毕业生必备:五大抗AI求职工具深度评测
基于SKILL的模块化AI智能体架构:从单体困境到灵活编排的工程实践
螺丝螺母匹配算法:分治思想的物理落地
5分钟部署Hermes Agent:统一管理200+AI模型,快速接入飞书钉钉

今日推荐

Python random 模块常用函数详解:从入门到实战
Hermes接入团队协作后,我推翻了三个效率假设
免费AI大模型调教指南:打造专属网文写作助手

本周热门

Nextcloud 桌面客户端:把同步交给它,你只管改文件
如何将 HTML 转成 Word 文档且格式不丢失?html-to-docx 使用教程
Anki 批量操作卡片完整指南:一次搞定上千张,不再逐张修改

本月精选

如何用DamaiHelper实现演唱会门票的智能自动化抢购:完整技术解决方案指南
第4篇:59 倍性能差距的索引瓶颈定位——一次教科书级的全表扫描调优
终极歌词批量下载神器:5分钟解决离线音乐库歌词同步难题

CTF Web安全进阶:从信息收集到漏洞利用的实战技巧

发布时间:2026/8/26 12:06:58
CTF Web安全进阶:从信息收集到漏洞利用的实战技巧 1. 从一道AFCTF 2021的Web题说起不只是找Flag最近在整理过去的CTF笔记翻到了AFCTF 2021的几道Web题目。虽然比赛过去有段时间了但里面的一些思路和技巧放到今天来看依然很有嚼头尤其是对于想从“脚本小子”阶段进阶的Web安全爱好者来说。很多人刷CTF题可能就止步于“找到Payload拿到Flag”但题目背后涉及的原理、那些看似“非预期”的解法、以及从出题人角度反推的思维过程才是真正能内化成自己能力的东西。今天我就挑其中几道有代表性的Web题不光是给个答案更想聊聊解题时的思考链路、工具的使用细节以及那些容易让人卡住的“坑点”。无论你是刚入门CTF的新手还是想温故知新的老手希望这篇“慢解”能带来一些不一样的启发。AFCTF的题目向来以贴近实战和思维灵活著称2021年的Web方向也不例外。它不会单纯考你一个SQL注入或者文件包含的固定Payload而是往往把这些漏洞点嵌套在特定的业务逻辑、奇怪的编码方式或者需要你主动挖掘的隐藏信息里。这意味着你需要有一个清晰的“侦查-分析-利用-提权/读取”的流程化思维并且对常见Web漏洞的底层原理有足够理解才能灵活变通。接下来我们就进入具体的题目场景。2. 侦察与信息收集被忽略的“源代码”与“响应头”很多新手拿到一个CTF的Web题目尤其是那种只有一个简单输入框或者展示页面的题容易直接上工具一顿扫描或者盲目尝试各种注入语句。其实高效解题的第一步永远是“用眼睛看”手动进行彻底的信息收集。这步做得好往往能直接发现突破口或者节省大量盲目测试的时间。2.1 页面源代码与注释的宝藏一道典型的题目可能是一个登录页面或者一个文件上传界面。你的第一个动作应该是CtrlU或右键查看页面源代码。出题人经常会把关键信息藏在HTML注释里比如被注释掉的链接、提示性的字符串、甚至是部分后端代码逻辑。例如在某道题中页面源代码的注释里可能有一行!-- test account: guest/guest --这直接就给了你一个可以登录的凭证。再比如可能会发现一段被注释掉的JavaScript代码其中包含了对输入进行过滤的逻辑让你明白哪些字符被禁止了从而思考如何绕过。更隐蔽一点的是注释中的路径提示!-- debug file: /debug.php --这个/debug.php可能就是一个未在导航中显示但实际存在的功能页面里面可能包含phpinfo、执行命令的接口等。注意查看源代码时不仅要看最外层的HTML如果页面引入了JavaScript文件.js也要点进去看看。有时关键的逻辑或接口地址就放在独立的JS文件中。2.2 HTTP响应头里的“蛛丝马迹”按F12打开开发者工具切换到“网络”(Network)选项卡刷新页面查看第一个文档通常是/或index.php的响应头(Response Headers)。这里常常包含服务器信息、框架指纹和潜在的漏洞提示。Server 显示Apache/2.4.49。如果你熟悉漏洞库可能立刻会想到这个版本是否存在已知的路径穿越或RCE漏洞例如CVE-2021-41773。这虽然不一定是解题的直接路径但为你提供了攻击面信息。X-Powered-By 显示PHP/7.4.21。这告诉你后端语言是PHP那么你的Payload构造如文件包含、命令执行就需要用PHP的语法。自定义Header 出题人可能会设置一些自定义的Header比如X-Flag: part1_of_3将Flag分成几部分藏在不同的地方。或者X-Hint: try to look at the /robots.txt。Set-Cookie 观察Cookie的命名和值。有时Cookie的值可能是Base64编码的序列化字符串提示存在反序列化漏洞。或者Cookie的名字本身就有提示如is_admin0那么目标可能就是如何将其改为1。2.3 敏感文件与目录探测这是自动化工具如dirsearch, gobuster擅长的工作但手动了解常见敏感文件清单很重要/robots.txt 可能暴露管理后台路径/admin//backup/。/.git/ 如果存在可能通过git泄露源码。/.DS_Store Mac系统文件可能泄露目录结构。/www.zip/source.tar.gz 网站源码备份文件。/phpinfo.php/test.php 调试文件可能泄露环境配置、绝对路径等。/admin.php/upload.php 功能页面。在AFCTF的一道题中通过目录扫描发现了一个/backup/目录里面存放了网站某一版本的源码压缩包从而实现了“白盒审计”让难度大大降低。3. 漏洞利用的深度思考以文件包含与PHP封装协议为例信息收集之后我们进入漏洞利用阶段。这里我以PHP文件包含(LFI)为例因为它非常经典且能引申出很多高级利用技巧。很多题目不会让你简单地include($_GET[‘file’])而是会设置层层过滤。3.1 基础过滤与常见绕过假设题目代码如下$file $_GET[file]; if (strpos($file, ‘..’) ! false) die(‘Hacker!’); // 过滤目录穿越 if (strpos($file, ‘/’) ! false) die(‘Hacker!’); // 过滤斜杠 include(‘./pages/’ . $file . ‘.php’);它期望你访问?filehome来包含./pages/home.php。过滤了../和/看似无法跳出pages目录。绕过思路1利用PHP封装协议php://filter协议可以用来读取文件源码即使后缀被强制添加.php。因为include会执行php文件但php://filter是一种流它会在数据被include之前先对数据进行处理。 Payload:?filephp://filter/readconvert.base64-encode/resourceindex最终服务器会尝试包含./pages/index.php但php://filter会先将index.php文件的内容Base64编码后输出。我们拿到Base64字符串解码即可得到index.php的源代码从中可能找到数据库密码、其他包含点或Flag路径。绕过思路2利用长度截断或空字节PHP版本5.3.4在旧版本PHP中include(‘./pages/’ . $file . ‘.php’)如果$file末尾存在空字节(%00)则.php会被截断。但此题过滤了/所以即使能截断也需要一个绝对或相对路径。如果没过滤..可以?file../../../../etc/passwd%00。本题过滤了此路不通。绕过思路3利用日志文件包含这是LFI Getshell的经典手段。思路是既然我们可以包含.php文件并且我们可以通过User-Agent、Referer等HTTP头让服务器将我们的PHP代码写入日志文件如/var/log/apache2/access.log那么我们就可以包含这个日志文件从而执行其中的PHP代码。首先需要知道服务器的绝对路径可能通过报错信息或phpinfo获得。然后猜测日志文件路径常见的有/var/log/apache2/access.log/var/log/nginx/access.log等。使用Burp Suite或curl在User-Agent中插入一段PHP代码?php system($_GET[‘cmd’]); ?然后访问网站。最后使用LFI漏洞去包含这个日志文件?file../../../../var/log/apache2/access.log需要绕过路径遍历过滤。如果包含成功再传递?cmdid就可以执行命令了。在AFCTF的一道题中就综合运用了这些技巧。题目首先通过一个简单的文件包含读取到了一个配置文件里面提示了Flag的路径在/flag但直接包含/flag只会显示“Hacker!”。进一步审计发现的源码通过php://filter读取显示它对包含的路径做了白名单校验只允许包含/var/www/html/下的.php文件。这时日志包含就成了关键。通过注入PHP代码到日志再包含日志文件就成功在服务器上建立了“Web Shell”从而读取了/flag。3.2 封装协议的组合拳php://input与data://php://input 可以读取POST请求的原始数据。如果allow_url_include配置为On且过滤不严可以直接通过POST传递PHP代码执行。GET /?filephp://input POST 数据 ?php system(‘ls /’); ?data:// 同样需要allow_url_includeOn。可以直接在URL中嵌入Base64编码的代码。?filedata://text/plain;base64,PD9waHAgc3lzdGVtKCJscyAvIik7Pz4(即?php system(“ls /“);?的Base64)在实际比赛中allow_url_include常常是关闭的因此php://filter用于读源码和日志包含用于Getshell更为常用。4. 代码审计与逻辑漏洞跳出漏洞类型的定式思维Web题不只有注入和文件包含。很多题目考察的是你对代码逻辑的理解也就是业务逻辑漏洞。这类题目往往代码量不大但需要你仔细推敲每一行代码的意图和可能产生的歧义。假设一道题目是关于一个“积分兑换”的系统。核心代码如下// 用户购买商品 if ($_POST[‘action’] ‘buy’) { $price (int)$_POST[‘price’]; $user_points get_user_points($_SESSION[‘userid’]); // 从数据库获取用户当前积分 if ($user_points $price) { $new_points $user_points - $price; update_user_points($_SESSION[‘userid’], $new_points); // 更新用户积分 deliver_goods($_SESSION[‘userid’], $_POST[‘goods_id’]); // 发货 echo “Purchase successful!”; } else { echo “Not enough points!”; } } // 管理员后台为用户添加积分仅admin可访问 if ($_POST[‘action’] ‘admin_add_points’ is_admin()) { $target_user $_POST[‘userid’]; $add_points (int)$_POST[‘points’]; $user_points get_user_points($target_user); $new_points $user_points $add_points; update_user_points($target_user, $new_points); echo “Points added!”; }粗看之下购买逻辑似乎没问题检查、扣款、发货。但这里存在一个并发竞争条件漏洞。漏洞分析第4行get_user_points是从数据库读取积分。第5行进行判断。第7行update_user_points进行更新。如果用户同时发起两个购买请求比如用Burp Suite的Turbo Intruder同时发送且他的积分只够买一件商品。可能出现以下时序请求A读取积分user_points100商品价格price100判断通过。请求B几乎同时读取积分user_points100因为A还没更新数据库商品价格price100判断也通过。请求A更新积分new_points0。请求B更新积分new_points0它用自己读取的100去减。结果用户用100积分买走了两件价值100积分的商品。解题利用 在CTF中这种漏洞的利用方式就是快速并发发送多个购买请求试图“绕过”积分检查。题目可能会设置一个很贵的“Flag商品”需要10000积分而你只有100积分。通过并发攻击你可能只用100积分就兑换成功。防御与思考 这道题考察的是对“检查-操作”非原子性的认识。正确的做法应该在数据库层面使用“乐观锁”或“悲观锁”或者在更新时增加条件UPDATE users SET points points - 100 WHERE userid1 AND points 100然后检查更新的行数是否大于0来判断是否扣款成功。做这类题关键是把代码的执行流程画出来思考在多用户、高并发哪怕是快速连续请求的情况下数据流是否会错乱。常见的逻辑漏洞还有修改订单金额、修改商品ID、跳过验证步骤、密码重置令牌泄露、短信邮箱轰炸等。5. 客户端安全与前端混淆JavaScript不是保险箱现代Web题目越来越多地涉及前端JavaScript代码考察你的代码调试和逆向能力。Flag或关键逻辑可能被隐藏在混淆过的JS代码中。5.1 简单的代码审计一道题可能是一个登录框点击登录后页面弹窗“Wrong Password!”但网络请求里并没有看到向后台发送请求。这说明验证逻辑可能在前端。 查看源代码找到相关的JavaScriptfunction checkPassword() { var input document.getElementById(‘pass’).value; var enc btoa(input); // Base64编码 if (enc “YWRtaW4xMjM0NTY”) { // 解码后是 ‘admin123456’ // 跳转到获取Flag的页面 window.location.href ‘/flag.php?token’ enc; } else { alert(‘Wrong Password!’); } }这题就很简单直接看出密码是admin123456或者用控制台atob(“YWRtaW4xMjM0NTY”)解码。5.2 应对代码混淆与反调试更复杂的题目会对JavaScript进行混淆变量名变成_0x1a2b3c逻辑被拆散并可能设置反调试。var _0x3f21[‘\x63\x6f\x6e\x73\x74\x72\x75\x63\x74\x6f\x72’,’\x48\x65\x6c\x6c\x6f\x20\x57\x6f\x72\x6c\x64!’]; (function(_0x1d8c05,_0x3f218e){var _0x4b6d8afunction(_0x4f2882){while(--_0x4f2882){_0x1d8c05[‘push’](_0x1d8c05[‘shift’]());}};_0x4b6d8a(_0x3f218e);}(_0x3f21,0x1f4)); var _0x4b6dfunction(_0x1d8c05,_0x3f218e){_0x1d8c05_0x1d8c05-0x0;var _0x4b6d8a_0x3f21[_0x1d8c05];return _0x4b6d8a;};function check(){var _0x4f2882document[‘getElementById’](‘key’)[‘value’];if(_0x4f2882[_0x4b6d(‘0x0’)]()‘flag{this_is_not_flag}’){alert(‘Correct!’);}else{alert(‘Try Again!’);}};面对这种代码使用浏览器开发者工具在Sources面板中可以给JS文件设置断点单步执行观察变量的值。使用在线反混淆工具如 de4js、JavaScript Deobfuscator 等可以一定程度上还原代码。直接控制台调试对于简单的字符串数组映射可以直接在控制台打印关键数组。比如上面代码在控制台输入_0x3f21可能就会输出[“constructor”, “Hello World!”]之类的原始字符串数组从而理解其逻辑。对抗反调试有些代码会检测开发者工具是否打开如果打开就进入死循环或跳转到错误页面。应对方法可以是使用setTimeout或debugger;语句断点绕过。使用浏览器插件禁用调试检测。直接使用Node.js环境加载并修改这份JS文件在本地运行分析。在AFCTF的一道逆向类Web题中核心算法被放在一个高度混淆的JS文件里。解题的关键不是完全还原所有代码而是定位到核心的校验函数。通过浏览器动态调试在用户输入后跟踪数据的传递过程最终发现是将输入字符串与一个硬编码的数组进行异或运算结果再与另一个数组比较。我们不需要读懂全部混淆代码只需要在控制台里将那个硬编码的“结果数组”与“密钥数组”进行逆运算就能得到正确的输入也就是Flag。6. 实战中的工具链与效率提升工欲善其事必先利其器。CTF解题尤其是Web离不开一套顺手的工具。但工具是辅助思维是核心。这里分享一些我常用的组合和技巧。6.1 浏览器插件套装Hack-Tools 集成了多种Payload、编码解码、哈希计算等功能非常方便。EditThisCookie 方便地查看和修改Cookie。Wappalyzer 快速识别网站使用的技术栈。SwitchyOmega 配合Burp Suite等代理工具进行流量管理。6.2 代理与重放Burp Suite的核心用法Burp Suite是Web安全测试的瑞士军刀。除了抓包改包一些进阶用法在CTF中很高效Intruder入侵者 用于爆破、模糊测试。在遇到需要枚举参数如ID、文件名、Token时非常有用。关键是设置好Payload位置和类型Sniper, Battering ram, Pitchfork, Cluster bomb。Repeater重放器 用于手动修改和重复发送单个请求观察响应变化。这是分析逻辑漏洞、测试Payload的主要战场。Comparer对比器 用于比较两个响应的差异。在“盲注”或“盲打”场景下通过比较响应长度、内容的细微差别来判断注入是否成功。Decoder解码器 集成各种编码解码URL, HTML, Base64, Hex, ASCII等以及哈希计算。比在线网站更快捷安全。Collaborator Client 用于检测盲注、SSRF、盲XSS等“无回显”漏洞。Burp会生成一个临时域名如果你的Payload触发了对外请求Collaborator就能收到通知证明漏洞存在。6.3 命令行利器的组合在服务器环境或需要自动化时命令行工具无可替代curl 发送HTTP请求的利器。用于快速测试某个端点或者编写简单的自动化脚本。# 发送带特定Header的POST请求 curl -X POST http://target.com/login -H “Cookie: sessionabc123” -d “useradminpassguess” # 发送文件上传请求 curl -F “fileshell.php” http://target.com/uploadsqlmap 自动化SQL注入工具。在CTF中如果时间紧迫且确认存在SQL注入可以使用。但建议先手工验证理解注入点类型整型、字符串、搜索型、报错型、盲注等再用sqlmap会更得心应手。--technique参数指定注入技术--level和--risk调整测试等级。gobuster/dirsearch 目录扫描。gobuster dir -u http://target.com -w /path/to/wordlist.txt。python3 requests库 这是最灵活的方式。对于复杂的交互流程如需要先获取Token再登录再进行多步操作编写一个Python脚本是最可靠的。import requests s requests.Session() # 1. 获取初始页面可能包含隐藏的Token r1 s.get(‘http://target.com/’) token extract_token(r1.text) # 自己写解析函数 # 2. 使用Token登录 login_data {‘csrf_token’: token, ‘user’: ‘…’, ‘pass’: ‘…’} r2 s.post(‘http://target.com/login’, datalogin_data) # 3. 携带Session进行后续操作 r3 s.get(‘http://target.com/admin’) print(r3.text)6.4 思维导图与笔记对于复杂的多步题目在纸上或使用XMind等工具画一个简单的流程图非常有助于理清思路1. 访问首页 - 发现源码注释提示 /source - 下载到源码 2. 审计源码 - 发现文件包含漏洞点 include(‘templates/’.$_GET[‘page’]) 3. 尝试包含 /etc/passwd - 被过滤 str_replace(‘..’, ‘’, $page) 4. 尝试 php://filter 读源码 - 成功发现数据库配置 5. 数据库配置中有绝对路径 /var/www/html/ - 猜测日志路径 6. 在User-Agent中插入PHP代码访问页面 - 污染日志 7. 利用文件包含执行日志中的代码 - 成功执行 ls / 8. 发现 /flag 文件 - 通过包含的Web Shell读取这样一步步推下来不容易迷失方向。7. 从解题到内功赛后复盘与技能延伸解出一道CTF题拿到Flag欢呼之后工作只完成了一半。更有价值的环节是复盘把这道题涉及的知识点钻深吃透。复盘清单漏洞原理 这道题考的是什么漏洞它的根本原因是什么例如SQL注入是因为用户输入被直接拼接进SQL语句没有预编译或过滤。利用条件 这个漏洞成功利用需要哪些条件例如文件包含需要allow_url_includeOn才能用php://inputSSRF需要目标网络可达且有回显或可利用其他服务。绕过技巧 题目设置了哪些过滤我用的绕过方法是什么例如过滤了空格用/**/或%0a绕过过滤了select用SeLeCt大小写绕过。还有没有其他可能的绕过方式防御方案 从开发者的角度如何修复这个漏洞例如SQL注入用参数化查询文件包含用白名单限制包含的文件名XSS对输出进行HTML实体编码。关联知识 这道题还牵扯到哪些周边知识例如利用文件包含Getshell涉及了Web服务器日志路径、PHP封装协议、Linux基础命令。技能延伸如果考了PHP反序列化就去深入学习PHP的序列化格式、魔术方法__wakeup,__destruct、以及常见POP链的构造。如果考了SSTI服务器端模板注入就去学习Jinja2、Twig、Smarty等模板引擎的语法和沙箱绕过。如果考了XXEXML外部实体注入就去理解XML DTD的结构、内部实体、外部实体、参数实体以及如何利用它们读取文件或发起SSRF。CTF题目是一个个精心设计的“密室”而现实中的渗透测试则是开放的“城市”。解题技巧是开锁工具而计算机网络、操作系统、编程语言、数据库这些基础知识才是你在这座城市里行走和探索的地图。多打CTF可以快速积累“开锁”经验但千万别忘了抽时间夯实底层地图。比如理解HTTP协议能让你更好地使用Burp Suite熟悉Linux系统能让你在拿到Web Shell后顺利地进行横向移动懂一些前端JavaScript能让你更快地逆向分析混淆代码。最后保持好奇心和耐心。遇到难题卡住几个小时很正常去喝杯水散个步或者看看别人的解题思路Writeup。看懂Writeup后一定要自己动手复现一遍过程中你会发现自己忽略的细节。AFCTF 2021的题目只是无数个训练场之一重要的是通过这个过程建立起属于你自己的、系统化的Web安全知识体系和问题解决框架。

关于恒美微站

恒美微站专注于为个体商户、工作室提供极简自助建站服务,让每个人都能轻松拥有专业网站。

快速链接

  • 关于我们
  • 建站服务
  • 主题模板
  • 案例展示
  • 资讯中心

服务项目

  • 可视化建站
  • 拖拽编辑
  • 主题定制
  • SEO 优化
  • 网站托管

联系方式

  • 📍 地址:北京市朝阳区建国路 88 号
  • 📞 电话:400-888-8888
  • ✉️ 邮箱:info@hmyw.cn
  • 🕐 时间:周一至周日 9:00-18:00

© 2024 恒美微站 hmyw.cn 版权所有 | 京 ICP 备 12345678 号