BUU44 [BJDCTF2020]ZJCTF,不过如此1 [php://filter][正则表达式get输入数据][捕获组反向引用][php中单双引号]
题目:
我仿佛见到了一位故人。。。也难怪,题目就是ZJCTF

按要求提交/?text=data://,I have a dream&file=next.php后:

......不太行,好像得用file=php://filter/convert.base64-encode/resource=next.php
耶?那 file=php://filter/convert.base64-encode/resource=next.php 和 file=next.php在这里有啥区别啊
file=php://filter/convert.base64-encode/resource=next.php 和 file=next.php
示例:如果next.php为 <?php echo "hello"; ?>
1.file=next.php: 直接输出hello(include函数会将括号内的文件内容当作php来解析)
2.file=php://filter/convert.base64-encode/resource=next.php:
php://filter是PHP的流包装器,允许在读取文件时对内容进行过滤处理。convert.base64-encode过滤器会将文件内容转换为Base64编码格式。- 当使用
include包含此路径时,PHP会先读取next.php的内容,经过Base64编码后,再尝试将编码后的内容作为PHP代码执行。
关键点在于base64编码后的东西不再是有效代码,php无法解析,在面对无效代码这种情况下php可能会将编码后的内容作为“原始输出”返回
这样就能直接返回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('/(' . $re . ')/ei','strtolower("\\1")',$str);
preg_replace($要搜索的正则表达式的模式, $用于替换匹配项的字符串, $被进行搜索和替换的字符串); 所以关于这里的正则表达式模块:'/('.$re.')/ei',
注意preg_replace在调用的时候需要将参数用 ' ' 括起来
其中$re代表用户传入的正则表达式模式,通过字符串拼接的方式,将$re嵌入到整体正则表达式中 / 用于表示正则表达式的开始和结束,( 和 ):是捕获组的符号,用于将匹配到的内容捕获起来,以便后续引用,e 修饰符会使 preg_replace 在替换字符串时执行其中的 PHP 代码,i 修饰符表示不区分大小写进行匹配。
strtolower("\\1")
\\1:这是对捕获组的引用,代表第一个捕获组匹配到的内容。strtolower用于将字符串转换为小写。所以这句话意思是将捕获到的内容转换成小写
捕获组和反向引用
主要用于引用之前匹配的捕获组的内容。它允许在同一个正则表达式中复用已匹配的文本,常用于模式重复匹配或替换操作。
捕获组:()括起来的内容就是捕获组,比如说(\d+)匹配一个或者多个内容,并记录匹配的内容
反向引用:\n 表示引用第n个捕获组的内容
foreach函数触发漏洞
遍历$_GET数组,键名作为$re,键值作为$str,并将这两个值传入complex函数中
foreach($_GET as $re => $str) {echo complex($re, $str). "\n";
}
对于php中双引号和单引号的区别
双引号:
<?php echo "{${phpinfo()}}"; ?>
会返回phpinfo的界面
因为双引号里面如果包含有变量,php解释器会将其替换为变量解释后的结果(允许变量解析)。任何 ${...} 内的表达式会被执行,其返回值作为变量名
具体实现:
phpinfo()函数会被立即执行,输出PHP配置信息(返回值为true,即1)。- PHP尝试解析
${phpinfo()}的结果(即1),等价于变量$1。 - 由于变量名
$1非法(不能以数字开头),会触发一个 Notice级错误(若未关闭错误提示),最终输出空字符串。
实际效果:
输出 phpinfo() 的完整信息。输出空字符串(因 $1 未定义),并可能伴随错误提示。
单引号:
<?php echo '{${phpinfo()}}'; ?>
单引号内不解析变量,所以内容按字面量输出 {${phpinfo()}}
再返回到next.php中,其基本思路就是get个键名键值都是自己输入的东西&cmd命令,其中get内容要触发getflag()函数进而触发eval()函数,cmd才有用武之地
php会将传入的非法的参数名转成下滑线
当非法字符为首字母时,只有点号会被替换成下划线
上传的$re=$str,传入 .*=${getflag()} 代入代码中就是:
preg_replace('/(.*)/ei','strtolower("\\1")',${getflag()});
getflag() 是一个函数调用,意味着会先执行 getflag 函数,然后将该函数的返回值作为目标字符串传递给 preg_replace 进行处理。
也就是说会这样

好傻啊这个函数,还会先跑去执行一下代码然后再匹配,怪不得e被弃用了
残留几个问题:
1.为什么要加上${ }? ,这个东西有什么用?
${ }用于变量替换、字符串模板、表达式嵌入
这里${getflag()}外面套上一个${ }就表示执行函数,如果不套这个${ }那么就变成
strtolower("getflag()")
此时单纯把这个当成字符串,而不能把他当成函数去解析
2.为什么 \S* 能表示 .? ?
因为大写表示取反操作
这里\s 表示匹配任意空白字符,而\S表示匹配任意非空白字符(等价于 [^\s])
3.捕获组和反向引用干什么用的?
主要是为了匹配重复的字符,比如说
\b(\w+)\b\s+\1\b
\b表示单词边界,\w表示任意一个单词字符,+是个量词,表示前面的 \w 可以出现很多次,\s+表示任意一个或多个空白符号
这里就能匹配到诸如"pig pig"这样的字符串
也可以匹配标签,这里的 < 和 > 都代表真实的<>
<([a-z]+)>(.*?)</\1>
反向引用还在输出!

相关文章:
BUU44 [BJDCTF2020]ZJCTF,不过如此1 [php://filter][正则表达式get输入数据][捕获组反向引用][php中单双引号]
题目: 我仿佛见到了一位故人。。。也难怪,题目就是ZJCTF 按要求提交/?textdata://,I have a dream&filenext.php后: ......不太行,好像得用filephp://filter/convert.base64-encode/resourcenext.php 耶?那 f…...
软考中级-数据库-3.3 数据结构-树
定义:树是n(n>=0)个结点的有限集合。当n=0时称为空树。在任一非空树中,有且仅有一个称为根的结点:其余结点可分为m(m>=0)个互不相交的有限集T1,T2,T3...,Tm…,其中每个集合又都是一棵树,并且称为根结点的子树。 树的相关概念 1、双亲、孩子和兄弟: 2、结点的度:一个结…...
磁盘空间不足|如何安全清理以释放磁盘空间(开源+节流)
背景: 最近往数据库里存的东西有点多,磁盘不够用 查看磁盘使用情况 df -h /dev/sda5(根目录 /) 已使用 92% 咱们来开源节流 目录 背景: 一、开源 二、节流 1.查找 大于 500MB 的文件: 1. Snap 缓存…...
SpringCloud系列教程(十二):网关配置动态路由
除了token以外,还有一个很实用的功能就是把网关的路由配置放到nacos上,并且修改路由配置的时候,网关服务可以动态的更新,这样我们在调整网络配置的时候,就不用重启服务了。所以我们需要用到两个重要的类:Na…...
Java-实现PDF合同模板填写内容并导出PDF文件
可用于公司用户合同导出pdf文件 效果图 一、导入所需要jar包 <!--生成PDF--><dependency><groupId>com.itextpdf</groupId><artifactId>itextpdf</artifactId><version>5.5.11</version></dependency><dependency&…...
基于STM32的环境监测系统(自制蓝牙APP)
目录 项目概述 实物图 演示视频 概述 硬件模块 原理图以及PCB 0.96寸OLED屏幕(SSD1306) CubeMX配置 初始化代码 MQ-2烟雾传感器 CubeMX配置 初始化代码 DHT11温湿度模块 驱动代码 HC-05蓝牙模块 CubeMX配置 编辑 空闲中断回调函数 有…...
C++ Windows下屏幕截图
屏幕截图核心代码(如果要求高帧率,请使用DxGI): // RGB到YUV的转换公式 #define RGB_TO_Y(r, g, b) ((int)((0.299 * (r)) (0.587 * (g)) (0.114 * (b)))) #define RGB_TO_U(r, g, b) ((int)((-0.169 * (r)) - (0.331 * (g)) …...
月结保障:回滚慢、行锁频发
问题背景 3.1号月结现场保障,到场了先让kill了一个账务的会话,回滚了20min,巡检的时候发现报表库有几条行锁:enq: TX - row lock contention,sql:delete from table_name 语句已经失败,正在回滚…...
Golang的微服务服务发现机制
## 1. Golang微服务服务发现机制 微服务架构已经成为当今软件开发的主流趋势,它能将复杂的单体应用拆分成小而独立的服务单元,实现更快的开发、部署和扩展。在微服务架构中,服务发现是非常重要的一环,它能够实现服务之间的自动发现…...
Keepalived 入门详解:高可用集群部署最佳实践!
1. 什么是 Keepalived? 在分布式集群中,单点故障(SPOF) 是影响系统稳定性的重要问题。Keepalived 作为一款高可用服务软件,可以有效防止集群单点故障,保障系统的高可用性。 Keepalived 最初是为 LVS&#…...
SparkStreaming之04:调优
SparkStreaming调优 一 、要点 4.1 SparkStreaming运行原理 深入理解 4.2 调优策略 4.2.1 调整BlockReceiver的数量 案例演示: object MultiReceiverNetworkWordCount {def main(args: Array[String]) {val sparkConf new SparkConf().setAppName("Networ…...
开发博客系统
前言 准备工作 数据库表分为实体表和关系表 第一,建数据库表 然后导入前端页面 创建公共模块 就是统一返回值,异常那些东西 自己造一个自定义异常 普通类 mapper 获取全部博客 我们只需要返回id,title,content,us…...
微信小程序上如何使用图形验证码
1、php服务器生成图片验证码的代码片段如下: 注意红框部分的代码,生成的是ArrayBuffer类型的二进制图片 2、显示验证码 显示验证码,不要直接image组件加上src显示,那样拿不到cookie,没有办法做图形验证码的验证&…...
IntelliJ IDEA 构建项目时内存溢出问题
问题现象 在使用 IntelliJ IDEA 构建 Java 项目时,遇到了以下错误: java: java.lang.OutOfMemoryError: Java heap space java.lang.RuntimeException: java.lang.OutOfMemoryError: Java heap space这是一个典型的 Java 堆内存不足错误,表…...
大模型微调与RAG检索增强技术深度解析
一、引言 随着人工智能技术的飞速发展,大模型(如BERT、GPT等)在自然语言处理、计算机视觉等领域取得了显著成效。然而,这些预训练好的大模型往往难以直接应用于特定业务场景,因此,大模型微调(F…...
[liorf_localization_imuPreintegration-2] process has died
使用liorf,编译没报错,但是roslaunch报错如下: 解决方法: step1: 如果你之前没有安装 GTSAM,可以尝试安装它 step2: 检查是否缺少依赖库 ldd /home/zz/1210/devel/lib/liorf_localization/liorf_localization_imuPr…...
2024 年 MySQL 8.0.40 安装配置、Workbench汉化教程最简易(保姆级)
首先到官网上下载安装包:http://www.mysql.com 点击下载,拉到最下面,点击社区版下载 windows用户点击下面适用于windows的安装程序 点击下载,网络条件好可以点第一个,怕下着下着断了点第二个离线下载 双击下载好的安装…...
数列极限入门习题
数列极限入门习题 lim n → ∞ ( 1 1 2 1 3 ⋯ 1 n ) 1 n \lim\limits_{n\rightarrow\infty}(1 \frac{1}{2}\frac{1}{3}\cdots\frac{1}{n})^{\frac{1}{n}} n→∞lim(12131⋯n1)n1 lim n → ∞ ( 1 n 1 1 n 2 ⋯ 1 n n ) \lim\limits_{n\rightarrow\…...
【Python/Pytorch】-- 创建3090Ti显卡所需环境
文章目录 文章目录 01 服务器上,存在三个anaconda,如何选择合适的,创建python环境?02 conda、anaconda、cuda、cudnn区别03 用到一些指令04 如何指定cuda的版本?05 conda跟pip的区别?06 pycharm控制台07 服…...
如何在无图形化界面的服务器上下载百度网盘的超大文件(10GB以上)?
目录 登录百度网盘账号 进入特定的文件夹 下载 完整教程 登录百度网盘账号 第一次登录的时候会展示: Please visit: https://openapi.baidu.com/oauth/2.0/authorize?client_idxxx And authorize this app Paste the Authorization Code here within 10 minut…...
AI应用测试:遇到类ChatGPT的流式接口要如何压测?
先说结论: 使用最普遍的JMeter 就能支持类 OpenAI 的流式接口(如 ChatGPT 的流式聊天接口)的测试 总体设置 JMeter 支持测试 OpenAI 的流式接口,但需要额外配置(如启用 KeepAlive 和调整超时)。如果需要实时处理流式响应,使用 Regular Expression Extractor 或自定义脚…...
Linux磁盘情况查询
一、查询系统整体磁盘使用情况 1、基本语法 df -h 2、示例 二、查询指定目录的磁盘占用情况 1、基本语法 du -h 查询指定目录的磁盘占用情况,默认为当前目录 2、常用选项 选项 说明 -h 以人类可读的格式显示磁盘使用情况(例如,KB、…...
数据库原理3
1.在SQL中,外模式对应于试图(VIEW)和部分基本表;模式对应于基本表;内模式对应于存储文件。 2.FETCH:实施游标推进 3.数据操纵:insert,update,delete 数据控制:grant,revoke 数据定义:create,drop,alter 4.物理结构…...
【3D格式转换SDK】HOOPS Exchange技术概览(二):3D数据处理高级功能
在当今数字化工程领域,HOOPS Exchange作为一款强大的SDK,为3D工程应用程序的开发提供了关键支持。本文将深入剖析其基本组件、特定功能以及数据结构,带您全面了解这一驱动3D数据处理的核心工具。 一、概述 HOOPS Exchange专注于访问和重…...
利用Adobe Acrobat 实现PPT中图片分辨率的提升
1. 下载适用于 Windows 的 64 位 Acrobat 注册方式参考:https://ca.whu.edu.cn/knowledge.html?type1 2. 将ppt中需要提高分辨率的图片复制粘贴到新建的pptx问价中,然后执行“文件—>导出---->创建PDF、XPS文档” 3. 我们会发现保存下来的distrib…...
Python frozenset介绍
在 Python 中,frozenset 是一种不可变(immutable)的集合类型,它是 set 的不可变版本。与普通的 set 类型不同,frozenset 的内容一旦创建就不能被修改,这使得它在某些场景下非常有用。 1. 特点 不可变性&am…...
docer swarm集群部署springboot项目
1.准备两台服务器,安装好docker、docker-compose 因为用到了docker仓库,安装harbor,可以从github下载离线安装包 2. 我这边用到了gitlab-ci,整体流程也都差不多 1)打包mvn clean install 2)打镜像 docker-compose -f docker-compo…...
Elasticsearch:解锁深度匹配,运用Elasticsearch DSL构建闪电般的高效模糊搜索体验
目录 Elasticsearch查询分类 叶子查询 全文检索查询 match查询 multi_match查询 精确查询 term查询 range查询 复杂查询 bool查询简单应用 bool查询实现排序和分页 bool查询实现高亮 场景分析 问题思考 解决方案 search_after方案(推荐) point in time方案 方案…...
解决局域网访问Dify却仅显示nginx页面的问题
为什么dify在本机可以正常访问,局域网通过ip访问却只看到欢迎使用nginx的提示,如果访问服务器ip/apps则直接提示404 Not Found。这是怎么回事该如何解决呢?文章中将一步步解决这些问题。 前言 之前在服务器部署了dify,也在服务器…...
deepseek思考,谁是下一个deepseek?
这两天连续看了两篇某B站up关于AI的分析,也是感触很多 讲得内容咱先不说,讲得是真好。怎么说呢,就“活该人家能赚到钱”就对了。 第一篇,他说了一个事儿,就是AI未来的趋势,1000天内,代替世界上…...
