简单的正则也能出CTF赛题

0X00

题目比较简单,就给出一段正则的代码:

$match = preg_match("/ket.*key.{4,7}:\/.\/(.*key)/i",trim($_GET['id']),$matchcon);
if($match){
  echo $flag;

这个函数
知识补充:

 int preg_match ( string $pattern , string $subject [, array &$matches [, int $flags = 0 [, int $offset = 0 ]]] )

搜索subject与pattern给定的正则表达式的一个匹配.
参数
pattern

要搜索的模式,字符串类型。

subject

输入字符串。

matches

如果提供了参数matches,它将被填充为搜索结果。 $matches[0]将包含完整模式匹配到的文本, $matches[1] 将包含第一个捕获子组匹配到的文本,以此类推

所以这道题目就是id用GET的形式赋值,然后匹配前面的那段正则表达式。

拿出前面的正则表达式进行分析:
/ket.*key.{4,7}:\/.\/(.*key)/i
正则知识补充:

.   匹配除换行符 \n 之外的任何单字符。要匹配 . ,请使用 \. 
*   匹配前面的子表达式零次或多次。要匹配 * 字符,请使用 \*
{n,m}   m 和 n 均为非负整数,其中n <= m。最少匹配 n 次且最多匹配 m 次。例如,"o{1,3}" 将匹配 "fooooood" 中的前三个 o。'o{0,1}' 等价于 'o?'。请注意在逗号和两个数之间不能有空格。

ket.*key,它将会匹配最长的以ket开始,以key结束的字符串。这个随便构造ket1454key和ket1key一样的效果所以随便构造。只需要ket开头key结尾。
.{4,7}点号匹配任意字符,.{4,7}就是匹配任意字符4到7次可以是7777,jdijfh等等,随意。
:\/.\/ 前面转意所以加\中间有个点好也是匹配任意字符
(.*key)/i 这个比较明显就是key结尾就是,前面随便写i表达式的结尾处的不区分大小写 i 标记指定不区分大小写。

所以构造patload:

?id=ket1key1111:/1/1key
?id=ket1ghtkey11rt11:/1/fg1key

答案不唯一有很多很多,随便构造!

猜你喜欢

转载自blog.csdn.net/qq_29647709/article/details/81606933