preg_match函数绕过

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

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

这是在 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回溯次数限制绕过某些安全限制


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

查看所有标签

猜你喜欢:

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

100个可操作的网络赚钱方法

100个可操作的网络赚钱方法

陶秋丰 / 云南科技 / 2009-12 / 29.80元

《100个可操作的网络赚钱方法》专为有志于网上创业的读者量身打造,作者是“实战型”的网赚高手,在17岁时就通过互联网创业“年人10万”,如今结合自身的亲身实战经验,与大家分享可以实实在在盈利的100个网络赚钱方法和技巧。内容包括:网站创建与推广、竞价广告、联盟赚钱、网站SEO优化、域名投资、广告投放盈利、威客、博客、淘客赚钱等多个方面。 本手册中作者结合自身的网络赚钱经历,通过具体的、可操作......一起来看看 《100个可操作的网络赚钱方法》 这本书的介绍吧!

HTML 压缩/解压工具
HTML 压缩/解压工具

在线压缩/解压 HTML 代码

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

HEX HSV 转换工具
HEX HSV 转换工具

HEX HSV 互换工具