源代码 — 考点精讲
前置知识:HTTP 协议基础 — 先了解 HTTP 协议基础再来看本考点
原理精讲 — 为什么 flag 能藏在源码里?
服务器响应 vs 浏览器渲染
浏览器把服务器返回的 HTML 解析成 DOM 树再渲染到屏幕上。但服务器返回的原始文本里,有很多东西是”不上屏”的:
<!-- HTML 注释:浏览器不显示 --> ← flag 可能藏这里
<script>var key = "abc123"</script> ← flag 可能在 JS 变量里
<style>/* CSS 注释 */</style> ← flag 可能在 CSS 里
<input type="hidden" value="xxx"> ← 隐藏表单字段
<meta name="flag" content="xxx"> ← meta 标签浏览器渲染一个”正常页面”给用户看,但这些上屏之外的文本,全都在响应源码里可读。查看”源代码”题 = 查看服务器返回的原始文本,而不是渲染后的页面。
服务器逻辑
这类题根本不存在复杂的服务器逻辑——页面就是一个静态 HTML(甚至是个小游戏),里面写了一条 HTML 注释 <!-- ctfhub{...} -->。Web 服务器直接返回这个文件,没有任何隐藏处理。
为什么常做成”小游戏”页面?
不是巧合。小游戏页面:
- 有足够长的 JS 代码和 Canvas 逻辑,让页面看起来”很正经”
- 用可交互的操作(按键、鼠标)吸引注意力
- 你忙着玩游戏的时候,不会想到去看源码
这本质上是注意力引导——把玩家的视线引到游戏上,flag 躺在源码里没人看。越是”正常、好玩”的页面,越容易让人忘了第一步该拉源码。
注意事项
| 易错点 | 说明 |
|---|---|
| 第一步永远拉源码 | 任何页面先 curl -s 拉下来搜 flag,不要先交互 |
| grep -o 精确提取 | grep -o 'ctfhub{[^}]*}' 用正则只输出匹配部分,不用肉眼扫 |
| 格式差异 | flag 可能是 flag{xxx} / ctfhub{xxx},注意匹配开头 |
| Ctrl+U vs F12 Elements | Ctrl+U 看原始响应源码不会漏;Elements 是解析后的 DOM,注释可能被过滤 |
| 不止注释 | JS 变量、CSS、meta、隐藏 input、base64 都是藏匿位 |
| 响应头也检查 | flag 可能藏在响应头里(curl -s -D -) |
题目解法
CTFHub 技能树位置:CTFHub → Web → Web 前置技能 → HTTP 协议 → 响应包源代码
解法(curl 终端):
# 1. 直接请求页面,用正则搜 flag 格式(不用肉眼扫)
curl -s http://目标/ | grep -o 'ctfhub{[^}]*}'
# 2. 或者把整个响应拉下来,肉眼找注释
curl -s http://目标/
# 中间能看到 <!-- ctfhub{...} -->,浏览器渲染时不显示,但源码里明晃晃躺着解法(浏览器):
- 打开页面(可能是个贪吃蛇小游戏)
- 按
Ctrl+U(或右键”查看网页源代码”),搜索flag/ctfhub - 找到注释中的 flag——根本不用玩
常见藏匿位置
| 藏匿位置 | 终端查找方式 |
|---|---|
| HTML 注释 | curl -s URL | grep -E '<!--.*flag' |
| JS 变量 / 字符串 | curl -s URL | grep -Eo '(flag|ctfhub)\{[^}]+\}' |
| 响应头 | curl -s -D - URL | grep -i flag |
| 隐藏 input | curl -s URL | grep -E 'type="hidden"' |
| meta 标签 | curl -s URL | grep -E '<meta.*flag' |
| CSS 注释 / 伪类 | curl -s URL | grep -E '/\*.*flag' |
| 大段 base64 内容 | base64 解码后搜 flag |
| 路径引用(图片/css/js 文件名) | 看 src/href 里有没有可疑文件名 |
核心知识点总结
| 概念 | 说明 |
|---|---|
| 响应包源代码 | 服务器返回的原始 HTML/JS/CSS 文本,浏览器不做修改 |
| 渲染 vs 源码 | 浏览器渲染页面时过滤掉注释;源码里注释、JS、style 都在 |
| HTML 注释 | <!-- 内容 -->,是源码题最常见的 flag 藏匿位 |
| 查看源码 | Ctrl+U(浏览器原始源码)、curl -s(终端原始响应) |
| 动态/交互页面 | 越像”正常应用”越容易让人忽略源码检查 |
| grep -o | -o 只输出匹配部分,适合直接提取 flag |
关联教程
- HTTP 协议基础 — CTF 中 HTTP 相关考点总览
- 请求方式 — 自定义 HTTP 方法解题
- 302 跳转 — 重定向响应中隐藏 flag
- Cookie — 篡改 Cookie 获取 flag
- 基本认证 — HTTP Basic 认证绕过与爆破
- 01-计算机网络基础 — OSI 模型与 TCP/IP 协议栈
- 02-Web技术基础 — HTTP 协议完整解析
- 01-Web基础与HTTP协议 — Web 安全实战场景
- Web 方向总览 — Web 方向 CTF 题型与思路总览
- 总目录与快速查询 — 红队完整知识体系