PHP正则绕过解析

正则绕过

  • 正则表达式
  • PHP正则回溯
  • PHP中的NULL和false
  • 回溯案例
    • 案例1
    • 案例2

正则表达式

在正则中有许多特殊的字符,不能直接使用,需要使用转义符\。如:$,(,),*,+,.,?,[,,^,{。
这里大家会有疑问:为啥小括号(),这个就需要两个来转义,但是中括号[]和大括号{}仅转义左侧。这样的原因是,()存在一个特殊含义:组,而中括号和大括号,没有左侧就无法实现闭合,也就无法编译。
当然里面也存在一个特殊符号“-”,也是不需要转义的,起到连接符的作用,主要使用在[]中,当做普通文本即可。

除了一些特殊字符,还有一些特殊符号的表示,像:\d,\D,\s,\S,\w,\W,\b,\B。

还存在一些机制,像贪婪匹配,惰性匹配,又比如存在断言,像:先行肯定断言、先行否定断言。这里就不多说了。

PHP正则回溯

回溯,可以简单理解为返回,也就是在正则匹配时,依次匹配,如果产生不满足正则表达式的情况,则向前依次返回搜索,知道匹配到为止,否则,正则无法匹配。
举个例子:
匹配正则:/\d.*g.*/gm
正则表达的含义:首先匹配\d,也就是先数字匹配,然后是.*,全部匹配,匹配字母g,再全部匹配。
我们的案例给这个:1234as23gsfggsw,正常理解应该2步差不多了。
我们在regex101.com查看一下具体匹配了几步。
在这里插入图片描述
这里匹配了八步。
看一下第三步:
在这里插入图片描述
和我们想的差不多基本已经匹配完了,但是这个正则没有走完,也就是说它回去匹配字母g,再来看一下后面两步。
在这里插入图片描述
在这里插入图片描述
开始了我们前面提到的回溯,开始从后往前匹配内容,也就是字母g,在匹配到后,就会再向后匹配正则表达式。

在PHP中,回溯不是无限的,也就是说回溯步数是有限制的,根据英文文档显示可以回溯1000000次,这是一个很大的数字。

PHP中的NULL和false

作为弱数据型语言,php的比较还是比较特殊的。
PHP存在严格比较和松散比较。严格比较也就是“===”,松散比较“==”。
松散比较,比较的仅是数据的值。
严格比较,比较的是数据的值和类型。
PHP下,也存在一些隐式转换,将NULL和false进行转换
下面就展示一下NULL和false的比较

0 == false: bool(true)
0 === false: bool(false)0 == null: bool(true)
0 === null: bool(false)false == null: bool(true)
false === null: bool(false)"0" == false: bool(true)
"0" === false: bool(false)"0" == null: bool(false)
"0" === null: bool(false)"" == false: bool(true)
"" === false: bool(false)"" == null: bool(true)
"" === null: bool(false)

很明显,在严格模式下,NULL和false相同。

回溯案例

案例1

<?php
function areyouok($greeting){return preg_match('/Merry.*Christmas/is',$greeting); //正则匹配
}if(!areyouok($greeting)){if(strpos($greeting,'Merry Christmas') !== false){   echo 'welcome to nanhang. '.'flag{i_Lov3_NanHang_everyThing}';}else{echo 'Do you know .swp file?';}
}else{echo 'Do you know PHP?';
}

分析一下内容:首先第一个函数里面是一个正则匹配,正则匹配的内容是:Merry,然后任意字符,然后是Christmas。
来到下面的判断,先判断是否符合上面的正则,不符合,进入下一层,否则返回打印,然后,又判断。
这里有意思的两个点是在判断上,第一个判断是否符合正则,正则则是一个字符串,不符合进入下一个,而下一个则判断字符串包不包含括号里的内容,还要和false进行严格比较。也就是说呢,要不是字符串,还要和false不完全等。
首先大家想到的是,第二个判断为true就好了,但如果满足的话,那就必须是字符串,但第一个判断已经否定了。

理论成立,但仍需要实测,
首先字符串
在这里插入图片描述

所以,这时候我们就要想到我们的NULL和false,它们两个在严格比较下是相等的。
那这样要如何解决,那greeting就不能为字符串,且要为NULL,数字就可以。
所以,greeting[]=123,就解决了。

案例2

<?php
function areyouok($greeting){return preg_match('/Merry.*Christmas/is',$greeting);
}$greeting=@$_POST['greeting'];
if(!is_array($greeting)){if(!areyouok($greeting)){if(strpos($greeting,'Merry Christmas') !== false){echo 'Merry Christmas. '.'flag{i_Lov3_NanHang_everyThing}';}else{echo 'Do you know .swp file?';}}else{echo 'Do you know PHP?';}
} else {echo 'fuck array!!!';
}
?>

这个案例是上面的升级版,在这里就没有办法,使用NULL,来实现绕过了,这里对数组也进行了判断,难度可见一斑。
但是我们要想到一个问题,如果我们无法匹配正则,那就绕过,不就可以了。
上面我们提到了,PHP也就只能回溯1000000次,多了就不行了,如果超了,正则就匹配失败,也是满足我们判断条件的,所以,我们只需要在字符串加一些不相干的内容,一直回溯,超过1000000次就可以了。
所以,此时的greeting=Merry Christmas + ‘a’*1000000。

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

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

相关文章

Linux 下设置开机自启动的方法

文章目录 事先准备对于普通的 Linux对于 RedHat Enterprise Linux 9 笔者的运行环境&#xff1a; 设置成功过的 Linux&#xff1a; RedHat Enterprise Linux 9 x86_64 CentOS 8 x86_64 事先准备 进行这个教程之前&#xff0c;必须要先安装好一个 Linux 操作系统。这个 Linux…

JavaWeb 手写Tomcat底层机制

目录 一、Tomcat底层整体架构 1.简介 : 2.分析图 : 3.基于Socket开发服务端的流程 : 4.打通服务器端和客户端的数据通道 : 二、多线程模型的实现 1.思路分析 : 2.处理HTTP请求 : 3.自定义Tomcat : 三、自定义Servlet规范 1. HTTP请求和响应 : 1 CyanServletRequest …

《面试1v1》ElasticSearch基础

&#x1f345; 作者简介&#xff1a;王哥&#xff0c;CSDN2022博客总榜Top100&#x1f3c6;、博客专家&#x1f4aa; &#x1f345; 技术交流&#xff1a;定期更新Java硬核干货&#xff0c;不定期送书活动 &#x1f345; 王哥多年工作总结&#xff1a;Java学习路线总结&#xf…

工厂方法模式

工厂模式&#xff08;Factory Pattern&#xff09;是一种创建型设计模式&#xff0c;它提供了一种统一的接口来创建对象&#xff0c;但将对象的实例化延迟到子类中。工厂模式主要解决了对象的创建过程与使用客户端代码的解耦&#xff0c;使得客户端代码不需要知道具体的对象创建…

Kafka的配置和使用

目录 1.服务器用docker安装kafka 2.springboot集成kafka实现生产者和消费者 1.服务器用docker安装kafka ①、安装docker&#xff08;docker类似于linux的软件商店&#xff0c;下载所有应用都能从docker去下载&#xff09; a、自动安装 curl -fsSL https://get.docker.com | b…

Visual Studio配置PCL库

Visual Studio配置PCL库 Debug和Release配置新建项目配置属性表测试参考 Debug和Release Debug和Release的配置过程一模一样&#xff0c;唯一区别就在于最后一步插入的附加依赖项不同&#xff0c;因此下面以debug为例。 配置新建项目 1、新建一个C空项目&#xff0c;模式设置…

Linux文本三剑客之awk

目录 前言 awk 1.认识awk 2.使用awk 2.1语法 2.2常用命令选项 2.3awk变量 2.3.1内置变量 2.3.2自定义变量 2.4printf命令 awk例题 前言 awk、grep、sed是linux操作文本的三大利器&#xff0c;合称文本三剑客&#xff0c;也是必须掌握的linux命令之一。三者的功能都是…

3维空间下按平面和圆柱面上排版设计

AR空间中将若干平面窗口排列在指定平面或圆柱体面上 平面排版思路 指定平面方向向量layout_centre ,平面上的一点作为排版版面的中心layout_position float3 layout_position = float3(0,0,-10); float3 layout_centre = float3(0,0,1

FreeRTOS源码分析-9 互斥信号量

目录 1 优先级翻转问题 2 互斥信号量概念及其应用 2.2FreeRTOS互斥信号量介绍 2.3FreeRTOS互斥信号量工作原理 3 互斥信号量函数应用 3.1功能分析 3.2API详解 3.3功能实现 4 递归互斥信号量函数应用 4.1死锁现象 ​编辑 4.2API详解 4.3解决死锁 5 互斥信号量实现原…

C++数据结构之平衡二叉搜索树(一)——AVL的实现(zig与zag/左右双旋/3+4重构)

本文目录 00.BBST——平衡二叉搜索树01.AVL树02.AVL的插入2.1单旋——zig 与 zag2.2插入节点后的单旋实例2.3手玩小样例2.4双旋实例2.5小结 03.AVL的删除3.1单旋删除3.2双旋删除3.3小结 04.34重构05.综合评价AVL5.1优点5.2缺点 06.代码注意插入算法删除算法完整代码&#xff1a…

通过有名管道实现AB进程对话

一、要求实现AB进程对话 A进程先发送一句话给B进程&#xff0c;B进程接收后打印B进程再回复一句话给A进程&#xff0c;A进程接收后打印重复1.2步骤&#xff0c;当收到quit后&#xff0c;要结束AB进程 A进程 #include <stdio.h> #include <sys/types.h> #include…

Oracle EBS OM客制化调用API创建销售订单非常慢(FND_FLEX_HASH死锁)

业务场景 由于Oracle EBS标准功的公司间关联交易操作涉及业务节点环节多,需要多个业务部门参考操作完成,浪费人力和花费时间。随着国内集团公司通过业务整合优化,大幅度减少间中很多环节的人为操作,如国内公司间贸易通过类似于客制化出货单申请方式,跨国公司间贸易通过类似…

关于接口测试用例设计的一些思考

接口测试发现的典型问题 传入参数处理不当&#xff0c;引起程序错误类型溢出&#xff0c;导致数据读取和写入不一致对象权限校验出错&#xff0c;可获取其他角色信息状态出错&#xff0c;导致逻辑处理出现问题逻辑校验不完善定时任务执行出错 接口测试用例设计 接口测试用例…

redis入门3-在java中操作redis

Redis的java客户端 Jedis、Lettuce、Redisson、以及spring提供的spring data redis Jedis操作redis //添加依赖 <dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId><version>2.8.0</version> </dep…

JJWT快速入门

本篇介绍使用 JJWT&#xff08;Java JWT&#xff09;库来生成 JWT Token&#xff0c;步骤如下&#xff1a; 添加依赖&#xff1a; 在项目中添加 JJWT 依赖项。对于 Maven 项目&#xff0c;可以在 pom.xml 文件中添加以下依赖项&#xff1a; <dependency><groupId>…

python解析帆软cpt及frm文件(xml)获取源数据表及下游依赖表

#!/user/bin/evn python import os,re,openpyxl 输入&#xff1a;帆软脚本文件路径输出&#xff1a;帆软文件检查结果Excel#获取来源表 def table_scan(sql_str):# remove the /* */ commentsq re.sub(r"/\*[^*]*\*(?:[^*/][^*]*\*)*/", "", sql_str)# r…

ssh免密rsa登录

1. 本地要执行ssh的机器 ssh-keygen -t rsa # 下面为对应密钥生成地址 公钥&#xff08;id_rsa.pub&#xff09;和私钥&#xff08;id_rsa&#xff09;。 # windows: C:\Users\<your_username>\.ssh # linux: /home/service/.ssh 2. 讲密钥写入到对应文…

基于Hyperledger Fabric+CP-ABE加密的溯源类应用系统

加密机制中有ABE属性加密&#xff0c;属性基加密一般又分为两类&#xff0c;即密钥策略属性基加密&#xff08;KP-ABE&#xff09;和密文策略属性基加密&#xff08;CP-ABE&#xff09;。 今天我们重点说一下cp-abe及如何与fabric区块链技术相结合来建设相关溯源、确权、认证等…

秋招算法备战第39天 | 62.不同路径、63. 不同路径 II

62. 不同路径 - 力扣&#xff08;LeetCode&#xff09; 按照动态规划五部曲走&#xff0c;非常清晰 class Solution:def uniquePaths(self, m: int, n: int) -> int:dp [[0 for _ in range(n)] for _ in range(m)]for i in range(m):dp[i][0] 1for j in range(n):dp[0][…

c++学习(特殊类设计)[30]

只能在堆上创建对象的类 如果你想要确保对象只能在堆上创建&#xff0c;可以通过将析构函数声明为私有&#xff0c;并提供一个静态成员函数来创建对象。这样&#xff0c;类的实例化只能通过调用静态成员函数来完成&#xff0c;而无法直接在栈上创建对象。 以下是一个示例&…