BugKu字符?

这是一个简单题,不过可以用来练练正项表达,小白所写,看题

进入链接

由代码知这是可以通过GET传参得到Flag(就是在地址栏操作),我们来看看题目的问题

/key.*key.{4,7}key:/./(.*key)[a-z][[:punct:]]/i

典型的正则表达式,显然问题的解决方案就是在地址栏传参,使得id符合正则表达式,即可得到flag
由于我这篇是新手食用篇,所以,我在此介绍一下正则表达式的基础相关知识

^:匹配一行字符串的开头
. : 匹配任意字符,除了换行符
[…]:匹配括号中的任一个,[amk] 匹配 ‘a’,‘m’或’k’
[^…]: 不在[]中的字符:[^abc] 匹配除了a,b,c之外的字符
*:匹配0个或多个的表达式
+:匹配1个或多个的表达式
?:匹配0个或1个由前面的正则表达式定义的片段,非贪婪方式

开始看题

/key.*key.{4,7}key:/./(.key)[a-z][[:punct:]]/i

我们将正则表达式拆开

/key
.
key
.{4,7}
key:
\/
.
\/
(.*key)
[a-z]
[[:punct:]]
/i

这样看的话是不是就清晰多了,开始匹配吧,

/key,‘/’代表所有正项匹配的开始,key为固定不变的字符串,所以第一段匹配为

1
key

.是可以任意匹配一个字符,*是匹配前边的字母0次或者多次,所以.*
就是可以输入任意个字符,这里我输入aaaa,接上面的匹配的字符串为

1
keyaaaa

key为字符串,匹配的就是key,接上面就是

1
keyaaakey

.{4,7}是匹配任意4—7个字符,我这里就就写为aaaaa,接上面就是

1
keyaaakeyaaaaa

key:也和key一样,就是多了
‘:’,接上面

1
keyaaakeyaaaaakey:

/中的“\”,是转义字符,因为“/”是代表所有正项匹配的开始,我们需要将它变成普通的“/”,所以就用“\”,接上面就是

1
keyaaakeyaaaaakey:/

.是代表任意一个字符,我这就用a,接上面

1
keyaaakeyaaaaakey:/a

又有一个“/“,接上面

1
keyaaakeyaaaaakey:/a/

(.*key)是代表任意个字符后加key,括号的的意义就是这个.*key优先组合,接上面

1
keyaaakeyaaaaakey:/a/aaakey

[a-z]代表任意在a到z一个小写字母,这里我就用a,接上面

1
keyaaakeyaaaaakey:/a/aaakeya

[[:punct:]]表达任意一个ASCLL标点字符,这里我用逗号“,”,接上面

1
2
3
4
5
```
(,为英文状态下的逗号)


/i表示不分大小写,这里我匹配对应的正项式为

keyaaakeyaaaaakey:/a/aaakeya,

```

接下来我们就把我们匹配的式子传进id

此题结束