python正则表达式原始字符串之坑

前言

起因是我写一款xss漏洞扫描器,需要匹配页面中是否输出我的payload,而我的payload中又有很多特殊字符(+%等),本以为一个简单的原始字符串就可以解决,但是。。。结果就是有了这篇文章

正则与原始字符串不清不楚的关系

样本如下:

<div name=""><html/+/onmouseover+=+a=prompt,a()%0dx>">

我需要查找我的样本中是否有如下字符串(也就是我的payload)

"><html/+/onmouseover+=+a=prompt,a()%0dx>

于是我写了如下正则:

print(re.findall(r'"><html/+/onmouseover+=+a=prompt,a()%0dx>', a,))

上面的正则如果执行成功就会打印一个包含目标字符串的列表,但是我却得到了一个空列表。百思不得其解,就开始搜索python正则表达式bug,但是也没有相关文章,于是我就从末尾开始删,一个字符一个字符删,看看到底是哪一个字符导致无法匹配成功,正则的变化过程大概如下:

print(re.findall(r'"><html/+/onmouseover+=+a=prompt,a()%0dx>', a))
print(re.findall(r'"><html/+/onmouseover+=+a=prompt,a()', a))
print(re.findall(r'"><html/+/onmouseover+=+a=prompt,', a))
print(re.findall(r'"><html/+/onmouseover+=+a=', a))
print(re.findall(r'"><html/+/', a))
print(re.findall(r'"><html/+', a))

终于最后一条成功匹配了,下面是匹配结果:

"><html/

是不是感觉有点奇怪,这个【+】好像还是表示正则中的意义啊,并不是像我看过的文档里写的那样表示这个字符的字面量,然后我试着把【+】给转义掉【+】,正则变为如下形式:

print(re.findall(r'"><html/\+/', a))

这次的匹配结果变了:

"><html/+/

上面就是我想要的结果,我们也可以从中看出一点猫腻了,原始字符串搭配正则真的很奇葩。这个规律很难摸清楚,文档也没有详细介绍。

贴一篇我在搜索过程中看到的和我情况类似的文章:
python中使用字符串前面加r

发布了116 篇原创文章 · 获赞 161 · 访问量 42万+

猜你喜欢

转载自blog.csdn.net/he_and/article/details/84989829