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

这篇具有很好参考价值的文章主要介绍了关于转义符 \ 在php正则中的匹配问题。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

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

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

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

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

php对转义符的解析

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

分析一个正则匹配

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

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

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

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

  • 第一个转义符转义第二个转义符

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

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

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

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

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

验证成功

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

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

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

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

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

【----帮助网安学习,以下所有学习资料免费领!加vx:dctintin,备注 “博客园” 获取!】

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

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

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

首先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字符串的时候我们是不是要写四个\才可以?

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

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

总结: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对字符串进行解析:

  • \\被解析为\

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

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

正则表达式解析:

  • 第一个\|被解析为|

  • \\被解析为\

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

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

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

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

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

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

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

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

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

自己的小感想

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

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

更多网安技能的在线实操练习,请点击这里>>

  文章来源地址https://www.toymoban.com/news/detail-845678.html

到了这里,关于关于转义符 \ 在php正则中的匹配问题的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 正则表达式在PHP8中的应用案例-PHP8知识详解

    正则表达式在PHP8中的应用案例-PHP8知识详解

    正则表达式在php8中有许多应用案例。以下是一些常见的应用场景:如数据验证、数据提取、数据替换、url路由、文本搜索和过滤等。 1、数据验证 使用正则表达式可以对用户输入的数据进行验证,例如验证邮箱地址、手机号码、密码强度等。 下面是一个用正则表达式验证邮

    2024年02月12日
    浏览(13)
  • Python 正则表达式转义

    这篇文章是关于 Python 正则表达式转义的。 此外,我们将介绍 Python 正则表达式转义以及如何通过适当的示例代码使用它,以及 Python 正则表达式的多种用途。 此外,Python 支持使用正则表达式(或正则表达式)对字符串进行搜索和替换操作。 RegEx 是一种根据预定义模式匹配文

    2024年02月09日
    浏览(15)
  • json中增加转义字符“\“

    一、使用 org.json.JSONObject,将第一个json对象转string之后,塞到第二个对象中,会自动加上转义字符。  结果:{\\\"json\\\":\\\"{\\\"name\\\":\\\"123\\\"}\\\",\\\"name2\\\":\\\"456\\\"} 二、若是用 net.sf.json.JSONObject,则无论这里 json2.put(\\\"json\\\", json.toString()); 有没有转string,都会以json对象的形式。 结果:{\\\"name2\\\":\\\"456\\\",

    2024年02月16日
    浏览(6)
  • 转义序列字符(\0,\n,\r,\t,\v,\a,\f,\b,\\,\‘,\“,\?)详解,转义字符对应的全称,输出结果和对应的ASCII码值详解;

    转义序列字符(\0,\n,\r,\t,\v,\a,\f,\b,\\,\‘,\“,\?)详解,转义字符对应的全称,输出结果和对应的ASCII码值详解;

    系统是64位Windows,编译器是MinGW64,不同的设备可能会有不一样结果,大家可以自己去试试看; 1、转义字符是C语言中表示字符的一种特殊形式。通常使用转义字符表示ASCII码字符集中不可打印的控制字符和特定功能的字符,如用于表示字符常量的单引号( \\\'); 2、转义字符是一

    2024年02月07日
    浏览(6)
  • java中通过split方法使用分号分割,使用正则表达式匹配不识别单引号中的分号

    在Java中,使用split()方法可以通过指定正则表达式作为分隔符来拆分字符串。如果你想忽略单引号内的分号,可以使用以下代码: 在这个正则表达式中,它使用反向零宽断言 (?!...) 和顺序零宽断言 (?=...) 来限制分隔符的匹配位置,以确保只有在非单引号内部的位置才会进行分

    2024年02月08日
    浏览(7)
  • jmeter参数化导致反斜杠(\)被转义

    jmeter参数化导致反斜杠(\)被转义

    前情提要: 在用jmeter做接口测试时,对请求体进行参数化,执行结果报错。但在不参数化的情况下,执行结果成功,而且参数化后,请求中读取到的参数是正确的(执行失败与执行成功时的参数一致)。 问题排查: 参数化后,请求中的两个反斜杠()变成了一个反斜杠(

    2023年04月14日
    浏览(8)
  • 【C语言】转义字符(\a \b \t \v \f \r 等)

    【C语言】转义字符(\a \b \t \v \f \r 等)

    序号 转义字符 转义功能 ASCII码值 1 \\0 空字符 0 2 a 响铃 7 3 b 退格(Backspace) 8 4 t 水平制表符(即横向跳格) 9 5 n 回车换行(Enter) 10 6 v 竖向跳格 11 7 f 换页 12 8 r 回车 13 9 \\\" 双引号(\\\") 34 10 ’ 单引号(‘’) 39 11 ? 问号(?) 63 12 \\\\ 反斜线字符() 92 13 ddd 1~3位八

    2024年02月03日
    浏览(7)
  • Linux 删除 颜色转义字符 乱码 \x1b

    Linux 删除 颜色转义字符 乱码 \x1b

    目录 Linux颜色控制 方式一:添加sed正则命令 方式二:将输出写入文件再读取 Git颜色控制 使用Python paramiko ssh 获取 git 输出时,出现乱码,实际上是终端输出的ANSI颜色转义字符,用于控制终端颜色展示: x1b[?1hx1b=r  masterx1b[mrn 可以通过以下方式删除ANSI颜色转义字符: 方

    2024年02月16日
    浏览(12)
  • 记录一次数据中包含转义字符\引发的bug

    记录一次数据中包含转义字符\引发的bug

    后端返回给前端的数据是: {   \\\"bizObj\\\": {     \\\"current\\\": 1,     \\\"orders\\\": [            ],     \\\"pages\\\": 2,     \\\"records\\\": [       {         \\\"from\\\": \\\"1d85b8a4bd33aaf99adc2e71ef02960e\\\",         \\\"fromName\\\": \\\"ddd\\\",         \\\"id\\\": \\\"742836e8f3d00a6e2ebd568f3a2dd75e\\\",         \\\"img\\\": \\\"/net-hospital-admin/images/boy.png\\\",    

    2024年01月23日
    浏览(13)
  • 关于 Qt中的QString内容存在\u0000使用QChart(0x00)消除 的解决方法

    关于 Qt中的QString内容存在\u0000使用QChart(0x00)消除 的解决方法

    若该文为原创文章,转载请注明原文出处 本文章博客地址:https://hpzwl.blog.csdn.net/article/details/131860574 红胖子(红模仿)的博文大全:开发技术集合(包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软硬结合等等)持续更新中…(点击传送门)   做gps时,部

    2024年02月16日
    浏览(18)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包