0、打开网页,查看题目描述和PHP源代码
描 述: 字符?正则?
<?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);
}
?>
通过读代码可以看出只要我们构造出符合正则表达式的字符串通过GET方法给id变量传参就可以看到flag
1、分析正则表达式
定界符:/和/(一般来说是这两个,其实除了\和字母数字其它的只要是成对出现都可以看做定界符,比如##、!!之类的);
. (一个点):表示可以匹配任何字符;
* :前面的字符重复零次或多次;
{n,m} :前面的字符重复4~7次;
\ (反斜线):后面的字符被转义;
[a-z] :在a到z中匹配 ;
[[:punct:]] :匹配任何标点符号;
/i :表示这个正则表达式对大小写不敏感;
2、构造payload:keyakeyaaaakey:/a/akeya?并上传
构造不唯一,符合题意即可