bugku-字符?正则?
打开题目,得到一串代码
1 <?php 2 highlight_file('2.php'); 3 $key='flag{********************************}'; 4 $IM= preg_match("/key.*key.{4,7}key:\/.\/(.*key)[a-z][[:punct:]]/i", trim($_GET["id"]), $match); 5 if( $IM ){ 6 die('key is: '.$key); 7 } 8 ?>
其中
1.[:punct:]是任意标点符号的意思(千万不要用#&+这三个,应该是因为前一个php不认(注释),后两个url不认(and和转空格)(来自评论的提醒!!))
2. " . " 匹配除”\n”之外的任何单个字符
3." * "匹配它前面的表达式0次或多次
4.{4,7} 是匹配4到7个任意字符(包括4,不包括7)
5.“ \/ ”匹配”/”,这里的”\”是为了转义
6.[a-z]匹配所有小写字母
7.“ /i ”表示不分大小写
所以当id传符合正则表达式时,key就会回显出来
可以将正则表达式进行拆分,一步步来构造payload
key ?id=key
.* ?id=keyaaa或者什么也不加(下面的就是什么也不加的)
key ?id=keykey
.{4,7} ?id=keykey1111
key: ?id=keykey1111key:
/ ?id=keykey1111key/
. ?id=keykey1111key/'
/ ?id=keykey1111key/'/
(.*key) ?id=keykey1111key/'/key
[a-z] ?id=keykey111key/'/keya
[[:punct:]] ?id=keykey1111key:/'/keya:
所以最终的payload:?id=keykey1111key:/'/keya: