前言
起因是我寫一款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