内容简介:这是在看完整道题目的代码,我们会发现用户可控的变量只有
这是在 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绕过技巧
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
嵌入式Linux应用开发完全手册
韦东山 主编 / 人民邮电出版社 / 2008-8 / 69.00元
本书全部实例代码及相关工具。 基于ARM 9+Linux 206平台,从基础讲起,引导读者快速入门,实例丰富,可直接应用于工程实践。 本书全面介绍了嵌入式Linux系统开发过程中,从底层系统支持到上层GUI应用的方方面面,内容涵盖Linux操作系统的安装及相关工具的使用、配置,嵌入式编程所需要的基础知识(交叉编译工具的选项设置、Makefile语法、ARM汇编指令等),硬件部件的使用及......一起来看看 《嵌入式Linux应用开发完全手册》 这本书的介绍吧!