跨站指令碼( Cross-site Scripting,簡稱為XSS或跨站指令碼或跨站指令碼攻擊)是一種針對網站應用程式的安全漏洞攻擊技術,是程式碼注入的一種。
XSS攻擊可以分為三種:反射型、儲存型和DOM型
反射型XSS
反射型XSS又稱非持久型XSS,這種攻擊方式往往具有一次性
攻擊方式:攻擊者通過電子郵件等方式將包含XSS程式碼的惡意連結傳送給目標使用者。當目標使用者訪可該連結時,伺服器接收該目標使用者的請求並進行處理,然後伺服器把帶有XSS程式碼的資料傳送給目標使用者的測覽器,瀏覽器解析這段帯有XSS程式碼的惡意指令碼後,就會觸發XSS漏洞,一般用於獲取對方cookies值
利用xss需要判斷語句輸出到頁面的HTML位置,然後構造JavaScript閉合,下面以BUUCTF的xss靶場舉例
可以看到username是可以變化的,檢查頁面程式碼也發現了username,可以進行xss攻擊
直接在username寫入程式碼
- <script>alert (1);</script>
真實情況下,如果判斷了存在xss漏洞,那麼可以去線上的xss平臺,生成攻擊程式碼,例如獲取cookies值,然後注入到存在xss漏洞的地方進行攻擊。
儲存型XSS
儲存型XSS又稱持久型XSS,攻擊指令碼將被永久地存放在目標伺服器的資料庫或檔案中,具有很高的隱蔽性。
攻擊方式:這種攻擊多見於論壇、部落格和留言板,攻擊者在發帖的討程中,將惡意指令碼連同正常資訊一起注入帖子的內容中。隨著帖子被伺服器儲存下來,惡意指令碼也永久地被存放在伺服器的後端儲存器中。當其他使用者瀏覽這個被注入了惡意指令碼的帖子時,惡意指令碼會在他們的瀏覽器中得到執行
例如,惡意攻擊者在留言板中加入以下程式碼
- <script> alert (1);</script>
當其他使用者訪問留言板時,就會看到一個彈窗。可以看到,儲存型XSS的攻擊方式能夠將惡意程式碼永久地嵌入一個頁面中,所有訪問這個頁面的使用者都將成為受害者。如果我們能夠謹慎對待不明連結,那麼反射型XSS攻擊將沒有多大作為,而儲存型XSS則不同,由於它注入在一些我們信任的頁面,因此無論我們多麼小心,都難免會受到攻擊。
DOM型XSS
DOM全稱 Document Object Model,使用DOM可以使程式和指令碼能夠動態訪問和更新文件的內容、結構及樣式
DOM型XSS其實是一種特殊型別的反射型XSS,它是基於DOM文件物件模型的一種漏洞
攻擊方式:使用者請求一個經過專門設計的URL,它由攻擊者提交,而目其中包含XSS程式碼。伺服器的響應不會以任何形式包含攻擊者的指令碼。當用戶的瀏覽器處理這個響應時,DOM物件就會處理XSS程式碼,導致存在XSS漏洞。
XSS漏洞防禦
因為XSS漏洞涉及輸入和輸出兩部分,所以其修復也分為兩種
- 過滅輸入的資料,包括 ‘ 、“、<、>、on* 等非法字元
- 對輸出到頁面的資料進行相應的編碼轉換,包括HTML實體編碼