preg_match函数绕过

栏目: PHP · 发布时间: 5年前

内容简介:这是在看完整道题目的代码,我们会发现用户可控的变量只有

这是在 code-breaking 中遇到的一道题目,名为:easy - pcrewaf。题目地址: http://51.158.75.42:8088

preg_match函数绕过

看完整道题目的代码,我们会发现用户可控的变量只有 第11行$data ,而这个 $data 仅仅是用 preg_match 函数过滤了,那么必是要在 preg_match 函数上做文章。我们先来看看 preg_match 函数定义:

preg_match函数绕过

PHP手册告诉我们, preg_match 函数的返回值有3种,分别为(安全的写法是使用 === 运算符对返回值进行比较,手册推荐用效率更快的 strpos 函数替代 preg_match 函数):

returns 1;      // 如果匹配到.
returns 0;      // 如果未匹配到.
returns FALSE;  // 发生错误时.

我们可以看到题目代码 第12行 直接将 preg_match 函数的返回结果作为 if语句 的条件,这样写明显存在安全隐患。 .* 属于非贪婪模式,当部分正则匹配,但是不符合完整正则时,正则引擎会逐个字符减少,然后回溯匹配。举个例子:

$data = '<?php phpinfo();aa'
preg_match('/<\?.*[(`;?>].*/is', $data);

第一次匹配:
    <?php phpinfo();aa   # 满足正则'<\?.*' ,但是不满足完整正则
第二次匹配:
    <?php phpinfo();a    # 满足正则'<\?.*' ,但是不满足完整正则
第三次匹配:
    <?php phpinfo();     # 满足正则'<\?.*[(`;?>]' ,但是完整正则未匹配结束
第四次匹配:
    <?php phpinfo();     # 满足正则'/<\?.*[(`;?>].*/is' ,满足整个正则

那么这里的递归次数是否会有限制呢?答案是肯定的,在 PHP 中,正则匹配的递归次数由 pcre.backtrack_limit 控制 PHP5.3.7 版本之前默认值为 10万PHP5.3.7 版本之后默认值为 100万 ,该值可以通过php.ini设置,也可以通过 phpinfo 页面查看。

preg_match函数绕过

preg_match函数绕过

最后,我们通过上述技巧绕过 preg_match 函数即可。

preg_match函数绕过

PS:针对题目中的正则,我们可以使用 <script language="php">phpinfo();</script> 绕过(PHP < 7.x)

参考 :

PHP-preg_match

PHP-pcre.backtrack_limit

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

PHP利用PCRE回溯次数限制绕过某些安全限制


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Distributed Algorithms

Distributed Algorithms

Wan Fokkink / The MIT Press / 2013-12-6 / USD 40.00

This book offers students and researchers a guide to distributed algorithms that emphasizes examples and exercises rather than the intricacies of mathematical models. It avoids mathematical argumentat......一起来看看 《Distributed Algorithms》 这本书的介绍吧!

在线进制转换器
在线进制转换器

各进制数互转换器

随机密码生成器
随机密码生成器

多种字符组合密码

RGB CMYK 转换工具
RGB CMYK 转换工具

RGB CMYK 互转工具