XSS 全稱Cross Site Scripting 即‘跨站腳本攻擊’。 從其中文釋義我們能直觀的知道,這是一種對網站的攻擊方式。
其原理在於,使用一切可能手段,將可執行腳本(scripting)植入被攻擊頁面中去,從而實現對目標網站的攻擊。 本質上可以理解為‘讓自己的代碼在目標網站中運行’的一種技術。
一個系統對於XSS攻擊的防御能力,是我們安全性測試的一個重要方面,也是我們軟件測試團隊在安全性測試領域內的一個重要度量。
本文我們希望就XSS測試方面進行一些探討。
進入正題,本文的最終落腳點是我們怎么去測試一個系統對於XSS功能的防御能力,不過在落到我們最終的命題之前,我們要先來探討XSS的原理。所謂知其然還要知其所以然!
最常見的XSS攻擊有以下兩種表現形式:
第一種是存儲型攻擊:將腳本注入進一段發布內容里面,當系統其他用戶訪問到(看到)這段發布內容,腳本便已被運行並且達成其目的。
存儲型XSS的本質在於:提交的XSS代碼會存儲在服務端(不管是數據庫,內存還是文件系統等),下次請求目標頁面是不用再提交XSS代碼。
比如用戶在論壇里發布一個帖子,這個帖子里包含XSS代碼。
第二種是反射型攻擊:發出請求時,XSS代碼出現在URL中,作為輸入提交到服務端,服務端解析后響應,在響應內容中出現這段XSS代碼,最后瀏覽器執行。這個過程就像一次反射,所以叫做反射型XSS。
反射型攻擊的實現形式經常呈現以下圖所示的方式:
黑客——發現存在反射XSS的URL——根據輸出點的環境構造XSS代碼——進行編碼、縮短——發送給受害人——受害打開URL后,執行XSS代碼——完成黑客想要的功能(獲取cookies、url、瀏覽器信息、IP等等)。
最后一種是DOM型XSS攻擊。他是一種web server不參與,僅僅涉及到瀏覽器的XSS。比如根據用戶的輸入來動態構造一個DOM節點,如果沒有對用戶的輸入進行過濾,那么也就導致XSS攻擊的產生。
光看理論用處不大,接下來我們自己來嘗試實現XSS攻擊。實現一個XSS攻擊的前提是,我們要有一個可被攻擊的對象--當然不推薦去攻擊一個真實的系統,所以我們推薦大家搭建一個自己的網站去讓我們自己折騰。
DVWA是一個很好的選擇。DVWA- Damn voulnerable web application,是UK的一家安全性研究機構發布的一套網站系統,專門用來展示網站安全性問題和防御機制。對於我們學習web安全性相關知識是一個很好的工具。這套web項目可以在http://www.dvwa.co.uk/官網由github下載。下載完成以后,將這套網站部署在本地,我們就可以開始實現XSS攻擊,從而掌握他的防御理念了。
要部署這套網站,可以考慮使用xampp這樣的便捷建站集成軟件包,xampp很方便使用,我們用他來實現DVWA所需要的中間件和數據庫服務。將DVWA搭建在其htdocs目錄下,就可以將網站運行起來。關於xampp的使用網上有諸多教程,這里就不再復述了。
DVWA運行起來登錄以后,我們會看到如下的界面:
從紅標部分我們可以看到,他提供了非常顯眼的xss攻擊試驗場地。
Bravo,我們馬上擼起袖子來對他進行XSS攻擊:
首先,去到DVWA Security目錄,將整個站點的安全級別調為‘LOW’,這樣我們的攻擊才會直觀生效。
我們先來測試一個基本的反射型攻擊:
去到XSS(Reflected)目錄,可以看到這個在這個頁面上我們可以輸入一串字符,網頁會將這串字符展示出來:
我們在這個輸入框內輸入以下腳本並提交:
<script>alert('xss');</script>
是不是看到,這個腳本被執行了!直觀的結果就是,一個彈窗被觸發了:
這就是一次成功的XSS攻擊 -- 我們的腳本代碼在對方的網站環境中被運行了。當然這個簡單的XSS攻擊充其量只是一個惡作劇級別的,還達不成惡性后果,我們后續會研究后果更壞的XSS攻擊形式。
在此之前我們再來嘗試存儲式XSS攻擊:
去到XSS(STORED)目錄,可以看到這是一個留言板界面,我們可以在這個頁面上進行留言發布。
我們在留言的內容中,插入一條腳本,看看會發生什么。這次我們嘗試稍微復雜一點的腳本:
<script>alert(document.cookie)</script>
我們希望彈窗展示出當前用戶的cookie內容。我們將這條腳本發布以后,可以看到如下現象:
每當這條發布的內容被訪問到,當前用戶的cookie信息就會被打印出來,我們接着去觀察頁面源代碼,會發現:
我們剛才的腳本已經被寫入到頁面源碼,成為頁面的一部分了!
到此為止我們已經接觸了XSS的原理,並用DVWA這個系統嘗試了簡單的XSS攻擊,相信我們對於XSS攻擊已經有了初步的認識。
在下一篇中我們會繼續深入,使用XSS攻擊實現盜取用戶信息的罪惡目的,然后我們會學習XSS的防御方法以及怎么對網站防XSS能力進行測試!