天天看點

跨站腳本×××(XSS)

跨站腳本×××(XSS)是用戶端腳本安全中的頭号大敵。OWASP TOP 10 威脅多次把 XSS 列在榜首。

1.XSS 簡介

  跨站腳本×××(Cross Site Script),本來縮寫是CSS,但是為了和層疊樣式表(Cascading Style Sheet,CSS)有所差別,是以在安全領域叫做 “ XSS ”。

  XSS ×××,通常指×××通過 “HTML 注入” 篡改了網頁,插入了惡意的腳本,進而在使用者浏覽網頁時,控制使用者浏覽器的一種×××。在一開始,這種×××的示範案例是跨域的,是以叫做 “ 跨站腳本 ”。現今,由于 Javascript 的強大功能以及網站前端用的複雜化,是否跨域已經不再重要。但是由于曆史原因,XSS 這個名字卻一直保留下來。

2. 自己搭建個 DVWA   (由于個别原因,這次就寫反射型 XSS)

 反射型 XSS

 面對四種級别的代碼進行分析。

 LOW

 伺服器端核心代碼

可以看到,代碼直接引用了name參數,并沒有任何的過濾與檢查,存在明顯的XSS漏洞。

漏洞利用

輸入<script>alert(/XSS/)</script>,成功彈框:

跨站腳本×××(XSS)

Medium

伺服器端核心代碼

可以看到,這裡對輸入進行了過濾,基于黑名單的思想,使用str_replace函數将輸入中的<script>删除,這種防護機制是可以被輕松繞過的。

1.雙寫繞過

輸入 <sc<script>ript>alert(/xss/)</script>,成功彈框:

跨站腳本×××(XSS)

2.大小寫混淆繞過

輸入<ScRipt>alert(/xss/)</script>,成功彈框:

跨站腳本×××(XSS)

High

可以看到,High級别的代碼同樣使用黑名單過濾輸入,preg_replace()函數用于正規表達式的搜尋和替換,這使得雙寫繞過、大小寫混淆繞過(正規表達式中i表示不區分大小寫)不再有效。

雖然無法使用<script>标簽注入XSS代碼,但是可以通過img、body等标簽的事件或者iframe等标簽的src注入惡意的js代碼。

輸入<img src=1 onerror=alert(/xss/)>,成功彈框:

跨站腳本×××(XSS)

Impossible

可以看到,Impossible級别的代碼使用htmlspecialchars函數把預定義的字元&、”、 ’、<、>轉換為HTML實體,防止浏覽器将其作為HTML元素。

繼續閱讀