打开题目链接,有如下代码
<?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功能为用正则表达式匹配字符串,如果匹配成功,返回值1,并把匹配到的值赋值给match,否则返回0。函数trim功能为去掉字符串开头和结尾的空格。
因此此题的目标为构造一个满足正则表达式/key.*key.{4,7}key:\/.\/(.*key)[a-z][[:punct:]]/i
的字符串id
对其进行分析:
- 结尾的
i
表示忽略大小写 - 多次出现的
key
表示匹配字符串key .
表示匹配除换行符 \n 之外的任何单字符*
表示匹配前一个字符0次或多次- {4,7}表示匹配前一个字符串至少4次,至多7次
:
匹配字符:\/
匹配字符/(.*key)
表示一个子表达式,功能和上文相同[a-z]
表示表示匹配小写a-z中的任意一个[:punct:]
表示匹配 !"#$%&’()*+,-./:;<=>?@[]^_`{|}~.中的任意一个
根据上面的分析,可以构造id为keyakeyaaaaakey:/a/akeya?
,满足上面正则表达式,得到flag
来源:https://blog.csdn.net/qq_40481505/article/details/100979896