原理
需要知识:正则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. .NET Core 3.0深入源码理解HttpClientFactory之实战

      写在前面 前面两篇文章透过源码角度,理解了HttpClientFactory的内部实现,当我们在项目中使用时,总会涉及以下几个问题: HttpClient超时处理以及重试机制 HttpClient ...

  2. restapi(4)- rest-mongo : MongoDB数据库前端的httpserver

    完成了一套标准的rest风格数据库CRUD操作httpserver后发现有许多不足.主要是为了追求“通用”两个字,想把所有服务接口做的更“范generic”些,结果反而限制了目标数据库的特点,最终产生 ...

  3. 【游记】NOIP2019前传

    声明 我的游记是一个完整的体系,如果没有阅读过往届文章,阅读可能会受到障碍. ~~~上一篇游记的传送门~~~ 前言 比完赛后,我沉浸在胜利中长达半个月,而后才清醒过来,意识到自己需要为NOIP2019 ...

  4. 深度学习模型训练技巧 Tips for Deep Learning

    一.深度学习建模与调试流程 先看训练集上的结果怎么样(有些机器学习模型没必要这么做,比如决策树.KNN.Adaboost 啥的,理论上在训练集上一定能做到完全正确,没啥好检查的) Deep Learn ...

  5. 编程使用c#连接到IBM db2的两种方式

    一:使用c#通过odbc连接到IBM db2使用 ConnectionString 属性连接到各种数据源. 部署:只要在客户端安装IBM DB2 ODBC driver.配置DSn即可. 1):可以单 ...

  6. jmeter之beanshell使用

    beanshell官网:http://www.BeanShell.org/ 一.beanshell介绍 是一种完全符合Java语法规范的轻量级的脚本语言: 相当于一个小巧免费嵌入式的Java源代码解释 ...

  7. springboot 项目的https的发布

    1.生成密钥证书 生成命令: keytool -genkey -alias tomcat -storetype PKCS12 -keyalg RSA -keysize -keystore keysto ...

  8. SSH开发模式——Struts2(第二小节)

    上一小节已经学会了如何去搭建Struts2的开发环境,该篇博客我们继续深入Struts2,了解Struts2框架的拦截器. 首先对我们在web.xml文件配置的过滤器进行一个源码的分析. 在Strut ...

  9. Oracle数据库之五 限定查询和排序显示

    五.限定查询和排序显示 5.1.限定查询 5.1.1 认识限定查询 例如:如果一张表中有 100w 条数据,一旦执行了 " SELECT * FROM 表 " 语句之后,则将在屏幕 ...

  10. ZooKeeper异步调用命令

    在ZooKeeper中,所有的同步调用命令,都会有一个相应的异步调用方法.异步调用能在一个单独线程中同时提交更多的命令,也能在一定程度上简化代码实现. 1 异步create方法 如创建zNode的命令 ...