PHP利用PCRE回溯次数

目录

原理

例子

来一道题(2018·i春秋圣诞欢乐赛官方WriteUp)

利用php弱语言特性解题

利用回溯


原理

对于一串正则表达式来说它匹配了一系列的字符串后自身的正则还没有用完,这个时候就会触发回溯机制,超过回溯次数正则匹配就失效

例子

正则

<\?.*[(`;?>].*

 匹配的字符串

 <?php phpinfo();//aaaaa

当正则匹配道.*的时候整个字符串就都匹配到了,.*匹配完之后正则的匹配不会停止而是回溯接着完成[(`;?> ]匹配

就是第一次回吐

 <?php phpinfo();//aaaa

第二次回吐

 <?php phpinfo();//aaa

第三次回吐

 <?php phpinfo();//aa

......

第七次回吐,这是;可以匹配[(`;?>] 然后在进行匹配.*

 <?php phpinfo();

这个回吐是有限制的超过这个限制,preg_match 函数返回 false

这个回吐的限制中文版php文档中10万次,英文版文档100万次,以英文版为主

来一道题(2018·i春秋圣诞欢乐赛官方WriteUp)

<?php
function areyouok($greeting){
    return preg_match('/Merry.*Christmas/is',$greeting);
}

$greeting=@$_POST['greeting'];
if(!areyouok($greeting)){
    if(strpos($greeting,'Merry Christmas')!==false){
        echo 'Merry Christmas. '.'flag{test}';
    }else{
        echo 'Do you know .swp file?';
    }
}else{
    echo 'Do you know PHP?';
}
?>

利用php弱语言特性解题

可以直接利用php弱语言的特性,strpos只能检测数组,你给他提交一个数组,然后   if(strpos($greeting,'Merry Christmas')!==false)判断自然就是false就可以获取flag,如下图抓包后传参得到flag

利用回溯

注意这个回溯对php版本是有要求的比如7.3就不行,因为7.3回溯失败返回的是’1‘

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值