• 【安全】正则回溯绕过练习简单案例


    目录

    环境

    案例1

    前要

    代码审计 

    分析 

    案例2 

    代码审计

    分析

    payload


    环境

            phpstudy

    案例1

          前要

            php中0 1 -1 true false null 空字符 数组之间的比较 

          代码审计 

    1. function areyouok($greeting){
    2. return preg_match('/Merry.*Christmas/is',$greeting);
    3. //2.传参之后来到这个有正则匹配的函数
    4. }
    5. $greeting=@$_POST['greeting'];
    6. //1.post传参
    7. if(!areyouok($greeting)){
    8. //3.这个if要areyouok返回false才能进来
    9. if(strpos($greeting,'Merry Christmas') !== false){
    10. //4.这个if要里面的strpos为字符查找函数,
    11. //如果查找到返回字符的位置,没有就返回false
    12. //5.根据弱类型匹配原则构造payload
    13. echo 'flag{this is flag}';
    14. }else{
    15. echo 'Do you know .swp file?';
    16. }
    17. }else{
    18. echo 'Do you know PHP?';
    19. }

     strpos函数官方文档提示:

            经过实验,如果字符串位置放数组返回的实际是null

         分析 

             ①正则要匹配不上才能进第一个if        

             ②第二个if又要求greeting中含有Merry Christmas

             ③跳出第二个的思想,根据官方文档提示如果返回的是null的话

             ④null !== false能返回true是因为!==参考的是严格比较=== (!=参考的==)

            payload

    greeting[]=

    案例2 

         代码审计

    1. function areyouok($greeting){
    2. return preg_match('/Merry.*Christmas/is',$greeting);
    3. }
    4. //3.目的是不匹配上merrychristmas
    5. $greeting=@$_POST['greeting'];
    6. //1.post传参
    7. if(!is_array($greeting)){
    8. //2.判断是否为数组(封杀案例1的那种payload)
    9. if(!areyouok($greeting)){
    10. if(strpos($greeting,'Merry Christmas') !== false){
    11. //4.匹配上merrychristmas
    12. echo 'Merry Christmas. '.'flag{this is flag}';
    13. }else{
    14. echo 'Do you know .swp file?';
    15. }
    16. }else{
    17. echo 'Do you know PHP?';
    18. }
    19. } else {
    20. echo 'fuck array!!!';
    21. }
    22. ?>

         分析

            ①不能匹配到MC的同时又要匹配到MC才能拿到flag

            ②正则回溯吐字符100w次就会返回false(目的是防止ddos)这样第一个if就能过去了,第二个只要里面存在MC也能进,那就构造存在MC的然后又会回溯100w次以上的

            

         payload

    1. from requests import post
    2. payload = {
    3. 'greeting': 'Merry Christmas' +'x'*1000000
    4. }
    5. res = post('http://localhost:8081/demo4.php', data=payload)
    6. print(res.text)

    注:图中所标版本复现失败,我以为是php版本高了,结果下面那个8.的复现成功了实属离奇

  • 相关阅读:
    0904小红书笔试
    golang 爬虫修炼04 ---利用正则提取数据
    数据库系统个人记录
    每日一练:LeeCode-56、合并区间【数组+滑动窗口】
    AMBA总线协议之AHB学习记录(2)—ahb_bus的测试(附testbench代码)
    WPF-页面-DataGrid数据处理-多线程-Winform嵌入
    评估APP网页小程序代码UI开发H5估价师怎么评估开发精确研发价格?
    Redis优化
    C语言 static extern 关键字详解
    Vue 路由
  • 原文地址:https://blog.csdn.net/weixin_53428697/article/details/132663766