Bugku之web部分解题思路

No one knows regex better than me

知识点:正则表达式

 <?php 
error_reporting(0);
$zero=$_REQUEST['zero'];
$first=$_REQUEST['first'];
$second=$zero.$first;//将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)){    //  解码后:”|.php“
            $end=substr($third,5);
            highlight_file(base64_decode($zero).$end);//maybe flag in flag.php
        }
    }
}
else{
    highlight_file(__FILE__);
} 

error_reporting(0)表示不报告错误
然后用$REQUEST传zero和first
second=zero.first
second中要包含
/Yeedo|wants|a|girl|friend|or|a|flag/这里面的其中一个,并且不区分大小写。
然后key=second=zero.first
key中不能有
..flag

另外,third=first。
\056\160\150为八进制,\x70为十六进制
third中要有**|.phpsubstr**是截取字符,end取值时从third的第5位开始取值,然后得到base64解密的zero与end连接

思路:

先在zero中传入base74加密后的flag(ZmxhZw==),提示说flag在flag.php中,所以我们最后要构造出flag.php。而第一个if会把flag过滤掉,又考虑到最后会进行base64解码与first拼接,所以flag就用base64加密传到zero中,由于第二个if把**..过滤掉了,如果直接在first中传入了.php后,second会变成flag..php,会被过滤。sudstr会截取掉前四个字符,从第五个字符开始接收,并且first值中要包含/Yeedo|wants|a|girl|friend|or|a|flag/其中一个才能正常往下进行,所以first直接传入flag|.php**
所以构建?zero=ZmxhZw==&first=flag|.php

x|y

x|y,匹配 x 或 y。
例如,’z|food’ 能匹配 “z” 或 “food”。’(z|f)ood’ 则匹配 “zood” 或 “food”。

打赏
  • 版权声明: 本博客所有文章除特别声明外,著作权归作者所有。转载请注明出处!

请我喝杯咖啡吧~

支付宝
微信