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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章