ctf show web入门48
这是一道典型的 PHP 代码审计与命令注入Command Injection 绕过题。代码逻辑分析代码的核心逻辑如下输入点通过 GET 方式接收参数 c。过滤机制使用 preg_match 进行正则匹配过滤了大量关键字符和命令符号类; (分号), | (管道符), (后台运行/与), (空格), $ (变量符号), \ (转义), * (通配符), [0-9] (数字), ’ (单引号), (双引号), (反引号)。命令类cat, flag, more, less, head, sort, tail, sed, cut, awk, strings, od, curl。执行点如果输入的 c 不匹配上述正则则执行 system($c. /dev/null 21);。核心难点黑洞重定向/dev/null 21 会将命令的标准输出和错误输出全部丢弃这意味着你无法直接在页面上看到命令执行的结果无回显。空格过滤无法直接使用空格分隔命令和参数。关键字过滤无法直接读取包含 flag 字样的文件也无法使用常用的文件查看命令如 cat。解题思路与绕过技巧A. 解决“无回显”问题既然输出被重定向到了 dev/null我们需要想办法让命令连续执行。通常使用 ;、 或 但 ; 被滤了。利用 URL 编码在 Linux shell 中换行符 %0a 可以起到分隔并执行多条命令的作用。Payload 结构?cls%0a。由于 ls 执行后的输出原本会被截断但换行后的第二部分才是重定向所以 ls 的结果有机会显示出来。B. 绕过空格限制常用的空格替代符${IFS} 但 $ 被滤了不能用$IFS$9 同上不能用%09 (Tab 键的 URL 编码)这是本题最可能的解法。 (重定向符号)例如 catflag.php但 cat 被滤了。C. 绕过关键字过滤 (flag, cat 等)绕过 cat可以使用 tac倒序查看、nl添加行号查看、vi、uniq 等。绕过 flag 字样可以使用通配符。虽然 * 被滤了但 ? 没有被滤可以用 f??? 代表 flag。绕过数字如果需要数字可以使用 shell 里的算术运算但本题重点似乎不在数字。payload为?ctac%09fla?.php%0a或者使用?cnl%09fla?.php%0a 然后查看源代码nl (Number Lines)主要用于给文件内容加上行号后输出。虽然 nl 的初衷是编排行号但为了编排行号它必须读取并显示文件内容。在绕过过滤Filter Bypass的场景下我们并不在乎输出里是否多了行号只要能看到文件里的 flag 即可。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2607044.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!