第一步:目录爆破,发现隐藏文件
操作 使用 dirsearch 对目标站点进行目录扫描
python dirsearch.py -u http://172.26.99.162
扫描结果返回 200 状态码,发现readme.txt,在浏览器访问http://172.26.99.162/readme.txt。
知识点
为什么要做目录扫描:页面源码、抓包只能看到前端输出的内容,服务器上还存放很多没有对外做链接的文件,readme、备份 txt、zip、源码备份都是 CTF 高频考点。

第二步:JS 混淆代码 ! [] () + 解密,获取下一关提示
操作 访问readme.txt,页面全部是由! [] () +组成的字符串。
知识点
✅为什么必须放到浏览器控制台解密,页面源码 / 抓包看不到结果?
- 这一整串文本本身不是明文,它是可执行的 JavaScript 代码;
- 浏览器直接访问 txt 文件,只是把文本渲染展示出来,不会自动执行 JS 代码;
- 只有粘贴到 Console 控制台,浏览器 JS 引擎才会解析运行这段混淆代码,执行后调用alert()弹窗输出提示。
- 抓包拿到的就是原始混淆字符串,没有执行,所以抓包看不到解密结果。
底层原理:JS 里面[]是空数组,![]取反得到布尔值false,![]+[]可以做隐式类型转换,把布尔值转为字符串,再通过字符串拼接构造出任意字符。JSFuck 就是基于 JS 隐式类型转换特性实现的混淆。

第三步:访问提示路径,拿到 PHP 变形混淆代码
操作 浏览器访问 http://172.26.99.162/Txt.Txt,页面出现一大串以$=~[];$={___:++$$…开头的代码。
知识点
❗注意:不要误以为是 PHP 代码就要丢到 PHP 环境运行,本题把混淆源码直接输出给浏览器,这串字符串同时也是合法 JavaScript 代码,可以直接交给浏览器 JS 引擎执行。

第四步:再次控制台执行混淆代码,获取最终 flag
操作
知识点 这份混淆巧妙构造语法,同一份字符串既是合法 PHP 语法,同时也是合法 JS 语法。
- 如果放在 PHP 页面访问,PHP 会执行代码;
- 但本题放在 txt 静态文件,直接返回源码,复制丢浏览器 JS 控制台也可以解析执行,直接弹窗输出 flag。

遇到同类题型通用分析思路
① 第一步:先确认所有常规信息
如果全部没有 flag,说明 flag 不在前端渲染内容,大概率存在服务器上的隐藏文件,立刻做目录扫描。
② 拿到奇怪符号文本,先判断混淆类型
| 只有 ! [] () + | JSFuck | 复制粘贴浏览器 Console 执行,也可以网上找 JSFuck 在线解码器 |
| 大量$、~、{},没有字母数字 | PHP 异或变形混淆 | 优先尝试粘贴浏览器控制台执行;不行复制放到本地 php 文件,php 命令行运行解析 |
| 大量eval()、strrev、base64 | 普通 JS/PHP 编码混淆 | 找到 eval 替换 console.log 输出内容 |
⚠️重要判断点: 文件后缀是.txt,代表服务器不会执行代码,只会返回源代码文本!txt 里面的代码不会自动运行,必须人工复制交给解释器执行,浏览器页面只是单纯展示文本,不会解析执行 JS/PHP。
③ 区分:什么时候放浏览器控制台,什么时候放 PHP 环境
④ 核心做题思想
混淆文本本身≠结果,混淆文本是一段程序,必须交给对应语言解释器执行,才能输出结果;浏览器打开 txt 只是把字符串渲染给你看,不会自动运行程序,所以源代码、抓包都看不到解密之后的 flag。







