关于转义符 \ 在php正则中的匹配问题

今天做题遇到一个很经典的问题,记录一下,先看一段代码

<?php
$str="\\";
$pattern="/\\/";
if(preg_match($partern,$str,$arr))
{
,,,,echo"success";
,,,,print_r($arr);
}else{
,,,,echo"false";
}

看到这段代码的师傅们,思考一下,会输出success还是false

输出false,正则没有被匹配到,为什么呢?

image-20220820220805568

php对转义符的解析

php解析正则时分为了两个步骤,一个是php对字符串的解析,之后才是对正则的解析,那么php在解析字符串时什么时候才会将\解析为转义呢?只有在某一字符会对这一语句产生混淆时,php才会将\解析为转义。

分析一个正则匹配

image-20220820233147371

首先php对字符串进行解析:

在这种情况下可以看到str中\并没有被当成转义符

而在pattern中,由于有多个\并且在正则表达式中存在/,会混淆正则表达式的边界,因此这四个转义符的作用分别是:

  • 第一个转义符转义第二个转义符
  • 第三个转义符转义第四个转义符,第五个转义符转义/

因此php最终解析出的str为,\/,pattern为,\\/

到preg_match时,进行正则解析(正则解析只解析正则表达式):

  • 将pattern中的,\\/,解析为\/,(第一个转义符转义了第二个转义符)

经过php和正则的解析后,我们可以发现str与pattern是一样的字符串了,所以应该会输出success,并且匹配到的部分为\/

验证成功

image-20220820233913117

这里提出一个问题,如果在pattern中,我的正则内容中不想使用\来转义/,并且还想输出success,那应该怎么修改正则内容呢?

我们刚才提到,转义是为了防止语句中的字符产生混淆,/与正则边界产生了混淆,所以我们用其他的字符作为边界就好了,比如#

image-20220820234345677

总结:在一般情况下,只有字符串中的某一字符会对该语句产生混淆,这时该符号前的\才具有转义作用。

帮助网安学习,全套资料S信免费领取:
① 网安学习成长路径思维导图
② 60+网安经典常用工具包
③ 100+SRC分析报告
④ 150+网安攻防实战技术电子书
⑤ 最权威CISSP 认证考试指南+题库
⑥ 超1800页CTF实战技巧手册
⑦ 最新网安大厂面试题合集(含答案)
⑧ APP客户端安全检测指南(安卓+IOS)

这里我在做测试有一个小坑

image-20220820234819307

首先php的字符串解析:可以看到由于字符串中并没有可能会产生混淆语句的字符,因此\都没有转义作用。

正则进行解析(只解析正则表达式,不解析其他字符串):pattern中的\/被解析成了/

因此最终的正则匹配是在字符串\/中匹配/,因此输出了/

这里我一开始以为str中的\也发挥了转义作用,其实并不是。

回到最初的问题,为什么输出了false

<?php
$str="\\";$pattern="/\\/";,,
if(preg_match($partern,$str,$arr))
{
,,,,echo"success";
,,,,print_r($arr);
}else{
,,,,echo"false";
}

按照上面的流程分析,

首先php进行字符串解析:

  • str被解析为\,pattern被解析为\

进行正则表达式解析:

  • pattern中含有转义符\,现在正则需要这个转义符去发挥转义作用,但在正则表达式中已经没有其他字符去转义了,导致了正则表达式的解析错误,pattern最终被解析成了什么我们也不知道

所以最终在进行正则匹配时会输出false

那么我们应该怎么让它输出success呢?

php正则如何正确匹配\

刚才我们提到在正则解析时只剩下了一个\,导致了解析的错误,那么如果我们在正则解析这步剩下两个\是不是就可以在正则解析中保留下一个\呢?再往前推,如果想要正则解析这步里保留两个\,那么在定义partern字符串的时候我们是不是要写四个\才可以?

image-20220821001642109

具体的解析过程我就不讲了,跟上面是完全一样的。

总结:php在正则中匹配\时需要在正则表达式中写入四个\

一道ctf题的分析

题目来源:[安洵杯,2019]easy_web,wp移步主页查找,如果没有就是还没写完。

if(preg_match("/ls|bash|tac|nl|more|less|head|wget|tail|vi|cat|od|grep|sed|bzmore|bzless|pcre|paste|diff|file|echo|sh|\'|\"|\`|;|,|\*|\?|\\|\\\\|\n|\t|\r|\xA0|\{|\}|\(|\)|\&[^\d]|@|\||\\$|\[|\]|{|}|\(|\)|-|<|>/i",$cmd)){
,,,,echo("forbid,~");

在这一段代码中对传入的cmd命令进行了过滤,并且可以看到其中有四个反斜杠,对\做出了过滤,但最后仍然可以用反斜线逃逸,ca\t,l\s执行命令,这是为什么呢?

按照我们上面所说的进行分析,首先php对字符串进行解析:

  • \\被解析为\
  • \\\\,被解析为\\

经过字符串解析,原本的|\\|\\\\|,变成了|\|\\|

正则表达式解析:

  • 第一个\|被解析为|
  • \\被解析为\

经过两次解析后,最终的正则表达式变成了||\|,所以实际上是对|\进行了过滤,所以就可以使用\进行绕过了。

image-20220821004532200

因此解决的办法是在正则过滤中不要添加\\这一项,会导致整个正则表达式直接变味。

这里跟着原帖看发现原帖说的有点问题,自己思考了一下做出了一些猜想,发现是正确的。

image-20220821004815392

还有原帖中提到的一个问题,这里为什么随便一个字符串甚至是空都可以匹配成功,因为在|\\\\|的左右两边没有东西,为空,所以随便匹配都可以匹配到。

image-20220821004919804

解决方法就是两边加上东西就可以了。

image-20220821005133509

自己的小感想

这道题在网上的wp基本都是直接用\去执行命令,但很少有人能去讨论为什么可以这么绕过,后端代码已经做出了过滤,为什么还是会被绕过,我很幸运能够看到更深的分析,这也是我第一次自己有独立的想法去不断的调试代码,虽然每一次看到其他大佬wp里不合理的地方感觉很迷茫,但是还找不到理由,但是经过不断的调试发现有些其他大佬的东西也不一定就都是对的,而且自己不断调试后找到问题有一种说不出来的成就感,总结起来就是看问题要深入,有耐心。引用原帖的一句话就是

image-20220821005705584

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

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

相关文章

Qt QString类

数值输入 C 提供了两种字符串的实现方式&#xff1a;一种是C风格的字符串&#xff0c;以“0”结尾&#xff1b;另一种是 C引入的 String 类型&#xff0c;即标准模板库中的类。Qt则提供了自己的字符串实现方式——QString。 Qt中的QString字符串类&#xff1a; 无须担心…

如何使用設置Python代理IP?

本文旨在探討Python代理IP、使用Python代理伺服器的好處、如何安裝 Python代理以及如何用Python設置代理IP伺服器。 什麼是Python代理伺服器&#xff1f; 用Python實現的代理IP模式&#xff0c;可用於延遲加載、日誌記錄、訪問控制或其他目的。 Python的動態類型和豐富的類支持…

SpringBoot编写一个SpringTask定时任务的方法

1&#xff0c;在启动类上添加注解 EnableScheduling//开启定时任务调度 2&#xff0c; 任务&#xff08;方法&#xff09;上也要添加注解&#xff1a; Scheduled(cron " 0 * * * * ? ") //每分钟执行一次 域&#xff1a; 秒 分 时 日 月 周 &#xff08;年&#…

如何修复在Deepin系统中因`apt-get autoremove systemd`导致的启动问题

博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — 面试准备的宝典&#xff01;《IDEA开发秘籍》 — 提升你的IDEA技能&#xff01;《100天精通鸿蒙》 …

选择正确的Go Module Path

最近我在查看项目代码时&#xff0c;注意到有人在go.mod文件中将module path写为com.example.foo了。根据这个写法&#xff0c;相信屏幕前的读者也可以推断出这位开发人员可能是从Java阵营转到Go的。实际开发中可能有很多开发者会使用类似的内容作为module path&#xff0c;但这…

Redis和Mysql如何保证数据一致性?

一份数据同时保存在数据库和Redis中&#xff0c;当数据发生变化时需要同时去更新Mysql和Redis&#xff0c;由于这个更新有先后顺序并且它不像Mysql里面的多表事物一样可以满足ACID的事物特性&#xff0c;所以就会出现数据一致性的问题。 对于这种情况解决方案主要有以下几种&a…

Jmeter针对多种响应断言的判断

有时候response返回的结果并非一种&#xff0c;有多种&#xff0c;需要对这几种进行判断的时候需要使用Bean Shell。 &#xff08;1&#xff09;首先获取响应数据 String response prev.getResponseDataAsString(); ResponseCode 响应状态码 responseHeaders 响应头信息 res…

Peter算法小课堂—动态规划斜率优化

大家来到这一堂课&#xff0c;就说明大家已经学过函数了 直线方程&#xff1a;ykxb 大家可以算一算。 其实&#xff0c;在数学上&#xff0c;这玩意要分类讨论 那么&#xff0c;这唯一的交点就是我们要背出来的 直线最值 这像一个分段函数 其实&#xff0c;只有部分直线能提供…

支付牌照7000万出让:成都摩宝以1.29亿挂牌价出让60.33% 股份

重庆中渝兴拍科技有限公司受重庆力帆控股有限公司委托于2024年04月26日10时至2024年04月27日10时止在淘宝网阿里资产交易平台对力帆持有成都摩宝网络科技有限公司60.332806%股权转让进行公开拍卖活动&#xff0c;起始价为129,000,000元。 相关情况如下&#xff1a; 成都摩宝网…

docker-compose yaml指定具体容器网桥ip网段subnet

docker-compose 启动yaml有时可能的容器网段与宿主机的ip冲突导致宿主机上不了网&#xff0c;这时候可以更改yaml指定subnet 宿主机内网一般是192**&#xff0c;这时候容器可以指定172* version: 3.9 services:coredns:image: coredns/coredns:1.10.0container_name: coredns…

详解Qt添加外部库

在Qt项目中添加外部库是一项常见任务&#xff0c;无论是静态库还是动态库都需要正确的配置才能让项目顺利编译链接。以下是详细步骤和不同场景下的配置方法&#xff1a; 方法一&#xff1a;手动编辑.pro文件 添加头文件路径&#xff1a; 在Qt项目中的.pro文件中使用INCLUDEPAT…

IO_DAY7

1:实现2个终端之间的互相聊天 要求:千万不要做出来2个终端之间的消息发送是读一写的&#xff0c;一定要能够做到&#xff0c;一个终端发送n条消息&#xff0c;另一个终端一条消息都不回复都是没有问题的 终端A&#xff1a; #include<myhead.h> int main(int argc, char…

【YOLOv9改进[损失函数]】使用结合InnerIoU和Focaler的各种损失函数助力YOLOv9更优秀

目录 一 回归损失函数&#xff08;Bounding Box Regression Loss&#xff09; 1 Inner-IoU 2 Focaler-IoU&#xff1a;更聚焦的IoU损失 二 改进YOLOv9的损失函数 1 总体修改 ① utils/metrics.py文件 ② utils/loss_tal_dual.py文件 2 各种机制的使用 ① 使用结合Inn…

ActiveMQ 02 常用API

Active MQ 02 常用API 事务 session.commit(); session.rollback();用来提交/回滚事务 Purge 清理消息 签收模式 签收代表接收端的session已收到消息的一次确认&#xff0c;反馈给broker ActiveMQ支持自动签收与手动签收 Session.AUTO_ACKNOWLEDGE 当客户端从receive…

【01背包】滚动数组优化实现一维01背包DP(对比朴素写法)

01背包 代码 背包问题的滚动数组优化版本建议在完全弄懂了普通的二维01背包问题后再进行食用&#xff0c;不然会出现消化不良的症状… 我们可以将背包问题中DP数组的下标看作成两个集合 下面对比两种不同实现方法的区别&#xff1a; 朴素二维DP版本 使用dp[不超过i的物品集合]…

全量知识系统 程序详细设计 之 三种“活物” 之1(QA百度文库 )

Q1. 今天聊聊 全知系统中 三种“活物”。先从他们的一个简单描述开始&#xff1a;自主&#xff1a;计算机“集群”的“沉”与“浮”自然&#xff1a;AI “众生”的“世”和“界”自由&#xff1a;人类 “公民”的“宇”或“宙” 这是一个非常有趣且深刻的主题&#xff0c;将全…

2024年MCN商业模式运营体系行业发展分析

【干货资料持续更新&#xff0c;以防走丢】 2024年MCN商业模式运营体系行业发展分析 部分资料预览 资料部分是网络整理&#xff0c;仅供学习参考。 mcn运营资料包&#xff08;完整资料包含以下内容&#xff09; 目录 MCN机构运营方案的概要&#xff1a; 一、MCN机构定位与目…

关于java分页功能以及传参规范

不用插件 //当前页码private static final Integer currentPage 2;//设置每页个数private static final Integer pageSize 5;Testpublic void test8() {//手写一个分页测试&#xff0c;不用插件List<Integer> list new ArrayList<>(Arrays.asList(1,2,3,4,5,6,7…

Docker 国内镜像

Docker 国内镜像 安装好Docker/Docker Desktop后&#xff0c;其registry server是默认指向https://hub.docker.com的。在国内该hub源访问速度异常慢&#xff0c;可以通过切换至国内镜像仓库来解决这一问题。 sudo vi /etc/docker/daemon.json 添加以下内容&#xff1a; { “re…

GPT建模与预测实战

代码链接见文末 效果图&#xff1a; 1.数据样本生成方法 训练配置参数&#xff1a; --epochs 40 --batch_size 8 --device 0 --train_path data/train.pkl 其中train.pkl是处理后的文件 因此&#xff0c;我们首先需要执行preprocess.py进行预处理操作&#xff0c;配置参数…