原理
需要知识:正则NFA回溯原理,php的pcre.backtrack_limit设置。

正则NFA回溯原理
正则表达式是一个可以被"有限状态自动机"接受的语言类。
"有限状态自动机",拥有有限数量的状态,每个状态可以迁移到零个或多个状态,输入字串决定执行哪个状态的迁移。
常见的正则引擎被分为DFA(确定性有限状态自动机)与NFA(非确定性有限状态自动机)他们匹配输入的过程是:
DFA:从起始状态开始,一个字符一个字符读取输入串,根据正则一步步确定至下一个转移状态,直到匹配不上或走完整个输入。
NFA:从起始状态开始,一个字符一个字符读取输入串,并与正则表达式进行匹配,如果匹配不上,则进行其他状态。
状态:输入串被匹配的形式。
从上面过程可知,由于NFA存在回溯,所以性能会劣于DFA,但他支持更多功能,大多数语言都是以NFA作为正则引擎。

Demo
NFA的匹配模式:
正则:<\?.*[(`;?>].*         输入串:<?php phpinfo();//aaaaa
<?php phpinfo();//aaaaa    <\?.*[(`;?>].*        0
<?php phpinfo();//aaaaa    <\?.*[(`;?>].*               0
<?php phpinfo();//aaaaa    <\?.*[(`;?>].*     0
<?php phpinfo();//aaaaa    <\?.*[(`;?>].*     1
<?php phpinfo();//aaaaa    <\?.*[(`;?>].*     1
<?php phpinfo();//aaaaa    <\?.*[(`;?>].*     1
<?php phpinfo();//aaaaa    <\?.*[(`;?>].*     1
<?php phpinfo();//aaaaa    <\?.*[(`;?>].*     1
<?php phpinfo();//aaaaa    <\?.*[(`;?>].*     1
<?php phpinfo();//aaaaa    <\?.*[(`;?>].*     1
<?php phpinfo();//aaaaa    <\?.*[(`;?>].*     1
<?php phpinfo();//aaaaa    <\?.*[(`;?>].*     0
<?php phpinfo();//aaaaa    <\?.*[(`;?>].*    0
通过表格可知,一共进行了八次回溯

什么是pcre.backtrack_limit()设置

对正则NFD回溯次数进行限制,能够预防pcre ddos,默认值为1,000,000,如果超过限制,preg_match()
将会返回false,而如果preg_match匹配成功返回为1,匹配不成功返回为0。

安全问题出现原因

php的正则引擎是NFA,当preg_match()函数内正则的回溯次数超过pcre.backtrack_limit时,将会返回false。
漏洞出现的语法:
<?php
function is_php($data){
  return preg_match('/<\?.*[(`;?>].*/is', $data);
}
if(!is_php($input)) {
    //code
}
?>

修复方案
if( is_php($input) === 0 )
// preg_match匹配成功返回int(1),失败返回int(0) 而不是false

php preg_match pcre回溯绕过的更多相关文章

  1. [转]PHP利用PCRE回溯次数限制绕过某些安全限制

    这次Code-Breaking Puzzles中我出了一道看似很简单的题目pcrewaf,将其代码简化如下: <?php function is_php($data){ return preg_ ...

  2. SSRF和XSS-filter_var(), preg_match() 和 parse_url()绕过学习

    0x01:url标准的灵活性导致绕过filter_var与parse_url进行ssrf filter_var() (PHP 5 >= 5.2.0, PHP 7) filter_var — 使用 ...

  3. preg_match绕过总结

    preg_match绕过总结 什么是preg_match 绕过方法 1.数组绕过 preg_match只能处理字符串,当传入的subject是数组时会返回false 2.PCRE回溯次数限制 PHP利 ...

  4. BUUCTF知识记录

    [强网杯 2019]随便注 先尝试普通的注入 发现注入成功了,接下来走流程的时候碰到了问题 发现过滤了select和where这个两个最重要的查询语句,不过其他的过滤很奇怪,为什么要过滤update, ...

  5. BUU刷题01

    [安洵杯 2019]easy_serialize_php 直接给了源代码 <?php $function = @$_GET['f']; function filter($img){ $filte ...

  6. 对MYSQL注入相关内容及部分Trick的归类小结

    前言 最近在给学校的社团成员进行web安全方面的培训,由于在mysql注入这一块知识点挺杂的,入门容易,精通较难,网上相对比较全的资料也比较少,大多都是一个比较散的知识点,所以我打算将我在学习过程中遇 ...

  7. PHP序列化与反序列化(二)

    题目(攻防世界): __construct和__destruct的魔术方法是默认执行的,我们可以忽视他们,__wake up执行以后会返回当前主页上,需要绕过,下面的正则匹配preg_match也需要 ...

  8. 攻防世界 WEB 高手进阶区 XCTF Web_php_unserialize Writeup

    攻防世界 WEB 高手进阶区 XCTF Web_php_unserialize Writeup 题目介绍 题名考点 PHP反序列化漏洞 正则匹配 Writeup <?php class Demo ...

  9. 深悉正则(pcre)最大回溯/递归限制

    对于如下的正则 /<script>.*?<\/script>/is 当要匹配的字符串长度大于100014的时候, 就不会得出正确结果: $reg = "/<sc ...

随机推荐

  1. CSS3 filter 模糊滤镜的应用

    CSS3 filter 模糊滤镜的应用   在segmentfault上回答过的一个问题,如何将网页CSS背景图高斯模糊且全屏显示当时没有深入了解,只觉得滤镜应该只是应用于图片上的.而且各大网站的de ...

  2. Netty源码解析—客户端启动

    Netty源码解析-客户端启动 Bootstrap示例 public final class EchoClient { static final boolean SSL = System.getPro ...

  3. Hadoop 系列(二)—— 集群资源管理器 YARN

    一.hadoop yarn 简介 Apache YARN (Yet Another Resource Negotiator) 是 hadoop 2.0 引入的集群资源管理系统.用户可以将各种服务框架部 ...

  4. jmh源码解析-整体架构

    我理解的jmh运行架构图 生成字节码,字节码负责维护测试的状态和调用被测试的方法 默认在fork的进程中进行测试,可以配置多个fork进程,以减少误差 通过线程池,提交每个迭代的测试任务,任务执行后, ...

  5. 天气预报APP(1)

    一个天气预报APP至少应该具备以下功能: *可以罗列出全国所有的省.市.县: *可以查看全国任意城市的天气信息: *可以自由的切换城市,去查看其他城市的天气: *提供手动更新以及后台自动更新天气的功能 ...

  6. javaScript基础-01 javascript语法结构

    一.基础 字符集 JavaScript程序是用Unicode字符集编写的. .区分大小写 .空格.换行符和格式控制符 .Unicode转义序列 .标准化 二.类型.值和变量 JavaScript的数据 ...

  7. 优雅的在WinForm/WPF/控制台 中使用特性封装WebApi

    优雅的在WinForm/WPF/控制台 中使用特性封装WebApi 说明 在C/S端作为Server,建立HTTP请求,方便快捷. 1.使用到的类库 Newtonsoft.dll 2.封装 HttpL ...

  8. 100天搞定机器学习|Day36用有趣的方式解释梯度下降算法

    本文为3Blue1Brown神经网络课程讲解第二部分<Gradient descent, how neural networks learn >的学习笔记,观看地址:www.bilibil ...

  9. Java 在spring cloud中使用Redis,spring boot同样适用

    1.本地安装redis服务,官网下载. 2.在开发中要使用redis,首先要启动本地redis服务,启动后页面如下: 3.在spring boot项目pom.xml文件中添加Redis需要的依赖包,可 ...

  10. Go开发中的十大常见陷阱[译]

    原文: The Top 10 Most Common Mistakes I've Seen in Go Projects 作者: Teiva Harsanyi 译者: Simon Ma 我在Go开发中 ...