xss學習筆記(萌新版)

xss簡介

xss攻擊者構造惡意資訊然後在用戶的瀏覽器上執行,主要分為反射性xss,這種主要是某個頁面存在有漏洞的參數,然後填上惡意參數把整個鏈接發給用戶或者管理員,他們點擊了帶有惡意參數的鏈接就會執行惡意程式碼,可能會造成cookie泄露以及瀏覽器保存的各種重要數據的泄露等,也可能會冒充用戶身份進行非法操作。還有存儲型xss,就是用戶可以自己構造資訊並且會被顯示在頁面上面,比如發表評論就是會被存在資料庫中,然後其他用戶也能看到你發的評論資訊,或者你的個人資訊,也會被保存同時別人也能看到這些資訊,要是沒有對用戶輸入進行過濾或者編碼轉義等操作,那用戶可以構造任意js程式碼並且任何瀏覽這個頁面的用戶都會中招。還有就是dom型xss,這個特點是不會經過網站伺服器,是直接瀏覽器執行惡意的xss程式碼。

 

xss繞過

xss防護的最好辦法就是編碼,你輸入的尖括弧就實體編碼,就基本沒法構造標籤了(特殊情況除外,比如svg標籤外),又或者輸出的值在value等屬性里,那就對引號進行url編碼操作,又或者直接進行白名單過濾,只允許數字字母和短橫線,這些方法都是比較粗暴簡單也是比較安全的,當然在有些業務需求下面並不適用,有的時候會需要輸入特殊符號,那就只能進行嚴格的黑名單過濾,這種的話一定要把所有危險的字元串都過濾掉才行。

有的網站開發者並不清楚自己是否過濾了所有可能的危險字元,就直接使用waf,比如安全狗,當然這也不是完全安全的,存在很多繞過方法,比如雙寫大小寫(實戰基本用不到),使用其他標籤(黑名單不一定能過濾完),以及利用特殊屬性或者事件下的編碼繞過等。比如<object data=”data:text/html;base64,PHNjcmlwdD5hbGVydCgxKTwvc2NyaXB0Pg==”></object>,編碼不是任何地方都能用,因為瀏覽器解析的順序是:html對伺服器相應的二進位數據進行解析產生html源程式碼,然後根據源程式碼產生dom樹,此時實體編碼的數據是無法被識別的(實體編碼防護xss的原理),然後html解析器根據dom樹來進行下一步解析工作,解析<script>等標籤,在處理標籤內部資訊以及src,href等屬性時,若是js偽協議則會出發js解析器進行解析,因此編碼繞過要看內容被輸出的環境來利用。