ctf show web 入门32

这是一款典型的 PHP 代码审计与命令执行(RCE) 类型的 CTF 题目。代码的核心逻辑是接收一个 GET 参数 c,在经过正则过滤后,将其放入 eval() 函数中执行。

目标:绕过 preg_match 的正则限制,执行命令读取服务器上的 flag 文件。

正则过滤内容:

关键字:flag, system, php, cat, sort, shell, echo

特殊符号:. (点), (空格), ' (单引号), ` (反引号), ; (分号), ( (左括号), / (斜杠)

修饰符:/i 表示不区分大小写。

核心难点与突破口

这个正则表达式非常严格,过滤了括号 (,这意味着你无法直接调用任何 PHP 函数(如 system(), passthru() 等)。同时过滤了分号 ;,这意味着你只能执行一条语句,且不能用常规方式结尾。

突破点 A:PHP 伪协议与通配符

由于过滤了 flag 关键字,我们需要用通配符(如 ? 或 *)来匹配文件名。例如,flag.php 可以表示为 fla?。

突破点 B:绕过分号与括号

既然不能用 system(),我们需要寻找不需要括号也能触发命令执行的方法。

利用 PHP 的 include 包含:include 是一个语句而非函数,可以不加括号使用:include $_GET1

利用标记闭合:PHP 脚本可以用 ?> 来代替最后一个分号。

所以我们尝试使用include配合数据流,可以尝试一个动态参数从而绕过原本对c的限制我们构造的payload如下:?c=includec的限制 我们构造的payload如下:?c=includec的限制我们构造的payload如下:?c=include_GET1?>&1=php://filter/read=convert.base64-encode/resource=flag.php

得到一串base64编码后的内容,打开base64解码的网站

得到flag

本题的核心指令includeGET1?>这部分是填入_GET1?>这部分是填入GET1?>这部分是填入c的内容,目的是为了绕过preg_match的正则限制

1.include(绕过括号限制)

原理:在PHP中,include属于语言结构,而不是普通函数

特性:调用它时不需要加括号正则表达式过滤了(,所以我们不能用system(),passthru()等函数

2.GET1(注入参数)原理:正则过滤了flagphpcat等关键字,如果我们直接在_GET1(注入参数) 原理:正则过滤了flag php cat 等关键字,如果我们直接在GET1(注入参数)原理:正则过滤了flagphpcat等关键字,如果我们直接在c这里写这些词就会被拦截

技巧:我们在这里引入一个新参数1,正则只会检查变量c的内容,,不会检查c的内容,,不会检查c的内容,,不会检查_GET里的内容

3.?>(绕过分号限制)

原理:正则过滤了分号;,在PHP中,分号是语句结束的标志。

特性:PHP的闭合标签?>会隐藏一个分号的效果,通过它我们可以告诉服务器这行代码结束了,从而绕过对;的拦截

相关推荐
一米阳光866110 小时前
软考高级【信息系统项目管理师】高项重要考点(3)高级项目管理-下 助你顺利上岸!
笔记·职场发展·软考·信息系统项目管理师·高级职称
dianziyao_10 小时前
第 4.1 篇:让 Codex 理解你的双链——AI 辅助发现笔记间的关联
人工智能·笔记
xian_wwq13 小时前
【学习笔记】OWASP Agentic 应用安全(二)
笔记·学习·安全·owasp
沪上企服通15 小时前
代账数据的可移植性设计:开放接口、账套导出与 exit strategy 工程笔记(上海 5 家样本对照)
笔记·策略模式
江湖人称菠萝包16 小时前
【Windows】《深入浅出Windows API程序设计:编程基础篇》笔记-Chapter8-子窗口控件
windows·笔记
M78佐菲17 小时前
HTML学习笔记
linux·笔记·学习·tcp/ip·html
我还可以再学点18 小时前
QUIC学习笔记
笔记·学习
点心的游戏开发世界18 小时前
GDScript 入门笔记:目录
开发语言·笔记·游戏引擎·godot
山岚的运维笔记18 小时前
mysql 专业笔记 -- 第 17 章:连接:连接三个具有相同名称 ID 的表
运维·数据库·笔记·后端·学习·mysql·dba
又見山19 小时前
用 Obsidian 写了两年的笔记,怎么备份?怎么同步到其他设备上
笔记·obsidian·obsidian插件·obsidian同步·obsidian教程