ctf show web入门54
这道题目是 ctf.show 中典型的 命令执行RCE绕过 题。虽然看起来过滤非常严密但只要理清了它的过滤规则就能找到生存空间。过滤规则拆解代码通过 preg_match 过滤了以下内容/i 表示不区分大小写符号类 ; (分号), (反引号), %, * (通配符), , (重定向), (\x26), \t (\x09)。数字类 [0-9]。空格类 直接过滤了空格。关键字类重点 这里使用了 .*c.*a.t.这种贪婪匹配模式。这意味着只要你的字符串中按顺序出现了 c、a、t 这三个字母就会被拦截。被拦截的命令包括cat, flag, more, wget, less, head, sort, tail, sed, cut, tac, awk, strings, od, curl, nl, scp, rm。被过滤的命令行cat最基础的文件读取命令more分页显示文件内容less分页显示文件比more高级多一些功能head显示文件前几行默认显示前10行tail显示文件的最后几行默认显示后10行sort对文件内容进行排序会读取并显示整个文件sed对文件进行文本转换与编辑cut从每行中提取部分内容。例如cut -d: -f1 filename以冒号分隔取出第一列。tac反向catawk文本分析和处理工具。例如awk ‘{print $1}’ filename打印第一行strings从二进制文件中提取可打印字符串od选择格式显示文件nl显示文件内容并添加行号也是一个通用的命令curl通过URL传输数据可读取远程文件wget从网络下载文件scp在主机间复制文件基于ssh需要认证rm删除文件或目录那看到最后一个rm可以联想到它一系列的兄弟可以进行绕过cp复制文件可以指定名称 mv移动文件可以指定新名称 vi编辑文件除了上面两个命令之外还可以grep查找关键行 rev显示全部内容但字符顺序反转 uniq去重文件内容并显示完整内容————————————————版权声明本文为CSDN博主「!!!.」的原创文章遵循CC 4.0 BY-SA版权协议转载请附上原文出处链接及本声明。原文链接https://blog.csdn.net/m0_64481831/article/details/1541204672. 绕过思路A. 解决“空格”被过滤在 Linux shell 中当空格被过滤时常用的替代符有${IFS}$IFS$9但这题过滤了 和 本题解法 使用 ${IFS}。B. 解决“关键字”顺序过滤正则 .*f.*l.*a.g.过滤了 flag。但它只能过滤“顺序”出现的字符。绕过技巧 1利用变量定义。在 shell 中你可以定义变量再拼接afl;bag;cataaab。但本题过滤了分号 ;无法在一行内通过分号执行多条命令。绕过技巧 2利用 Shell 特殊变量。在命令中插入空变量或特殊符号flagfl\agf${高三}lag绕过技巧 3利用通配符 ?。虽然 * 被过滤了但 ?匹配单个字符没有被过滤。C. 解决“读取命令”被过滤cat, tac, nl, more, less, tail, head 全被过滤了。剩余可用命令 rev, mv, vi (不可用), uniq。终极杀招 grep。grep 可以搜索字符串。如果我们搜索“包含某个字符”的所有行其实就相当于读取了文件。payload1使用grep查找关键行?cgrepIFS′f′{IFS}fIFS′f′{IFS}f???.phppayload2使用uniq去重文件内容并显示完整内容?cuniq${IFS}f???.phppayload3使用 rev显示全部内容但字符顺序反转:?crev${IFS}f???.php为什么payload为?cuniqIFSf???.php时成功但是payload为?cuniq{IFS}f???.php时成功但是payload为?cuniqIFSf???.php时成功但是payload为?cuniq{IFS}fl??.php就得不到flag呢核心原因正则表达式的“顺序拦截”题目中的过滤规则是这样的preg_match(“/…|.*f.*l.*a.g.|…/i”, $c)这里的 .*f.*l.*a.g.是一个极其严格的陷阱。它的含义是只要你的输入中按顺序出现了 f、l、a、g 这四个字母无论它们之间隔了多少个字符都会被拦截。我们可以对比一下这两个 Payload 在正则眼里的样子 Payload A: ?cuniq${IFS}fl??.php你的输入包含字符f, l, ?, ?, ., p, h, p正则匹配过程找到了 f。紧接着找到了 l。后面还有 .php。虽然你没有显式写 a 和 g但如果当前目录下存在一个叫 flag.php 的文件某些环境下 PHP 的 preg_match 可能会因为后续逻辑或误判触发拦截但在本题中通常是因为匹配到了顺序。更直接的原因是很多 CTF 题目的环境会在你提交后后台尝试解析或你的字符串中确实存在 f 和 l 的顺序。 Payload B: ?cuniq${IFS}f???.php你的输入包含字符f, ?, ?, ?, ., p, h, p正则匹配过程找到 f。接下来寻找 l。但是你的字符串里没有字母 l只有问号 ?。结果 正则表达式匹配失败安全通过然后字符串被传给 system()。在 Linux Shell 执行时f???.php 会被通配符自动展开为 flag.php。为什么 fl??.php 往往会失败在 ctf.show 的这道特定题目中过滤规则里其实隐藏了一个逻辑它不仅过滤了 flag 单词还防止你通过前缀拼接来逼近这个单词。f l 的组合 只要你写出了 fl你就已经完成了 .*f.*l.*a.g.匹配进度的 50%。问号的妙处 使用 f???.php 时你绕过了 PHP 层面对于“字母顺序”的检测因为在 PHP 看来? 只是一个标点符号不是 l、a 或 g。只有当这个字符串到达 Linux 系统 Shell 手里时它才会被翻译成 flag.php。验证“顺序拦截”的威力这个正则 .*f.*l.*a.g.甚至会拦截一些看起来完全无关的句子输入funnylogicandgame \rightarrow 拦截 (因为顺序包含 f, l, a, g)输入fileagent \rightarrow 拦截输入f??? \rightarrow 放行 (因为不包含 l, a, g)总结与建议在处理这种“顺序通配符过滤”时最稳妥的办法就是只保留一个首字母剩下的全部用 ? 代替。推荐做法 ?cuniq${IFS}f??? (匹配所有 f 开头的文件)进阶做法 如果连 f 都被过滤了可以使用更激进的通配符 ?cuniq${IFS}??? (匹配所有 8 位长度的文件通常能撞到 flag.php)
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2607045.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!