Bugku No one knows regex better than me


前言

这是一道算是简单的代码审计题目知道了函数的本义解题就很简单了


题目

pyload为 ?$first=aaaa|.php &zero=ZmxhZw==
<?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);
            highlight_file(base64_decode($zero).$end);//maybe flag in flag.php
        }
    }
}
else{
    highlight_file(__FILE__);
}

补充知识函数

  1. preg_match_all(匹配的正则表达式,需要匹配的字符串):=>运用正则表达式匹配规则的全部内容,返回匹配的次数.
	$second='Hbwqqqqq';
	$a= preg_match_all("/q/i",$second); //返回值是5
  • preg_match()同上,只是匹配一次就停止,成功返回1,否则返回0

  • substr()字符串的截取函数 共有三个参数 .

    1. 第一个需要截取的字符串
    2. 第二个从第几个开始截取
    3. 第三个截取字符串的长度
$second='Hbwq123';
$c= substr($second,4,2);
print($c);//输出12

解题步骤

从外到里套进去就行了

first和zero是需要传的参数

key=>$second
$second=> $ zero.$first
$third=> $first

第一个正则:
if(preg_match_all("/Yeedo|wants|a|girl|friend|or|a|flag/i",$second))

传入的两个参数只要有这其中的字符就行了(一个就行)

第二个正则
    if(preg_match("/\.\.|flag/",$key)){
        die("Noooood hacker!");
    }

不能匹配到 . 或flag

第三个正则
if(preg_match("/\\|\056\160\150\x70/i",$third))

这里注意的地方 形如\xnn为16进制(Hex),\nnn为8进制(Oct)在计算机导论中有讲过 ,php中将自动识别

\056\160\150\x70=>.php
这里匹配过程是这样的 \| => | => |
最终为|.php

综上可知

构造的pyload为:
$first=aaaa|.php &zero=ZmxhZw==

只要传入的first从第五个开始截取后与zero参数连接出现flag.php就行
这里的aaaa随意也可以oror也行
还有zero(flag)要base64加密ZmxhZw==

附上转的字符

在这里插入图片描述

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值