1. 程式人生 > >某次XSS繞過總結

某次XSS繞過總結

0x01 背景

前段時間蘇寧src五倍積分,想著無事刷一刷玩玩,碰到一個反射型XSS,如下圖:

插入<img src=a>測試正常(此處截圖遺失,漏洞已修補),證明存在XSS,但是過濾了許多關鍵詞,很難執行程式碼,於是有了接下來的一波繞過。

0x02 測試過濾機制

經不斷測試,發現存在如下過濾機制:

1、”<script”,”alert(“,”prompt(“,”;”,”eval(“等敏感的關鍵詞被waf阻斷;

2、”+”被空格代替,斜槓、反斜槓被阻斷;

3、”onerror=”,”onload=”等此類關鍵詞被過濾,但”onload  =”,”onerror  =”未被過濾;

4、”alert(“被過濾,但”alert    ++  (“這類也被過濾(注意”+”會被替換成” “)。

5、單雙引號均未被過濾,尖括號、圓括號、中括號均未被過濾。

… …

0x03 嘗試繞過一

由0x02步目前所知道的部分過濾機制,測試構造payload1:<img src=x onerror++= 123>,發現未被過濾。payload2:<input autofocus id=a name=”javascript:123″ onfocus=”location=this.name”>同樣未被過濾,此時已經可以執行大量程式碼了,但是本菜就是想彈個窗。想到目前我所知道的彈窗主要有如下四種:

1、alert(1);

2、prompt(1);

3、confirm(1);

4、window.onerror=alert;throw 1

但是上面前三種的關鍵詞均被直接過濾,最後一種分號也被waf阻斷,想一想彈個窗真難,但是我真的只是單純想彈個窗好嗎…

(另外這一步的payload2中,用input標籤的autofocus屬性可以無需使用者和瀏覽器互動即可直接執行指令碼,很好用)

0x04 嘗試繞過二

想了一下既然都能執行程式碼了,關鍵詞被過濾,拼接或者替換應該是最好的辦法,我能想到的還有參考別人的幾種字串拼接方法如下:

1、var a=b+c;

2、a=[];a[0]=b;a[1]=c;a.join(”)

3、a.concat(b,c)

其中第一種加號被過濾,第二種分號被阻斷,只能考慮第三種拼接方法,此時構造payload3:<img src=x onerror+=”javascript:”.concat(‘aler’,’t(1)’)>,發現仍然無法彈窗。

重新梳理一下該payload的語法,才知道onerror後面執行一次指令碼,其目的僅僅是把字串拼接起來,而無法再次執行拼接後的字串。上述payload3其實等同<img src=x onerror+=”var str=’javascript:alert(1)’>,而我們要達到的效果是<img src=x onerror+=eval(‘javascript:alert(1)’)>,因此該payload失敗。

0x05 嘗試繞過三

那麼到此,機智讀者會不會和我一樣想到了這樣一種猥瑣的思路:即能不能構造一段指令碼,先執行var str=’javascript:alert(1)’,再執行str。那好說幹就幹,總結上面的經驗,我們這樣構造payload4:<input autofocus onfocus=str=”javascri”.concat(‘pt:aler’,’t(1)’) onblur=javascript:str>這是一個需要和瀏覽器互動才能觸發的payload,載入後拼接str,失去輸入框焦點時觸發執行str.但是該payload載入後仍然沒有觸發彈窗,此時我們F12開啟控制檯,檢視如下:

說明str拼接完成,但是並沒有執行,這點其實和0x04那塊類似,同樣是在標籤內str僅為字串”str”,並不能直接引用str變數,這點很難理解,也是js最噁心的地方。

0x06 嘗試繞過四

試了幾種方法都以失敗告終,但是至少知道突破的方向了,除了eval()函式能夠直接執行字串,難道就沒有其它好用的函數了嗎。這時候又一個猥瑣的方式出現了,我們能不能window.open(“javascript:xxx”)這種來實現XSS呢,查閱知道open()函式包含的是字串,那麼payload5:

0x07 嘗試繞過五

雖然上述能夠實現彈窗了,但是還是有瑕疵的,chrome和firefox對window.open()函式都會有提醒,需要手動同意才能彈窗,於是重新來回梳理一下思路,看到location,眼前一亮,頓時有了最終payload6:

<svg+onload+=location='javascri'.concat('pt:aler','t(1)')>

0x08 後記

這次遇到的XSS純粹是字串拼接的問題了,說到字串拼接,更猥瑣的我們還可以類似這樣:

<svg/onload = location='jav'+'ascript'+':%2'+'0aler'+'t%20%2'+'81%'+'29'>

其實XSS繞過有很多種姿勢,多種繞過結合才能很好的突破防護,總的來說,在進行一次XSS之前,先嚐試總結其xss防護規則,然後利用防護規則來繞過防護!