XSS跨站指令碼攻擊介紹

99度灰發表於2021-12-05

一、XSS漏洞簡介

  XSS(Cross Site Script)即跨站指令碼,攻擊者透過在目標網站上注入惡意指令碼,使之在使用者的瀏覽器上執行。利用這些惡意指令碼,攻擊者可獲取使用者的敏感資訊如 Cookie、SessionID等。總而言之,前端能做的事情它都能做到。XSS可分為反射型,儲存型和DOM型。

二、XSS分類

反射型XSS:反射型XSS也被稱為非永續性XSS,是現在最容易出現的一種XSS漏洞。當使用者訪問一個帶有XSS程式碼的URL請求時,伺服器端接收資料後處理,然後把帶有XSS程式碼的資料傳送到瀏覽器,瀏覽器解析這段帶有XSS程式碼的資料後,最終造成XSS漏洞。

儲存型XSS:儲存型XSS又被稱為永續性XSS,儲存型XSS是最危險的一種跨站指令碼。允許使用者儲存資料的WEB應用程式都可能會出現儲存型XSS漏洞,當攻擊者提交一段XSS程式碼後,被伺服器端接收並儲存,當再次訪問頁面時,這段XSS程式碼被程式讀取響應給瀏覽器,造成XSS跨站攻擊,這就是儲存型XSS。

DOM型XSS:傳統型別的XSS漏洞(反射型或儲存型)一般出現在伺服器端程式碼中,而DOM XSS是基於DOM文件物件模型的一種漏洞,所以,受客戶端瀏覽器的指令碼程式碼所影響。

三、XSS漏洞利用

1.Cookie劫持

常見的XSS漏洞利用方式有Cookie劫持,一般Cookie中儲存了使用者的登入憑證。如果Cookie洩露,則可以直接登入進使用者的賬號。
具體的攻擊步驟:

  • 1.使用者登入
  • 2.攻擊者欺騙使用者訪問帶XSS payload的URL
  • 3.使用者請求攻擊者的URL
  • 4.在使用者瀏覽器執行遠端js,將cookie傳送給攻擊者
  • 5.攻擊者利用cookie進入使用者賬號

透過param變數注入xss payload,xss payload載入遠端指令碼。

指令碼中將cookie傳送到遠端伺服器。後續也可以在遠端伺服器的web日誌中檢視到。

在不確定是否存在XSS注入點時,避免Cookie劫持的方法:
1.給關鍵的Cookie植入Httponly標識;2.Cookie與客戶端IP繫結。
驗證給Cookie植入Httponly標識的效果:

2.構造GET與POST請求

透過js,讓瀏覽器發起GET、POST請求,完成各種操作。

構造GET請求:透過插入圖片,圖片的src為GET請求的URL。

構造POST請求:1.構造form表單,並提交;

2.透過XMLHttpRequest傳送POST請求。

3.釣魚

透過param變數注入xss payload,xss payload載入遠端指令碼。

指令碼中構造一個登入框,表單提交時將賬號密碼傳送到攻擊者伺服器上。

4.識別瀏覽器及外掛

資訊收集使用者的瀏覽器版本資訊,擴大攻擊面。透過js讀取瀏覽器的userAgent物件識別瀏覽器版本,查詢navigator.plugins物件獲取外掛資訊。

由於漏洞環境的限制,包括識別使用者安裝軟體、檢視使用者訪問網站、獲取使用者真實IP、蠕蟲等利用方式不做復現。XSS構造和繞過的技巧也不做說明。可自行查詢做了解。

四、XSS的防禦

防禦XSS攻擊的方案,主要有兩種,1.輸入檢查;2.輸出檢查。
輸入檢查:對傳入引數進行格式校驗,並對特殊字元進行過濾或轉義。由於輸入資料的使用場景不同,過濾或轉義可能會影響實際的業務使用。同時XSS攻擊發生的位置並不是引數傳入的位置,可能存在遺漏。
輸出檢查:對返回給瀏覽器的輸出結果進行HTML實體化編碼。對JavaScript輸出的使用者可控資料進行轉義。
此外還可以使用Vue、Angular、React等前端開發框架自帶的XSS防禦機制。

DOM型XSS的防禦需要注意,觸發點可能不止一個,需要對每個位置都做編碼處理。
在script標籤中產生xss:

在document.write輸出到html頁面產生xss:

五、Self XSS

Self XSS指的是使用者自己輸入XSS payload,且輸出僅自己可見的XSS問題,通常單獨的Self XSS是不可利用的,但透過CSRF(跨站請求偽造)、點選劫持等組合攻擊就可能把Self XSS利用起來。所以即使是Self XSS也建議做好修復,避免被組合利用造成危害。

對程式碼感興趣的,關注公眾號“吳花果的吳花火”,輸入”xss“獲取xss例項程式碼的下載連結。

相關文章