BugkuCTF-Web23-字符?正则?
打开题目坏境,题目源码如下:
<?php
highlight_file('2.php');
$key='flag{********************************}';
$IM= preg_match("/key.*key.{4,7}key:\/.\/(.*key)[a-z][[:punct:]]/i", trim($_GET["id"]), $match);
if( $IM ){
die('key is: '.$key);
}
?>
构造id符合正则匹配即可获得key。
解读这段正则表达式,含义如下:
/key.*key.{4,7}key:\/.\/(.*key)[a-z][[:punct:]]/i
‘key’+任意单个字符+零个或多个+‘key’+任意单个字符+长度4-7+‘key:/’+任意单个字符+ / +(任意单个字符+零个或多个+‘key’)+英文小写字母一个+匹配‘!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~.’中一个字符
1.“key”是表达式直接写出来的字符串,直接利用即可 //?id=key
2.“.”代表任意字符 //这里我们用a来充当任意字符 ?id=keya
3.“*”匹配前面的表达式零次或多次,此时“*”前面是“key.”而“.”是字符,所以就是匹配key零次或多次 //这里我们匹配零次 //?id=keya
4.“key”是表达式直接写出来的字符串,我们直接利用 //?id=keyakey
5.“.”接下来又是点,我们还用a来充当 //?id=keyakeya
6.“{4,7}”的意思就是匹配前面的字符4-7次,结合前面的“.”,就是匹配任意字符4-7次 //?id=keyakeyaaaa
7.“key”是表达式直接写出来的字符串,我们直接利用 //?id=keyakeyaaaakey
8.“:”也是表达式直接写出来的字符串,我们直接利用 //?id=keyakeyaaaakey:
9.“\/”代表“/” //?id=keyakeyaaaakey:/
10.“.”这个点我们还用a来充当 //?id=keyakeyaaaakey:/a
11.“\/”代表“/” //?id=keyakeyaaaakey:/a/
12.“(.*key)”这里我们输入key就行 //?id=keyakeyaaaakey:/a/key
13.[a-z]代表a-z中的任意一个字符,这里我们继续用a //?id=keyakeyaaaakey:/a/keya
14.[[:punct:]]代表任意一个字符,包括各种符号,输入标点符号即可,这里我们用个分号 //?id=keyakeyaaaakey:/a/keya;
15./i代表大小写不敏感
构造poyload如下:
keyakeyaaaakey:/a/keya.
提交获得flag。