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實現跨域請求的原理簡單的說,就是動態創建