源代码 — 考点精讲

前置知识: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 ElementsCtrl+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{...} -->,浏览器渲染时不显示,但源码里明晃晃躺着

解法(浏览器):

  1. 打开页面(可能是个贪吃蛇小游戏)
  2. Ctrl+U(或右键”查看网页源代码”),搜索 flag / ctfhub
  3. 找到注释中的 flag——根本不用玩

常见藏匿位置

藏匿位置终端查找方式
HTML 注释curl -s URL | grep -E '<!--.*flag'
JS 变量 / 字符串curl -s URL | grep -Eo '(flag|ctfhub)\{[^}]+\}'
响应头curl -s -D - URL | grep -i flag
隐藏 inputcurl -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

关联教程