关于正则表达式
Posted liangxiyang
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于正则表达式相关的知识,希望对你有一定的参考价值。
也是刚接触ctf不久,在做题的过程中,也是学到了不少东西。
刚开始是从南邮的题目入手的,不过再做过bugku上面的题之后,觉得这上面的更适合新手入门。
题的难度与易到难,每道题所需要的知识点也非常清晰。
前几天在做 字符?正则?这道题时,对正则略有心得,就想写篇文章,发表一下拙见。
毕竟是新手,又是第一次写文章,若是有出错的地方,还请大家多包涵,多指教。
对于正则表达式,只要我们能把这个表达式看懂,能够很好的理解它所要表达的内容,然后输入符合要求的字符串就行了。
那么,对于新手来说,怎么才能看懂这让人头疼的正则表达式呢。
这里网上有一个很详细的教程,大家可以看一下,我也是看完之后,才了解正则表达式的
https://www.cnblogs.com/superstar/p/6638970.html
下面,来看下bugku上面这道关于正则的题,源代码如下:
<?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);
}
?>
代码里,重要的就是这一句了:$IM= preg_match("/key.*key.{4,7}key:/./(.*key)[a-z][[:punct:]]/i", trim($_GET["id"]), $match)
这句话的大致意思就是我们要传入一个id参数,并且它要符合这个正则表达式:"/key.*key.{4,7}key:/./(.*key)[a-z][[:punct:]]/i"
下面,让我们一起来分析一下这个表达式:
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代表大小写不敏感
到此,我们就写出了一个符合要求的表达式,传入id参数就得到了flag。
以上是关于关于正则表达式的主要内容,如果未能解决你的问题,请参考以下文章