打开网站
是一段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