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解释器会将其替换为变量解释后的结果(允许变量解析)。任何 ${...} 内的表达式会被执行,其返回值作为变量名

具体实现:

  1. phpinfo() 函数会被立即执行,输出PHP配置信息(返回值为 true,即 1)。
  2. PHP尝试解析 ${phpinfo()} 的结果(即 1),等价于变量 $1
  3. 由于变量名 $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>

反向引用还在输出! 

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

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

相关文章

区块链-未来世界的网络形态?

前言 各位读者们&#xff0c;时隔半年作者终于想起了自己的账号密码&#xff0c;今天终于又双叒叕更新啦。今天带给大家的内容仍旧是区块链相关&#xff0c;主要谈谈作者对区块链行业的看法&#xff0c;废话不多说让我们开始发车(扶稳坐好)。 引言 过去的几个月中&#xff0c;比…

Linux总结

1 用户与用户组管理 1.1 用户与用户组 //linux用户和用户组 Linux系统是一个多用户多任务的分时操作系统 使用系统资源的用户需要账号进入系统 账号是用户在系统上的标识&#xff0c;系统根据该标识分配不同的权限和资源 一个账号包含用户和用户组 //用户分类 超级管理员 UID…

掌握 findIndex、push 和 splice:打造微信小程序的灵活图片上传功能✨

文章目录 ✨ 掌握 findIndex、push 和 splice&#xff1a;打造微信小程序的灵活图片上传功能 &#x1f31f;示例场景&#xff1a;小程序图片上传&#x1f33c; 认识 findIndex定义语法在代码中的应用示例当前行为 &#x1f680; 认识 push定义语法在代码中的应用示例特点 ✂️ …

【Java】—— 堆

一、堆的定义 在计算机科学中&#xff0c;堆&#xff08;heap&#xff09;是一种特殊的树状数据结构。用于存储和管理数据。堆通常用于实现优先队列。其中具有最高&#xff08;或最低&#xff09;优先级的元素始终位于堆的根部。 堆分为最小堆和最大堆两种类型&#xff1a; …

Windows 使用 Docker + WSL2 部署 Ollama(AMD 显卡推理)搭建手册‌

Windows 使用 Docker WSL2 部署 Ollama&#xff08;AMD 显卡推理&#xff09;搭建手册‌ ‌手册目标‌ 在 Windows 11 上通过 ‌Docker WSL2‌ 调用 AMD 显卡运行 Ollama 推理服务。 实现 ‌低延迟、高性能的本地模型推理‌&#xff0c;同时不影响 Windows 正常使用。 标记…

【每天认识一个漏洞】shiro反序列化漏洞

&#x1f31d;博客主页&#xff1a;菜鸟小羊 &#x1f496;专栏&#xff1a;Linux探索之旅 | 网络安全的神秘世界 | 专接本 | 每天学会一个渗透测试工具 以下是在实际业务中遇到的一个漏洞&#xff0c;仅用来学习&#xff0c;通过暴露的 /actuator/heapdump 端点获取 Shiro key…

【AI大模型】DeepSeek + Kimi 高效制作PPT实战详解

目录 一、前言 二、传统 PPT 制作问题 2.1 传统方式制作 PPT 2.2 AI 大模型辅助制作 PPT 2.3 适用场景对比分析 2.4 最佳实践与推荐 三、DeepSeek Kimi 高效制作PPT操作实践 3.1 Kimi 简介 3.2 DeepSeek Kimi 制作PPT优势 3.2.1 DeepSeek 优势 3.2.2 Kimi 制作PPT优…

音频3A测试--AGC(自动增益)和NS(降噪)测试

一、测试前期准备 一台电脑&#xff1a;用于作为控制播放和录制数据&#xff1b; 一台音频处理器(调音台)&#xff1a;控制每个通道播放的数据&#xff0c;如噪声、人工头、模拟设备B输入的数据、收集标准麦克风&#xff0c;设备A处理完成的数据&#xff1b; 四个高保真音响&…

zabbix配置邮件告警

目录 实现步骤&#xff1a; 实现目的&#xff1a; 1.在监控端操作&#xff1a; 2.web界面部署 ​​​​​​​实现步骤&#xff1a; 1、在 zabbix服务端配置邮件发送脚本和修改 zabbix服务端配置文件; 2、在 zabbix前端控制台进行相关设置。 实现目的&#xff1a; Zab…

PHP fastadmin 学习

安装php环境安装mysql插件 修改 php.ini下载 phpstudy、fastadmin 错误 安装FastAdmin could not find driver 参考链接 安装插件 创建1.php <? phpinfo(); ?>运行 http://127.0.0.1/1.php 查看 POD 页面访问404 伪静态 Apache <IfModule mod_rewrite.c> O…

PARETO PROMPT OPTIMIZATION

题目 帕累托提示优化 论文地址&#xff1a;https://openreview.net/forum?idHGCk5aaSvE 摘要 自然语言迅速优化或及时工程已成为一种强大的技术&#xff0c;可以解锁大型语言模型&#xff08;LLMS&#xff09;的各种任务的潜力。尽管现有方法主要集中于最大化LLM输出的单一特…

Agent智能体是什么?

文章目录 一、Agent的起源与发展1.1时间线1.2核心驱动力 二、Agent的定义与架构2.1基本定义2.2典型结构&#xff08;以GPTs为例&#xff09; 三、OpenAI的Agent演进路径3.1关键阶段3.2技术支撑3.3 GPTs生态经济模型 四、其他Agent平台对比五、Agent实践案例5.1文本处理自动化5.…

【Linux第三弹】Linux基础指令 (下)

目录 &#x1f31f;1.find指令 1.1find使用实例 ​编辑 &#x1f31f;2.which指令 &#x1f31f;3.grep指令 3.1grep使用实例 &#x1f31f; 4.zip/unzip指令 4.1 zip/unzip使用实例 &#x1f31f;5.tar指令 5.1 tar使用实例 &#x1f31f;6.完结 很庆幸走在自己…

【Laplacian边缘检测详解】

Laplacian边缘检测详解 目录 Laplacian边缘检测详解一. 定义二. 原理三. 特点四. 使用技巧五. MATLAB示例代码示例1&#xff1a;基本Laplacian边缘检测示例2&#xff1a;扩展Laplacian核的使用示例3&#xff1a;与Sobel边缘检测的比较示例4&#xff1a;检测图像中的文字边缘示例…

为什么要学习数据结构与算法

今天&#xff0c;我向大家介绍一门非常重要的课程——《数据结构与算法》。这门课不仅是计算机学科的核心&#xff0c;更是每一位开发者从“小白”迈向“高手”的必经之路。 1、为什么要学习数据结构与算法 总的来说&#xff0c;数据结构与算法是&#xff1a; 求职的“敲门砖”…

【第13节】C++设计模式(行为模式)-Template(模板)模式

一、问题的提出 Template 模式&#xff1a;算法步骤框架与细节实现的分离 假设我们正在开发一个文档处理系统&#xff0c;需要支持多种文档格式的导出&#xff08;如 PDF、Word、HTML 等&#xff09;。每种文档格式的导出过程大致相同&#xff0c;都包含以下步骤&#xff1a; …

安卓binder驱动内核日志调试打印开放及原理(第一节)

背景&#xff1a; 经常有学员朋友在做系统开发时候&#xff0c;有时候遇到binder相关的一些问题&#xff0c;这个时候可能就需要比较多的binder相关日志&#xff0c;但是正常情况下这些binder通讯的的内核日志都是没有的打印的&#xff0c;因为经常binder通讯太过于频繁&#…

uniapp 常用 UI 组件库

1. uView UI 特点&#xff1a; 组件丰富&#xff1a;提供覆盖按钮、表单、图标、表格、导航、图表等场景的内置组件。跨平台支持&#xff1a;兼容 App、H5、小程序等多端。高度可定制&#xff1a;支持主题定制&#xff0c;组件样式灵活。实用工具类&#xff1a;提供时间、数组操…

Gpt翻译完整版

上一篇文章收到了很多小伙伴的反馈&#xff0c;总结了一下主要以下几点&#xff1a; 1. 说不知道怎么调api 2. 目前只是把所有的中文变成了英文&#xff0c;如果想要做多语言还需要把这些关键字提炼出来成放到message_zh.properties和message_en.properties文件中&#xff0c…

【MATLAB例程】三维下的IMM(交互式多模型),模型使用CV(匀速)、CT(匀速转弯)和CA(匀加速),滤波使用EKF。附完整代码

本文介绍一个三维IMM(Interacting Multiple Model)算法,该算法用于目标跟踪,结合了不同运动模型(匀速、匀加速和转弯)。代码使用MATLAB编写,包含仿真、模型预测和结果可视化。订阅专栏后,可直接获得完整代码 文章目录 运行结果完整代码代码解析1. 初始化环境2. 仿真参数…