天天看點

XSS小結

xss總結

XSS是什麼?

XSS全稱跨站腳本(Cross Site Scripting),為不和層疊樣式表(Cascading Style Sheets, CSS)的縮寫混淆,故縮寫為XSS。跨站點腳本(XSS)攻擊是一種注射型攻擊,攻擊者在可信的網頁中嵌入惡意代碼,使用者通路可信網頁時觸發XSS而被攻擊。

XSS會造成那些危害?

攻擊者通過Web應用程式發送惡意代碼,一般以浏覽器腳本的形式發送給不同的終端使用者。當一個Web程式的使用者輸入點沒有進行校驗和編碼,将很容易的導緻XSS。

  • 網絡釣魚,包括擷取各類使用者賬号;
       竊取使用者cookies資料,進而擷取使用者隐私資訊,或利用使用者身份進一步對網站執行操作;
       劫持使用者(浏覽器)會話,進而執行任意操作,例如非法轉賬、強制發表日志、電子郵件等;
       強制彈出廣告頁面、刷流量等;
       網頁挂馬;
       進行惡意操作,如任意篡改頁面資訊、删除文章等;
       進行大量的用戶端攻擊,如ddos等;
       擷取用戶端資訊,如使用者的浏覽曆史、真實ip、開放端口等;
       控制受害者機器向其他網站發起攻擊;
       結合其他漏洞,如csrf,實施進一步危害;
       提升使用者權限,包括進一步滲透網站;
       傳播跨站腳本蠕蟲等
               

XSS是如何産生的

通過在使用者端注入惡意的可執行腳本,若伺服器對使用者的輸入不進行處理或處理不嚴,則浏覽器就會直接執行使用者注入的腳本。

XSS常見出現漏洞的地方

  • 資料互動的地方
       get、post、cookies、headers
       回報與浏覽
       富文本編輯器
       各類标簽插入和自定義
               
  • 資料輸出的地方
       使用者資料
       關鍵詞、标簽、說明
       檔案上傳
               

XSS的分類

• 反射性XSS

• 存儲型XSS

• DOM型XSS

反射性XSS:又稱非持久型XSS,這種攻擊方式往往具有一次性,隻在使用者單擊時觸發。

常見注入點

網站的搜尋欄、使用者登入入口、輸入表單等地方,常用來竊取用戶端cookies或釣魚欺騙。

攻擊方式

攻擊者通過電子郵件等方式将包含XSS代碼的惡意連結發送給目标使用者。當目标使用者通路該連結時,伺服器接受該目标使用者的請求并進行處理,然後伺服器把帶有XSS的代碼發送給目标使用者的浏覽器,浏覽器解析這段帶有XSS代碼的惡意腳本後,就會觸發XSS漏洞。

存儲型XSS

又稱持久型XSS,比反射型XSS更具有威脅性,并且可能影響到Web伺服器自身的安全。攻擊腳本将被永久的存放在目标伺服器的資料庫或檔案中。

常見注入點

論壇、部落格、留言闆、網站的留言、評論、日志等互動處。

攻擊方式

攻擊者在發帖或留言的過程中,将惡意腳本連同正常資訊一起注入到釋出内容中。随着釋出内容被伺服器存儲下來,惡意腳本也将永久的存放到伺服器的後端存儲器中。當其他使用者浏覽這個被注入了惡意腳本的文章時,惡意腳本就會在使用者的浏覽器中得到執行。

DOM型XSS

DOM(Document object model),使用DOM能夠使程式和腳本能夠動态通路和更新文檔的内容、結構和樣式。

DOM型XSS其實是一種特殊類型的反射型XSS,它是基于DOM文檔對象的一種漏洞。DOM型XSS是基于js上的。不需要與伺服器進行互動。

注入點

通過js腳本對對文檔對象進行編輯,進而修改頁面的元素。也就是說,用戶端的腳本程式可以DOM動态修改頁面的内容,從用戶端擷取DOM中的資料并在本地執行。由于DOM是在用戶端修改節點的,是以基于DOM型的XSS漏洞不需要與伺服器d端互動,它隻發生在用戶端處理資料的階段。

攻擊方式

使用者請求一個經過專門設計的URL,它由攻擊者提供,而且其中包含XSS代碼。伺服器的響應不會以任何形式包含攻擊者的腳本,當使用者的浏覽器處理這個響應時,DOM對象就會處理XSS代碼,導緻存在XSS漏洞。

常見标簽

JS編碼

JS提供了四種字元編碼的政策,

• 三個八進制數字,如果數字不夠,在前面補零,如a的編碼為\141

• 兩個十六進制數字,如果數字不夠,在前面補零,如a的編碼為\x61

• 四個十六進制數字,如果數字不夠,在前面補零,如a的編碼為\u0061

• 對于一些控制字元,使用特殊的C類型的轉義風格,如\n和\r

HTML實體編碼

命名實體

以&開頭,以分号結尾的,如<的編碼為&1t;

字元編碼

十進制,十六進制的ASCII碼或者Unicode字元編碼。樣式為&#數值;

如<的編碼為

< (10進制)

< (16進制)

URL編碼

這裡為url全編碼,也就是兩次url編碼

如alert的url全編碼為%25%36%31%25%36%63%25%36%35%25%37%32%25%37%34

String.fromCharCode編碼

如alert的編碼為String.fromCharCode(97,108,101,114,116)

XSS的防禦

使用XSS Filter

輸入過濾

輸入驗證

對使用者送出的資料進行有效驗證,僅接受指定長度範圍内的,采用适當格式的内容送出,阻止或者忽略除此以外的其他任何資料。

常見的檢測或過濾:

• 輸入是否僅僅包含合法的字元

• 輸入字元串是否超過最大長度的限制

• 輸入如果為數字,數字是否在指定的範圍内

• 輸入是否符合特定的格式要求,如郵箱、電話号碼、ip位址等

資料消毒:

除了在用戶端驗證資料的合法性,輸入過濾中最重要的還是過濾和淨化有害的輸入,例如如下常見的敏感字元:

|| < > ’ " & # javascript expression