ctf show web入门47
这是一个经典的 PHP 命令注入Command Injection 挑战。出题人的意图是让你绕过正则表达式的过滤读取服务器上的 flag 文件。注入点通过 GET 参数 c 传递命令。过滤内容;分号用于执行多条命令。cat, flag, more, less, head, sort, tail读取文件的常用命令和关键字。空格空格被过滤需要找替代符。[0-9]数字被过滤。变量符号被过滤无法使用环境变量。∗通配符被过滤。执行环境system(变量符号被过滤无法使用环境变量。 *通配符被过滤。 执行环境system(变量符号被过滤无法使用环境变量。∗通配符被过滤。执行环境system(c. /dev/null 21);。注意这里有个坑你的命令执行结果会被重定向到 /dev/null黑洞这意味着页面不会直接显示命令回显。2. 解题思路与绕过技巧第一步绕过重定向获取回显由于后端强制追加了 /dev/null 21我们需要在命令末尾加上截断符让后面的重定向失效。常用截断符%0a (换行符)、|| (逻辑或)、 (逻辑与)。注意; 被过滤了所以通常选择 %0a。第二步绕过空格过滤常用的空格替代符${IFS}但 $ 被过滤不可用$IFS$9不可用%09 (Tab 键) (输入重定向)第三步绕过关键字flag / cat绕过 flag可以使用问号 ? 通配符。例如 fl?g 或 fla?。绕过 cat虽然 cat, more, less 等都被过滤了但 Linux 下读取文件的命令还有很多tac反向列示未被过滤nl添加行号打印未被过滤od -avi / vim通常环境下不可用但在某些 CTF 容器中可行grep可以使用 grep ‘a’ flag.php3. 构建 Payload结合以上思路我们需要构造一个既能绕过正则、又能绕过重定向、还能读取文件的 Payload。先查看当前目录下的文件payload为?cls%0a或者?cls||方案 A使用 tac 和通配符构造payload为?ctac%09fla?.php%0a方案B使用nl绕过payload为?cnl%09fla?.php%0a查看源代码即可得到flag