内容简介:这是在看完整道题目的代码,我们会发现用户可控的变量只有
这是在 code-breaking 中遇到的一道题目,名为:easy - pcrewaf。题目地址: http://51.158.75.42:8088
看完整道题目的代码,我们会发现用户可控的变量只有 第11行 的 $data ,而这个 $data 仅仅是用 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 函数即可。
PS:针对题目中的正则,我们可以使用 <script language="php">phpinfo();</script> 绕过(PHP < 7.x)
参考 :
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- 巧用匿名函数绕过D盾
- 如何绕过PHP中被禁用的函数
- PHP 中函数禁用绕过的原理与利用
- 代码审计Day13 - 特定场合下addslashes函数的绕过
- [红日安全]代码审计Day13 – 特定场合下addslashes函数的绕过
- 浅谈WAF绕过技巧
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
The Four
Scott Galloway / Portfolio / 2017-10-3 / USD 28.00
NEW YORK TIMES BESTSELLER USA TODAY BESTSELLER Amazon, Apple, Facebook, and Google are the four most influential companies on the planet. Just about everyone thinks they know how they got there.......一起来看看 《The Four》 这本书的介绍吧!