bugku----正则匹配,cookies

bugku----正则匹配 

<?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)){
//  /i 表示不匹配大小写
    $key=$second;
    if(preg_match("/\.\.|flag/",$key)){
//匹配 .. 或者 flag
        die("Noooood hacker!");
    }else{
        $third=$first;
        if(preg_match("/\\|\056\160\150\x70/i",$third)){
// \ddd 表示八进制 \xdd 表示十六进制 
// \056\160\150\x70 相当于 .php
// \\ 相当于\ ,  \| 表示匹配 |字符本身
//所以,这句话的意思是 匹配 |.php

            $end=substr($third,5); // 从小标为5的开始截取(包含5),第一个字符小标为0
            highlight_file(base64_decode($zero).$end);//maybe flag in flag.php
//这句话提示我们,括号里的结果为 flag.php
        }
    }
}
else{
    highlight_file(__FILE__);
}

代码中的注释就是思路

base64_decode($zero).$end = flag.php

1. end为third从第五个字符开始截取的部分,并且third匹配到了 |.php 因此,猜测third为 1234|.php,其中1234是为了匹配第一个正则,即girl

所以,end的值为 .php , third = first = girl|.php

base64_decode($zero) = flag

zero = base64_encode(flag) = 'ZmxhZw=='

构造url 

/?zero=ZmxhZw==&first=girl|.php

成功拿到flag

关键点:在于第三句的正则

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

从左往右一次分解 
\\ -> \

\| -> |
\056\160\150\x70 ->.php 
转化原理: 以\056为例,先将 056进行八进制转十进制,得到46,然后去ascii码表中查第46号字符,就是 '.'

结合整句话 |.php

正则的知识点

正则匹配详解_识醉沉香的博客-CSDN博客_正则匹配

全网最全正则匹配_渊云的博客-CSDN博客_正则匹配

bugku---cookies欺骗

 不知道要干什么,就放到bp里看看

看到那个filename , 很明显的base64加密,拿去解密后得到 

确认了是base64加密,因此我们将filename的值改为 index.php 的加密值,尝试读取源码

 

 确定了可以读取源码,尝试修改line的值看看(猜测line控制读哪一行)

得到结论:可以控制line来读取源码

通过不断的改变line值最终的源码为

 

<?php

error_reporting(0);

$file=base64_decode(isset($_GET['filename']) ? $_GET['filename']:"");
//三位运算符,如果filename有值,就将filename按base64解密后赋给$file,否则将""按base64解密后赋给$file

$line=isset($_GET['line']) ? intval($_GET['line']) : 0;
//同样是三位运算符,如果line有值,就将line的值强制转化为int类型后赋给$line,否则$line=0
if($file=='') 

​    header("location:index.php?line=&filename=a2V5cy50eHQ=");
//如果file为空,从定向到我们第一次看到的页面

$file_list = array(

'0' =>'keys.txt',

'1' =>'index.php',

);//相当于白名单,也就是我们可以访问的文件

if(isset($_COOKIE['margin']) && $_COOKIE['margin']=='margin'){

$file_list[2]='keys.php';
//本题考点2,意思就是在cookie中加一条margin的值,然后keys.php就进入白名单,盲猜flag在白名单里
}

if(in_array($file, $file_list)){
//对白名单进行验证,如果有的话就根据line读取文件

$fa = file($file);

echo $fa[$line];

}

?>

这个就不难,思路在注释里

大概就是要求我们去读取keys.php文件,为了能够读取keys.php文件,我们需要给cookie加一条margin的值

注意:keys.php需要先进行base64加密

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

jjj34

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值