在進入各類漏洞之前,本章先補齊兩塊地基:「漏洞與賞金的定義」,以及**「網際網路與 HTTP 的基本運作」**。後續每一章的攻擊手法,都會在這兩塊地基上開展。

漏洞與 Bug Bounty 的定義#

什麼是漏洞(Vulnerability)#

漏洞是應用程式的弱點,使惡意人士能夠執行未授權的動作,或取得本不該存取的資訊。

關鍵概念:

  • 漏洞可能來自預期之內的行為被誤用,也可能來自預期之外的行為
  • 例如:修改 URL 中的 ID 來存取他人的資料屬於「非預期動作」
  • 又例如:社群網站允許任何人未經同意把你加為好友,使原本「只給好友」的個資變相公開——這是「設計層」的漏洞

測試應用時,永遠思考「現有功能還能怎麼被濫用?」

什麼是 Bug Bounty 計畫#

  • Bug Bounty:網站或公司給予合法回報漏洞者的獎勵
  • 獎勵可能是金錢(數十到數萬美元)、加密貨幣、里程、點數或服務抵用金
  • 推出 Bug Bounty 的公司會建立一個 Program,明訂測試規則與獎勵框架
  • 與之相對的是 VDP(Vulnerability Disclosure Program):只接收漏洞回報但不付錢,可能僅以紀念品(swag)回饋

本書收錄的案例都來自 Bug Bounty 計畫,但不是每個案例都拿到獎金——有些回報沒被接受、有些公司只發獎品。

用戶端與伺服器(Client / Server)#

網際網路是「電腦互傳訊息」的網路。每台電腦都有一個位址,傳送的單位稱為封包(packet),封包包含資料本身與來源/目的資訊。

角色定義
Client(用戶端)發起請求的電腦——瀏覽器、命令列、行動 App 都算
Server(伺服器)接收請求並回應的網站或應用程式

要讓兩端能聽懂彼此,需要通訊規範(RFC)

  • HTTP(Hypertext Transfer Protocol):定義瀏覽器與伺服器之間如何溝通
  • IP(Internet Protocol):定義封包如何在網路間遞送
  • 雙方必須遵循同樣的協定,才能正確解讀傳遞的封包

拜訪一個網站發生了什麼#

以輸入 http://www.google.com/ 為例,從按下 Enter 到頁面渲染,瀏覽器經歷六個步驟。

Step 1:抽出網域名稱(Domain Name)#

  • 瀏覽器先從 URL 抽出網域,例如 www.google.com
  • 網域命名規則由 RFC 定義(一般限定為英數字與底線;國際化網域名稱另有 RFC 3490 規範)

Step 2:解析 IP 位址#

每個網域必須對應一個 IP 才能連線:

  • IPv4:四組 0-255 數字以 . 連接,例如 8.8.8.8
  • IPv6:八組四位十六進位以 : 連接,例如 2001:4860:4860::8888(縮寫形式)

DNS(Domain Name System)伺服器負責把網域對應到 IP。可以用 dig A example.com 從終端機查詢。

Step 3:建立 TCP 連線#

  • 瀏覽器與目標 IP 建立 TCP(Transmission Control Protocol) 連線
  • TCP 提供雙向通訊,確保資料完整不遺失
  • 連到哪個**埠(Port)**很關鍵:
    • Port 80:HTTP(未加密)
    • Port 443:HTTPS(加密)
    • 實際上 TCP 可以在任何埠運作,端看伺服器設定

想手動建立 TCP 連線觀察協定?可在終端機輸入 nc <IP> 80 使用 Netcat。

Step 4:發送 HTTP 請求#

連線成功後,瀏覽器會送出類似這樣的請求:

GET / HTTP/1.1
Host: www.google.com
Connection: keep-alive
Accept: application/html, */*
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) ...

各欄位的意義:

  • Method + Path + VersionGET / 表示要拿首頁,使用 HTTP/1.1
  • Host:因為一個 IP 可能掛多個網域,必須指明要哪一個
  • Connection: keep-alive:要求保留連線,避免反覆建連
  • Accept:可接受的回應格式,常見有 application/htmlapplication/jsonapplication/octet-streamtext/plain
  • User-Agent:發送請求的軟體識別

Step 5:伺服器回應#

伺服器可能回應:

HTTP/1.1 200 OK
Content-Type: text/html

<html>
  <head>
    <title>Google.com</title>
  </head>
  <body>
    --snip--
  </body>
</html>

狀態碼(Status Code) 三位數的開頭代表大類:

  • 2xx:成功(如 200 OK)
  • 3xx:重新導向(如 301 永久、302 暫時,需要看 Location 標頭再次發出請求)
  • 4xx:用戶端錯誤(如 403 Forbidden)
  • 5xx:伺服器錯誤(如 503 Service Unavailable)

狀態碼沒有強制對應規則,部分應用即使內部錯誤仍回 200——觀察 body 內容才能確認真實狀況。

Content-Type 告訴瀏覽器如何解讀 body:

  • 但瀏覽器可能會做 MIME sniffing,自行讀前幾個位元判斷格式
  • 加上 X-Content-Type-Options: nosniff 可關閉此行為,避免被誤判成可執行內容

Step 6:渲染回應#

當瀏覽器收到 text/html 的成功回應後:

  • HTML:構成頁面骨架
  • CSS:定義樣式與排版
  • JavaScript:提供動態行為與媒體互動

頁面內可能引用外部 CSS、JS、圖片,瀏覽器會發出多個 HTTP 請求並逐步渲染——這也是不少漏洞利用的切入點。

JavaScript 與 DOM#

  • JavaScript 是所有主流瀏覽器都支援的指令式語言,能更新內容、檢查表單、回應事件
  • 它能存取多種瀏覽器 API,最重要的是 DOM(Document Object Model,文件物件模型)
  • DOM 允許 JavaScript 操作頁面的 HTML 與 CSS

如果攻擊者能在你的網站上執行自己的 JavaScript,就掌握了 DOM——可以代替使用者執行任何頁面動作。這是第 7 章 XSS 的核心威脅。

HTTP 請求方法(Request Methods)#

請求方法表達用戶端想做什麼、期待什麼樣的成功結果。HTTP 標準定義了八種:GETHEADPOSTPUTDELETETRACECONNECTOPTIONSPATCH 曾被提案但較少實作)。

撰寫時點,瀏覽器透過 HTML 表單只會送出 GETPOSTPUTPATCHDELETE 都得靠 JavaScript 觸發。後續章節討論漏洞時這個細節會很重要。

各方法的用途:

  • GET:取得指定 URI 對應的資料,不應修改伺服器狀態
    • 點擊任何網址(除非由 JS 觸發)都是 GET
    • 這是 CSRF(第 4 章)與 Open Redirect(第 2 章)的基礎
  • HEAD:與 GET 相同但伺服器不回 body
  • POST:呼叫伺服器某個會改變狀態的行為(建立評論、註冊、刪除帳號等),結果由伺服器自行決定
  • PUT:更新已存在的資源(如修改帳號或文章)
  • DELETE:要求伺服器刪除指定資源
  • TRACE:把請求原樣回送給呼叫者,用於診斷
  • CONNECT:透過 Proxy 建立雙向通訊(例如以 Proxy 連到 HTTPS 網站)
  • OPTIONS:詢問伺服器支援哪些方法。瀏覽器在某些 Content-Type(如 application/json)下會自動發出 Preflight OPTIONS——這是 CSRF 防護的一環,第 4 章會深入討論

URI 與 URL 在本書中會視為同義詞使用。技術上 URL 是 URI 的子集(多了「如何定位」的網路位置),但日常使用兩者常被混用。

HTTP 是無狀態的(Stateless)#

HTTP 的關鍵特性:

  • 每個請求都被當成全新請求處理
  • 伺服器不記得它與你瀏覽器的歷史對話
  • 處理請求所需的全部資料,都必須隨每次請求重新送出

想像你和我每說一句話前都得自我介紹一次:「我是 Peter Yaworski,我們剛在聊駭客」——這就是 stateless 的感覺。電影《我的失憶女友》(50 First Dates)裡 Adam Sandler 為失憶的 Drew Barrymore 每天重新介紹一次,也是同樣的概念。

為了避免每次都重新登入,網站採用:

  • Cookie:伺服器發給瀏覽器的小段資料,後續請求自動帶上
  • Basic Authentication:在 HTTP 標頭夾帶帳密(編碼)

第 4 章會深入這兩者,並討論其漏洞。

駭客過程中常會遇到 base64 編碼的內容,務必養成「看到就先解碼」的習慣。Google「base64 decode」就能找到許多現成工具。

章末總結#

  • 漏洞=有人能在系統中執行不該被允許的動作或取得不該存取的資訊
  • Bug Bounty=合法揭露漏洞所獲得的獎勵;與只接受回報但不付錢的 VDP 不同
  • 一個網頁的載入流程可拆成「抽網域 → 解析 IP → 建立 TCP → 送 HTTP 請求 → 收回應 → 渲染」六步
  • HTTP 方法(GET/POST/PUT/DELETE 等)的語意差異,決定了不同漏洞的攻擊面(CSRF、Open Redirect、CORS Preflight 等)
  • HTTP 是 stateless,因此網站需要 Cookie 或 Basic Auth 來保持登入狀態,這也是後續驗證漏洞的根基