php preg_match pcre回溯绕过
原理
需要知识:正则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回溯绕过的更多相关文章
- [转]PHP利用PCRE回溯次数限制绕过某些安全限制
这次Code-Breaking Puzzles中我出了一道看似很简单的题目pcrewaf,将其代码简化如下: <?php function is_php($data){ return preg_ ...
- 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 — 使用 ...
- preg_match绕过总结
preg_match绕过总结 什么是preg_match 绕过方法 1.数组绕过 preg_match只能处理字符串,当传入的subject是数组时会返回false 2.PCRE回溯次数限制 PHP利 ...
- BUUCTF知识记录
[强网杯 2019]随便注 先尝试普通的注入 发现注入成功了,接下来走流程的时候碰到了问题 发现过滤了select和where这个两个最重要的查询语句,不过其他的过滤很奇怪,为什么要过滤update, ...
- BUU刷题01
[安洵杯 2019]easy_serialize_php 直接给了源代码 <?php $function = @$_GET['f']; function filter($img){ $filte ...
- 对MYSQL注入相关内容及部分Trick的归类小结
前言 最近在给学校的社团成员进行web安全方面的培训,由于在mysql注入这一块知识点挺杂的,入门容易,精通较难,网上相对比较全的资料也比较少,大多都是一个比较散的知识点,所以我打算将我在学习过程中遇 ...
- PHP序列化与反序列化(二)
题目(攻防世界): __construct和__destruct的魔术方法是默认执行的,我们可以忽视他们,__wake up执行以后会返回当前主页上,需要绕过,下面的正则匹配preg_match也需要 ...
- 攻防世界 WEB 高手进阶区 XCTF Web_php_unserialize Writeup
攻防世界 WEB 高手进阶区 XCTF Web_php_unserialize Writeup 题目介绍 题名考点 PHP反序列化漏洞 正则匹配 Writeup <?php class Demo ...
- 深悉正则(pcre)最大回溯/递归限制
对于如下的正则 /<script>.*?<\/script>/is 当要匹配的字符串长度大于100014的时候, 就不会得出正确结果: $reg = "/<sc ...
随机推荐
- Jquery.form异步上传文件常见问题解决
Jquery.form常用方法我就不多说,主要说一下在使用过程中碰到的问题 1.提示 “xxxx” is not define 或者"xxx" is not a function ...
- A solution to the never shortened to-do list
I once told my younger sister my learning system, and the basic five doctrines of my methodology. Bu ...
- webgl(three.js)实现室内定位,楼宇bim、实时定位三维可视化解决方案
(写在前面,谈谈物联网展会)上次深圳会展中心举行物联网展会,到了展会一看,80%以上的物联网应用都是在搞RFID,室内定位,我一度怀疑物联网落地方案的方向局限性与市场导向,后来多方面了解才明白,展会上 ...
- ABAP_增强点查找
*&---------------------------------------------------------------------* *& Report Z_FIND_EN ...
- 面试java后端面经_1
1 自我介绍(建议提前准备:没准备的可以这样说:来自某学校 姓名 专业 学的啥 为啥学 自己陆陆续续开发的项目 毕业将近 找工作 在哪看到贵公司的招聘 准备了啥 大概这样) 例子:您好!我是来自XXX ...
- 《深入理解Java虚拟机》- JVM是如何实现反射的
Java反射学问很深,这里就浅谈吧.如果涉及到方法内联,逃逸分析的话,我们就说说是什么就好了.有兴趣的可以去另外看看,我后面可能也会写一下.(因为我也不会呀~) 一.Java反射是什么? 反射的核心是 ...
- LoRaWAN_stack移植笔记(四)__RTC
stm32相关的配置 由于例程使用的主控芯片为STM32L151C8T6,而在本设计中使用的主控芯片为STM32L051C8T6,内核不一样,并且Cube库相关的函数接口及配置也会有不同,所以芯片的驱 ...
- 2015-11-17 linux基础笔记
21. 可执行权限不代表能够执行,这得看文件内容 22. 还是可以用适当的拓展名表示该文件是什么种类的*.sh 脚本或批处理文件 *Z.*.tar.*.tar.gz.*.zip.*.tgz 压缩文件 ...
- shell习题2
1---------------->>>>输入一个设备文件,输出这个设备文件的基本信息: 2.------------->>>>显示一个如下的菜单,cp ...
- Vue实现静态数据分页
<div style="padding:20px;" id="app"> <div class="panel panel-prima ...