XSS攻擊筆記(上)
博客園的文章字數有上線還是咋的,我發的文章只有前半段,實戰部分沒顯示出來;注意看我博客的下半部分(實戰部分)
XSS攻擊
XSS概述
XSS即跨站腳本攻擊,(Cross-Site Scripting, CSS),但是為了與層疊樣式表(Cascading Style Sheets, CSS)縮寫區分開來,所以命名為XSS。
XSS是一種代碼注入攻擊,攻擊者可以在可信網頁中注入惡意腳本代碼,當用戶訪問可信網頁時觸發惡意腳本而被攻擊。攻擊對象由服務器變為用戶。
在一開始,這種攻擊是為了達成跨域的,所以叫做「跨站腳本」.但是發展到今天,由於 JavaScript的強大功能以及網站前端應用的複雜化,xss的中心已經不放在跨域上,但跨域腳本攻擊的說法一直保留了下來。
什麼是跨域請求?
顧名思義,就是一個站點中的資源去訪問另外一個不同域名站點上的資源。網站中 style 標籤加載外部樣式表文件、通 過img 標籤加載外部圖片、通過 script 標籤加載外部腳本文件、通過 Webfont 加載字體文件等等都是跨域請求。
Cookie是什麼?
Cookie是能夠讓網站服務器把少量文本數據存儲到客戶端的一種技術。
因為http協議是無狀態的,web服務器無法區分請求的來源。所以web服務器需要額外的數據用於維護會話。Cookie隨http請求、響應一起被傳遞。服務端通過set-Cookie向客戶端發送需要被設置的cookie ,客戶端通過Cookie頭向服務器傳遞Cookie。他的主要作用是標識用戶、維持會話。
Cookie按照在客戶端中存儲的位置,可分為內存cookie和硬盤cookie。內存cookie由瀏覽器維護,保存在內存中,瀏覽器關閉後就消失了,其存在的時間事短暫的。硬盤cookie保存在硬盤中,有一個過期的時間,除非用戶手工清理或者到了過期的時間,否則硬盤中的cookie不會被刪除,其存在時間是長期的。 所以,cookie也分持久cookie和非持久cookie。
註:JavaScript中使用document.cookie
調用當前頁面的cookie;
Set-Cookie: name=cl4y; expires=Wed, 13-Mar-2019 12:08:53 GMT; Max-Age=31536000; path=/; domain=fafa.com;secure; HttpOnly;
解釋:
name=cl4y; cookie值
expires=Wed, 13-Mar-2019 12:08:53 GMT; cookie過期時間
path=/; 發送範圍的文件目錄
domain=fafa.com; 發送範圍的域名
secure 規定協議為https
HttpOnly JavaScript 腳本無法獲得Cookie
Session是什麼?
當程序需要為某個客戶端的請求創建一個session時,服務器首先檢查這個客戶端的請求里是否已包含了一個session標識(稱為SessionID),如果已包含則說明以前已經為此客戶端創建過session,服務器就按照SessionID把這個session檢索出來使用;如果客戶端請求不包含SessionID,則為此客戶端創建一個session並且生成一個與此session相關聯的SessionID,這個SessionID將會在本次響應中返回給客戶端保存。
Cookie與Session的共性
- 標識用戶、維持會話。
Cookie與Session的區別
-
cookie是存在客戶端的,過去與否可以在cookie生成的時候設置進去,session是放在服務器上的,過期與否取決於服務期的設定。
-
cookie不是很安全,別人可以分析存放在本地的COOKIE並進行COOKIE欺騙,如果主要考慮到安全應當使用session
-
cookie在客戶端的限制是3K
-
session保存在服務端會佔用性能,如果主要考慮到減輕服務器性能方面,應當使用COOKIE
同源策略
同源策略限制了不同源之間如何進行資源交互,是用於隔離潛在惡意文件的重要安全機制。 是否同源由URL決定,URL由協議、域名、端口和路徑組成,如果兩個URL的協議、域名和端口相同,則表示他們同源。此策略可防止某個網頁上的惡意腳本通過該頁面的文檔對象模型(DOM)訪問另一網頁上的敏感數據。
file同源
-
域名或IP地址
-
子域名
-
端口
-
協議
Cookie同源
不管使用哪個協議(HTTP/HTTPS)或端口號,瀏覽器都允許給定的域以及其任何子域名訪問cookie。設置 cookie時,可以使用 domain / path / secure 和 http-only 標記來限定其訪問性。
所以 //localhost:8080/ 和 //localhost:8081/ 的Cookie是共享的。
跨域訪問
可跨域的標籤:
<script> <script src="..."></script> 標籤嵌入跨域腳本。
<link> <link rel="stylesheet" href="..."> 標籤嵌入CSS。
<img> / <video> / <audio> <img src="..."> 嵌入多媒體資源。
<frame> <iframe> <iframe src="..."> 載入的任何資源。
<object> <embed> <applet> <object data="...」> 載入插件
@font-face font-face - CSS 引入的字體。
… 所有具有src屬性的HTML標籤都是可以跨域的
其他跨域方法
JSONP 利用<script>可以跨域的原理,而且在跨域腳本中可以直接回調當前腳本的函數
CORS 服務器設置Access-Control-Allow-Origin HTTP響應頭之後,瀏覽器將會允許跨域請求
document.domain 相同主域名不同子域名下的頁面,可以設置document.domain讓它們同域
window.name 一個窗口載入的所有頁面公用一個window.name,且window.name持久存在
window.postMesage 通過監聽message事件來監聽信息,可跨主域名
…
JSONP跨域
-
JSON
- JSON(JavaScript Object Notation) 是一種輕量級的數據交換格式。
- JSON是一個標記符的序列。這套標記符包含六個構造字符、字符串、數字和三個字面名。
- JSON是一個序列化的對象或數組。
{"username": "cl4y", "password" : "admin888" } {'id': 233, 'info':['user': 'admin', 'pass': '8888']} //10.211.55.2/lesson/xss/json.php
-
JSONP
- JSONP 是 JSON with padding(填充式 JSON 或參數式 JSON)的簡寫,它攜帶了json信息與回調函數名。
- JSONP實現跨域請求的原理簡單的說,就是動態創建