bugku ctf 字符?正则?

打开网站 

是一段php代码

<?php 
highlight_file('2.php');
$key='KEY{********************************}';
$IM= preg_match("/key.*key.{4,7}key:\/.\/(.*key)[a-z][[:punct:]]/i", trim($_GET["id"]), $match);
if( $IM ){ 
  die('key is: '.$key);
}
?>

分析    主要是 preg_match()  和 trim() 这两个函数的应用

1.preg_match (要搜索的模式,字符串,参数) 在字符串里搜索符合 要搜索的模式 的字符,并返回给参数。

2.trim(字符串,字符) 移除字符串两侧的空白字符或其他预定义字符

移除字符串两侧的空格:

<?php
$str = " Hello World! ";
echo "不使用 trim: " . $str;
echo "<br>";
echo "使用 trim: " . trim($str);
?>

3.正则表达式

.                                  匹配除 "\n" 之外的任何单个字符

*                                 匹配它前面的表达式0次或多次,等价于{0,}

{4,7}                           最少匹配 4 次且最多匹配 7 次,结合前面的 . 也就是匹配 4 到 7 个任意字符

\/                                匹配 / ,这里的 \ 是为了转义

[a-z]                           匹配所有小写字母

[:punct:]                     匹配任何标点符号

/i                                表示不分大小写

(这里我只添加了 这道题所需的正则表达式)

接着开始分析

"/key.*key.{4,7}key:\/.\/(.*key)[a-z][[:punct:]]/i"

 

一。先看最外边的//i,//代表定界符,你限定的条件都在这个定界符里面,i是不区分大小写

二。来看 /key 首先就是得有key这三个字母,不一定是一开始就是key  ?id=key

三。 /key.* 这里的.是可以匹配任何字符,所以你随便打个就行,我这里打的a,又因为后边有个 *(匹配前边的字母0次或者多次),所以你可以继续多打几个啊或者不打 ?id=keyltz

四。/key.*key, 继续分析,多加了个key, ?id=keyltzkey,继续往后 /key.*key.{4,7} 代表任意匹配一个字符并且出现4-7次,那就打四个a好了 (这个只要是有4个到7个重复字母就行)  ?id=keyltzkeyllll

五。/key.*key.{4,7}key: 加上 key:   ?id=keyltzkeyllllkey:

六:/key.*key.{4,7}key:\/.\/  \代表了转义,所以/不在代表了界定符,直接看成/./ 所以/l/即可, ?id=keyltzkeyllllkey:/l/

七:/key.*key.{4,7}key:\/.\/(.*key)[a-z][[:punct:]] (.*key) => akey [a-z]代表随便一个小写字母,a就可以,后边那个是标点符号,比如, ?id=keyltzkeyllllkey:/l/lkeyl,

 

得到flag

  • 5
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值