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