前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >PHP_PCRE回溯次数限制绕过某些安全限制

PHP_PCRE回溯次数限制绕过某些安全限制

作者头像
字节脉搏实验室
发布2020-03-30 14:50:12
1.6K0
发布2020-03-30 14:50:12
举报

因为最近在回顾有关于正则方面的知识,所以突然想起来了这个知识点,整理一篇。 PHP的PCRE库使用的正则引擎是NFA,不同于根据正则一步步匹配确定下一个转移状态的DFA,NFA会在正则表达式匹配不上时进行回溯,尝试其他的状态。 举一个简单的例子。

代码语言:javascript
复制
preg_match('/<\?.*[(`;?>].*/', $code);

当我们传入变量值如下时

代码语言:javascript
复制
$code='<? phpinfo();//abcde'

通过gif图可以看到回溯了8次(刷红代表回溯) 那么这个回溯我们可以进行怎样的利用呢? 显而易见的,如果回溯次数过多,很有可能会导致DOS攻击。

PHP也早就考虑到了这一点所以给pcre设定了一个回溯上限pcre.backtrack_limit, 可以通过var_dump(ini_get('pcre.backtrack_limit'));查询,回溯上限为1000000。

那么如果我们的回溯次数超过了上限会返回什么呢?

通过这个方法我们可以绕过一些正则匹配的机制。 比如说防SQL的WAF

代码语言:javascript
复制
<?php
if(preg_match('/UNION.+?SELECT/is', $input)) {
    die('sql');
}

这里如果输入

代码语言:javascript
复制
$input='UNION/*aaa*/SELECT'

正则匹配的回溯次数也会随着a的数量而增加从而突破pcre.backtrack_limit的限制,进而绕过WAF。

那么如何避免自己的正则被绕过呢?搭配preg_match写判断条件的时候使用全等号===即可。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-03-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 字节脉搏实验室 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档