存儲型XSS與反射型XSS有什么區別?
曾經我也疑惑過,XSS主要是通過可操控的JS代碼來做一些羞羞的事。要解決題主的疑問,需要一些前置知識。這要從XSS的分類說起。
如今最常見的XSS一般被分為存儲型、反射型、DOM型,可能有很多人對這三類不是很清楚,我來簡單解釋一下。
存儲型:惡意代碼被當做正常數據插入到數據庫中,當用戶正常訪問頁面的時候,惡意代碼從數據庫中被取出,在當前頁面被觸發。用戶不會發現自己被攻擊。這種XSS可以無差別攻擊,影響很大。比如留言板的XSS。反射型:惡意代碼被當做正常數據提交到后臺后,由后臺進行處理,并立刻返回到前端被觸發。這種XSS的攻擊方式一般是騙人點鏈接,惡意代碼在url中,有一些安全常識的人可能會發現一些端倪。比如前幾年在QQ空間留言區很火的“你這張照片好好看啊:惡意連接”。DOM型XSS:和反射型一樣,單獨提出來是因為它不過后端,由JS直接在前臺處理。所以在后端是無法防御的,這個必須要前臺過濾。比如當你在一個購物網站搜索“上衣”,返回頁面中顯示“上衣的搜索結果如下:”,這里的上衣可能就是直接由js獲取你提交的值插入的,而不是從后端而來。然后開始回答題主的疑問,一個一個來:
1.這東西到底咋攻擊的?
XSS的攻擊一般是通過各種方式注入JS代碼,這是一個客戶端攻擊,不得不承認,雖然影響也不小,和服務端攻擊比確實還是不夠看。具體的攻擊方式請看上方三種XSS的加粗部分。XSS使黑客可以操作受害者當前頁面的JS代碼,這其實就可以做很多事情了,這個后面會細講。
2.服務器過濾一下就行了,還能翻天不成?
首先,前面說了DOM型XSS不過服務器的,惡意數據直接在前端被處理而觸發攻擊,所以服務器過濾沒有用。
其次,富文本XSS難以防御,比如知乎,用戶有插入混合圖文的需求,有的場景可能還支持自定義樣式,這決定了不能完全阻止html注入,自然也就會帶來js注入,引發XSS。比如我現在再給你講XSS,如果我貼一些XSS的代碼,知乎把它過濾掉或者由于它的轉義導致我的代碼“難看”了一些,都是影響用戶體驗的事情。很多時候,理想中的安全需要給實際業務場景讓步。
再者,XSS精妙的地方在于有過多的繞過方式,因為前端那一堆本來就是不嚴格的,用黑名單去過濾是不能完全防御的。而且XSS是區分場景的,這個《白帽子講Web安全》中就提到過,惡意代碼輸出在html中、輸出在js中和輸出在href鏈接中,觸發XSS的原因是不同的,它們的安全轉義方式也不同,尷尬的是,復雜業務場景下,你不知道用戶的這個輸入會在哪里出現。。過濾的太嚴格,就改變了用戶輸入,影響用戶體驗。
最后,不得不承認,現在的XSS其實越來越少了,這是前后端分離時代必然的結果。
3.在客戶端js代碼,html里面插入東西?那有什么用?靜態資源這些都是服務器輸出的,他改了自己客戶端的,也改不了別的用戶的啊?那還咋攻擊?
參考之前我對XSS咋攻擊的回答,你會發現他可以通過騙用戶點惡意鏈接(惡意代碼在url中)和把惡意代碼插入到數據庫中(比如留言板)來操控目標受害者的客戶端上運行什么js代碼。
XSS之所以有的需要通過html注入完成是因為html擁有很多js域
比如script標簽中可以運行js代碼比如標簽的onXXX事件中可以運行js代碼比如a標簽的href跳轉時,一些偽協議(比如javascript:)可以運行js代碼比如src的data偽協議,iframe標簽等,可以直接構造html,然后為所欲為4.最后說一下XSS可以干的事兒。
控制了受害者客戶端運行的JS代碼,你可以:
盜取受害者cookie,登錄他的賬戶,這個cookie很可能是某個大企業多子域通用的,等于他很多業務的賬號被你瞬間劫持。apt攻擊中,XSS可以用來探測內網環境,偵查對于apt其實還蠻重要的。可以釣魚,操控js代碼可以動態生成一個html覆蓋在你當前頁面。可以偷你當前頁面的重要數據,偷偷回傳到攻擊者服務器。可以挖礦,js挖礦。還有很多。。。懶得寫了