Bugku No one knows regex better than me

<?php
error_reporting(0);
$zero=$_REQUEST['zero'];
$first=$_REQUEST['first'];
$second=$zero.$first;
if(preg_match_all("/Yeedo|wants|a|girl|friend|or|a|flag/i",$second)){
    $key=$second;
    if(preg_match("/\.\.|flag/",$key)){
        die("Noooood hacker!");
    }else{
        $third=$first;
        if(preg_match("/\\|\056\160\150\x70/i",$third)){
            $end=substr($third,5);
            $a = base64_decode($zero).$end;
            highlight_file(base64_decode($zero).$end);//maybe flag in flag.php
        }
    }
}
else{
    highlight_file(__FILE__);
}
​

这里主要看第三次匹配

"/\\|\056\160\150\x70/i"

首先我们要知道字符串传入到PHP的时候转义一次,注意

在PHP中双引号会解析字符串中的变量,单引号则不会。但在单引号中是可以转义单引号和转义字符本身这里先不多说了。

在Php和Python中的编码中 (\+数字)-------->属于八进制编码 (\x+数字)------->属于十六进制编码

具体情况,如下图

可以看出在传入PHP解析后,正则匹配的语句变为:

/\|.php/i

在正则匹配时,转义符\|转义导致|没有被解析

也就是真正匹配是:

|.php

最终payload

zero=ZmxhZw==&first=fa34|.php

运算符优先级

运算符描述
\转义符
(), (?:), (?=), []圆括号和方括号
*, +, ?, {n}, {n,}, {n,m}限定符
^, $, \任何元字符、任何字符定位点和序列(即:位置和顺序)
|替换,"或"操作 字符具有高于替换运算符的优先级,使得"m|food"匹配"m"或"food"。若要匹配"mood"或"food",请使用括号创建子表达式,从而产生"(m|f)ood"。

参考文章:

php中单双引号有区别吗-PHP问题-PHP中文网

BugKu No one knows regex better than me_山川绿水的博客-CSDN博客

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值