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 小时前
浏览器端 Agent 的文件版本管理:不用 Git,基于 OPFS + SQLite 自己造了一个
前端·人工智能
梦想的颜色5 小时前
TypeScript 完全指南(下):从类型体操到生产级配置
前端·javascript·typescript
民乐团扒谱机6 小时前
【AI笔记】短时纯音时长对音高感知偏移效应研究综述
人工智能·笔记
暴躁小师兄数据学院6 小时前
【AI大数据工程师特训笔记】第12讲:表分区与索引
大数据·笔记·sql·postgresql
Hi~晴天大圣7 小时前
npm使用介绍
前端·npm·node.js
888CC++8 小时前
如何在 C 语言中进行程序调试?
前端·javascript·算法
暴躁小师兄数据学院8 小时前
【AI大数据工程师特训笔记】第16讲:大数据环境安装
大数据·hadoop·笔记·flink·spark·database
喵个咪8 小时前
基于 Taro 的 Headless CMS 多端前端架构:技术解析与二次开发导引
前端·react.js·taro
狂炫冰美式8 小时前
你还在古法PPT吗,试试HTML呢?免费编辑导出工具给 xdm 放这了
前端·后端·github
Lin_Aries_04219 小时前
最终成果报告:导航模型与无人机导航方向
笔记·具身智能·datawhale