欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程语言 > php >内容正文

php

php pcre回溯攻击,php preg_match pcre回溯绕过

发布时间:2025/3/11 php 42 豆豆
生活随笔 收集整理的这篇文章主要介绍了 php pcre回溯攻击,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。

漏洞出现的语法:

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

原文:https://www.cnblogs.com/cimuhuashuimu/p/11490375.html

总结

以上是生活随笔为你收集整理的php pcre回溯攻击,php preg_match pcre回溯绕过的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。