XSS簡介
XSS攻擊通常指的是通過利用網頁開發時留下的漏洞,通過巧妙的方法注入惡意指令代碼到網頁,使用戶加載並執行攻擊者惡意制造的網頁程序。這些惡意網頁程序通常是JavaScript,但實際上也可以包括Java、 VBScript、ActiveX、 Flash 或者甚至是普通的HTML。攻擊成功后,攻擊者可能得到包括但不限於更高的權限(如執行一些操作)、私密網頁內容、會話和cookie等各種內容。
XSS注入
<script>alert(1)</script>
通過這段js代碼,彈個框來證明存在xss漏洞。
彈框只是為了證明存在此漏洞。而此漏洞的利用方式由很多種。
比如,可以使用xss平台:
平台地址
平台使用教程
當某人進入帶有腳本的頁面時,js腳本會獲取他的cookie並發往xss平台。
你只需要登錄xss平台等待即可,拿到cookie后,可以不需要密碼登錄他的賬號。
對於存儲型xss漏洞的表現形式,比較經典的是留言板。但是我們都是遵紀守法的好學生,不能對外面的網站進行測試,所以我拿了我自己的web項目做了一波操作。
發現存在xss注入,雖然Java的預處理查詢有着防御sql注入的功能,但是針對於xss注入,還需要做很多防范措施。
選擇平台生成的一些腳本注入之后,接收到了cookie,ip等相關信息
同理任何訪問被xss注入后的用戶都會被收集信息。
其實在注入成功之后,你會發現留言內容和留言者的部分都為空,因為插入的js代碼已經被瀏覽器解析執行了!
這時我們按F12,打開瀏覽器的開發者工具,就能發現嵌入的js腳本。
XSS攻防
作為一個開發,我們要保證項目的抗壓能力。
如何防范xss?
在input標簽里面加上maxlength屬性
<input type="text" name="nickname" placeholder="留言者昵稱" maxlength="10">
至於原理,就是因為js腳本的形式為<script></script>長度為17,所以只要我們在前端對長度進行限制,就可以阻止黑客進行xss攻擊了
可是!開發可沒這么好做!
作為攻擊者,我們同樣可以修改前端代碼,具體的操作是使用瀏覽器的F12(開發者工具)我們可以直接進行長度的修改。
另外,還可以用抓包的方法,在包里面直接寫,也是不受長度限制的。
所以這種方式只能針對"腳本小子",並不切合實際
2.
對關鍵字script進行過濾
很容易發現,要想進行xss攻擊,必須插入一段js腳本,而js腳本的特征是很明顯的,腳本中包含script關鍵字,那么我們只需要進行script過濾即可。
但是js腳本是一種弱類型語言,不區分大小寫,所以只需要對某一字母大小寫切換,就可以實現繞過屏蔽。
例:
<sCrIPt>alert(1)</ScripT>
這時候你可能會說,那把大小寫一起屏蔽了不久行了?
其實不然,因為語言特性,可以使用雙寫script的方式再次進行繞過
例:
<Sscriptcript>alert(1)</Sscriptcript>
原因,前面的S和后面的cript組合在一起,構成了新的Script關鍵字。
3.
使用正則表達式過濾
攻擊者如何再一次繞過?
答案是:用img標簽的oneerror屬性
<img src=x onerror=alert(1)>
4.
過濾alert關鍵字
那么,攻擊者該怎么辦呢?
答案是:編碼繞過
<a href=javascript:alert(1)>a</a>
這種編碼方式為字符編碼
字符編碼:十進制、十六進制ASCII碼或unicode 字符編碼,樣式為“&#數值;”, 例如“j”可以編碼為“j”或“j”
上述代碼解碼之后如下:
<a href=javascript:alert(1)>a</a>
你能明顯感覺到限制:由於使用到了a標簽,所以只有點擊時,才會彈框。
能不能讓所有進入這個頁面的人都彈框?
當然可以了:用iframe標簽編碼
<iframe src=javascript:alert(1)>
這種寫法,同樣既沒有script關鍵字,又沒有alert關鍵字。
由於使用了iframe標簽,留言板的樣式會發生變形。實戰中盡量不要用。```
### 小結
其實關於xss的注入方法數不勝數,學習的道路坎坎坷坷,只能一步一個坑的慢慢填。