zoukankan      html  css  js  c++  java
  • php preg_match pcre回溯绕过

    原理
    需要知识:正则NFA回溯原理,php的pcre.backtrack_limit设置。

    正则NFA回溯原理
    正则表达式是一个可以被"有限状态自动机"接受的语言类。
    "有限状态自动机",拥有有限数量的状态,每个状态可以迁移到零个或多个状态,输入字串决定执行哪个状态的迁移。
    常见的正则引擎被分为DFA(确定性有限状态自动机)与NFA(非确定性有限状态自动机)他们匹配输入的过程是:
    DFA:从起始状态开始,一个字符一个字符读取输入串,根据正则一步步确定至下一个转移状态,直到匹配不上或走完整个输入。
    NFA:从起始状态开始,一个字符一个字符读取输入串,并与正则表达式进行匹配,如果匹配不上,则进行其他状态。
    状态:输入串被匹配的形式。
    从上面过程可知,由于NFA存在回溯,所以性能会劣于DFA,但他支持更多功能,大多数语言都是以NFA作为正则引擎。

    Demo
    NFA的匹配模式:
    正则:<\?.*[(`;?>].*         输入串:<?php phpinfo();//aaaaa

    匹配位置 模式 回溯
    <?php phpinfo();//aaaaa <\?.*[(`;?>].* 0
    <?php phpinfo();//aaaaa <\?.*[(`;?>].* 0
    <?php phpinfo();//aaaaa <\?.*[(`;?>].* 0
    <?php phpinfo();//aaaaa <\?.*[(`;?>].* 1
    <?php phpinfo();//aaaaa <\?.*[(`;?>].* 1
    <?php phpinfo();//aaaaa <\?.*[(`;?>].* 1
    <?php phpinfo();//aaaaa <\?.*[(`;?>].* 1
    <?php phpinfo();//aaaaa <\?.*[(`;?>].* 1
    <?php phpinfo();//aaaaa <\?.*[(`;?>].* 1
    <?php phpinfo();//aaaaa <\?.*[(`;?>].* 1
    <?php phpinfo();//aaaaa <\?.*[(`;?>].* 1
    <?php phpinfo();//aaaaa <\?.*[(`;?>].* 0
    <?php phpinfo();//aaaaa <\?.*[(`;?>].* 0


    通过表格可知,一共进行了八次回溯

    什么是pcre.backtrack_limit()设置

    对正则NFD回溯次数进行限制,能够预防pcre ddos,默认值为1,000,000,如果超过限制,preg_match()
    将会返回false,而如果preg_match匹配成功返回为1,匹配不成功返回为0。

    安全问题出现原因

    php的正则引擎是NFA,当preg_match()函数内正则的回溯次数超过pcre.backtrack_limit时,将会返回false。
    漏洞出现的语法:
    <?php
    function is_php($data){
      return preg_match('/<\?.*[(`;?>].*/is', $data);
    }
    if(!is_php($input)) {
        //code
    }
    ?>

    修复方案
    if( is_php($input) === 0 )
    // preg_match匹配成功返回int(1),失败返回int(0) 而不是false

  • 相关阅读:
    tar解压时如何去掉第一级目录并解压到指定目录?
    ubuntu下容器无法启动报错"failed to start daemon: failed to dial "/run/containerd/containerd.sock": unknown service containerd.services.namespaces.v1.Namespaces: not implemented"如何处理?
    redis用法介绍
    Map.putAll()用法
    Random,ThreadLocalRandom,SecureRandom的几点思考
    SOAPUI---使用断言
    AutoUpdater迁移到Github
    VirtualBox: linux 没有权限访问共享文件夹的问题
    MakeFIle: 解决“/bin/bash^M: bad interpreter: No such file or directory”的问题
    ubuntu 备忘录
  • 原文地址:https://www.cnblogs.com/cimuhuashuimu/p/11490375.html
Copyright © 2011-2022 走看看