这两个命令是 Linux 下的“孪生兄弟”,但在 CTF 中,tac往往比cat更有“骚操作”空间。
1. 字面与本质
cat:全称conCATenate(连接)。它的主要设计初衷其实不是用来查看文件,而是用来合并多个文件。只不过大家最常用它来查看单个文件的内容。
tac:全称cat spelled backwards(
cat反过来拼)。它是cat的逆序版本。
2. 核心区别:阅读顺序
这是两者最大的差异。
命令 | 读取方向 | 示例(文件内容:Line1, Line2, Line3) |
|---|---|---|
cat | 从头到尾(顺序) | Line1 → Line2 → Line3 |
tac | 从尾到头(逆序) | Line3 → Line2 → Line1 |
演示:
假设有一个文件test.txt:
Apple Banana Cherry执行cat test.txt:
Apple Banana Cherry执行tac test.txt:
Cherry Banana Apple3. 在 CTF 实战中的区别与应用
在 Web 渗透和 CTF 中,仅仅知道“倒过来读”是不够的,你需要知道为什么要倒过来读。
场景一:绕过关键字过滤(最常见)
很多 CTF 题目为了增加难度,会在后端过滤cat这个关键字(比如strstr($dir, "cat"))。
Payload:
dir=%26%26 cat flag.php❌ (被拦截)Payload:
dir=%26%26 tac flag.php✅ (绕过了检测)
原理:WAF 或代码逻辑只禁用了cat,但没有禁用tac、more、less、tail等其他读取命令。
场景二:配合head或tail精准提取
有时候文件很大,或者 PHP 报错信息太多,你想只看最后一行(Flag 通常在最后一行,或者第一行)。
看最后一行:
tac flag.php | head -n 1先把文件倒过来,第一行变成了最后一行,然后用
head -n 1取第一行。
看第一行:
cat flag.php | head -n 1
场景三:日志分析与栈追踪
在分析日志文件(如/var/log/auth.log)时,最新的记录通常追加在文件末尾。
用
cat看日志,你得一直往下翻。用
tac看日志,最新的攻击记录最先映入眼帘。
场景四:对抗“死猫”(Dead Cat)
有时候cat命令被/bin/cat的绝对路径限制了,或者被 alias(别名)改写了。
有些选手会习惯性地用
tac,因为它比较冷门,系统管理员往往忘记限制它。
4. 关联命令家族(CTF 必知)
既然提到了cat和tac,CTF 中还有几个经常拿来互相替换的命令,用于绕过过滤:
命令 | 作用 | 备注 |
|---|---|---|
cat | 显示全部内容 | 容易被禁 |
tac | 倒序显示全部 | 绕过神器 |
more | 分页显示 | 按空格下一页 |
less | 分页显示(高级版) | 比 more 好用 |
head | 显示头几行 |
|
tail | 显示尾几行 |
|
nl | 带行号显示 | 有时能绕过 |
sort | 排序显示 | 打乱原顺序 |
rev | 每列反转 |
|
strings | 提取可见字符 | 读二进制文件找 Flag 必备 |
5. 针对本题的特殊点
回到你的题目:
$dir=$_POST['dir']; system("ls ".$dir);当你输入dir=%26%26 tac flag.php:
执行
ls执行
tac flag.php
如果flag.php内容是:
<?php $flag="flag{this_is_flag}"; ?>用cat看到的是:
<?php $flag="flag{this_is_flag}"; ?>用tac看到的是:
?> $flag="flag{this_is_flag}"; <?php虽然看起来乱了,但是 Flag 字符串flag{this_is_flag}依然完整暴露了。 这在 CTF 中是完全有效的。
总结
日常使用:用
cat。CTF 绕过:首选
tac或more。原理:利用冷门命令不在黑名单中的特性,或者利用逆序特性辅助查看日志。
下次如果遇到cat被禁,试试tac、more、less、nl,总有一个能打!😉