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 2>&1");。

注意:这里有个坑,你的命令执行结果会被重定向到 /dev/null(黑洞),这意味着页面不会直接显示命令回显。

  1. 解题思路与绕过技巧

第一步:绕过重定向(获取回显)

由于后端强制追加了 >/dev/null 2>&1,我们需要在命令末尾加上截断符,让后面的重定向失效。

常用截断符:%0a (换行符)、|| (逻辑或)、&& (逻辑与)。

注意:; 被过滤了,所以通常选择 %0a。

第二步:绕过空格过滤

常用的空格替代符:

{IFS}(但 被过滤,不可用)

IFS9(不可用)

%09 (Tab 键)

< (输入重定向)

第三步:绕过关键字(flag / cat)

绕过 flag:可以使用问号 ? 通配符。例如 fl?g 或 fla?。

绕过 cat:虽然 cat, more, less 等都被过滤了,但 Linux 下读取文件的命令还有很多:

tac(反向列示,未被过滤)

nl(添加行号打印,未被过滤)

od -a

vi / vim(通常环境下不可用,但在某些 CTF 容器中可行)

grep(可以使用 grep 'a' flag.php)

  1. 构建 Payload

结合以上思路,我们需要构造一个既能绕过正则、又能绕过重定向、还能读取文件的 Payload。

先查看当前目录下的文件payload为:

?c=ls%0a

或者?c=ls||

方案 A:使用 tac 和通配符构造payload为:

?c=tac%09fla?.php%0a

方案B使用nl绕过payload为:

?c=nl%09fla?.php%0a

查看源代码即可得到flag

相关推荐
世界哪有真情5 小时前
拿人类意识卡 AI?等于用 bug 验收正式产品
前端·人工智能·后端
Listen·Rain6 小时前
Vue3:setup详解
前端·javascript·vue.js
Patrick_Wilson7 小时前
修好 bug 只是开始:一次由监控需求反向重构日志结构的复盘
前端·监控·数据可视化
kyriewen7 小时前
面试官让我优化一个卡死的表格,我打开 Claude 五秒重写,他放下咖啡问我要不要来当组长
前端·javascript·面试
小粉粉hhh8 小时前
React(二)——dom、组件间通信、useEffect
前端·javascript·react.js
Csvn8 小时前
🤖 AI 生成前端代码的 5 个典型翻车现场及修复指南
前端
IT_陈寒9 小时前
SpringBoot自动装配坑了我一天,原来问题出在这
前端·人工智能·后端
索西引擎10 小时前
【React】key 属性:协调算法中的元素标识机制与最佳实践
前端·javascript·react.js
只会cv的前端攻城狮10 小时前
动态组件架构设计:从配置到事件驱动全链路解析
前端·vue.js
飞天狗10 小时前
Next.js 16 App Router 实战:服务端组件与流式渲染
前端·next.js