本章概述#
要成為 web 安全專家,必須紮實理解網際網路底層的技術與協定。本章介紹 Internet Protocol Suite,說明電腦如何透過網路交換資料,並涵蓋 stateful connections 與 encryption 等現代 web 的關鍵元素。
The Internet Protocol Suite#
- 網際網路早期的資料交換並不可靠 — ARPANET 傳送的第一個
LOGIN指令只送出了前兩個字母就當機了 - 為解決可靠性問題,工程師開發了 Transmission Control Protocol (TCP)
- TCP 是約 20 個網路協定的集合(統稱 internet protocol suite)之一
TCP 的運作方式#
- 發送端將訊息拆分為 data packets,每個封包帶有目的地位址
- 網路中的電腦將封包逐步推向目的地,無需處理完整訊息
- 接收端根據每個封包上的 sequence number 重新組裝訊息
- 每收到一個封包就回傳收據;若未收到收據,發送端會重發該封包(可能走不同路徑)
TCP 的改進#
- 封包現在附帶 checksum,讓接收端偵測資料損壞並要求重發
- 發送端會根據接收端的處理速度調整傳輸速率,避免壓垮對方
TCP 因其可靠的傳輸保證至今仍是最常用的協定。另一個較新的協定 UDP (User Datagram Protocol) 則允許封包被丟棄,以維持穩定的串流速率,常用於影片直播等場景。
Internet Protocol Addresses#
- 網路上的封包被發送到 IP address — 分配給每台連網電腦的唯一數字
- ICANN 將 IP 位址區塊分配給區域管理機構,再分配給 ISP 和主機商
- 當你上網時,ISP 會分配一個 IP 位址給你的電腦,通常固定數月後會輪換
IPv4 與 IPv6#
- IPv4:二進位數字格式,可容納 2^32(約 43 億)個位址,例如
8.8.8.8 - IPv6:使用八組四位十六進位數字,以冒號分隔,例如
2001:0db8:0000:0042:0000:8a2e:0370:7334 - 由於 IPv4 位址即將耗盡,網際網路正逐步轉向 IPv6
The Domain Name System (DNS)#
- DNS 是一個全球目錄,將人類可讀的 domain name(如
example.com)轉譯為 IP 位址(如93.184.216.119) - Domain name 必須向 domain registrar 註冊,且名稱是唯一的
- 瀏覽器首次遇到一個 domain 時,會透過本地 domain name server(通常由 ISP 提供)查詢,並快取結果
DNS 快取與安全風險#
- 快取存活時間由 TTL (time-to-live) 變數控制
- 新 domain 或 domain 變更需要時間在網路中傳播
- DNS 快取機制衍生出 DNS poisoning 攻擊 — 攻擊者故意污染本地 DNS 快取,將流量導向惡意伺服器
DNS 記錄類型#
- CNAME records:domain 別名,允許多個 domain name 指向同一 IP
- MX (mail exchange) records:用於路由電子郵件
Application Layer Protocols#
Internet protocol suite 分為多層:
- Network layer:ARP、MAC、NDP、OSPF、PPP
- Internet layer:IPv4、IPv6
- Transport layer:TCP、UDP
- Application layer:DNS、FTP、HTTP、IMAP、POP、SMTP、SSH、XMPP
底層協定提供基本的資料路由,高層協定則為應用程式提供更多結構化的資料交換方式。常見的 application layer protocol 包括:
- SMTP — 電子郵件
- XMPP — 即時通訊
- FTP — 檔案傳輸
- HTTP — 網頁傳輸(本書的重點)
HyperText Transfer Protocol (HTTP)#
HTTP 用於將網頁及其資源傳輸給 user agent(如瀏覽器)。在一次 HTTP 對話中,user agent 發送 request,web server 回傳 response。
本書描述的所有 exploit 都以某種方式使用 HTTP,因此深入了解 HTTP request 與 response 的運作方式非常重要。
HTTP Requests#
一個 HTTP request 包含以下元素:
- Method(也稱 verb):描述要執行的動作
- URL (Universal Resource Locator):描述要操作的資源
- Headers:提供 metadata,如內容類型、接受的壓縮格式等
- Body:可選,包含需要送到 server 的額外資料
GET http://example.com/
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6)
Accept: text/html,application/xhtml+xml,application/xml; */*
Accept-Encoding: gzip, deflate
Accept-Language: en-GB,en-US;q=0.9,en;q=0.8常見 HTTP Methods#
- GET:最常見的請求類型,用於取得資源(網頁、圖片、搜尋結果等)
- POST:將資料送到 server(例如提交表單)
- PUT / PATCH / DELETE:上傳、編輯或刪除 server 上的資源,通常由 JavaScript 觸發
使用 GET request 來傳送資料到 server 是常見的安全錯誤,這會讓網站容易受到 cross-site request forgery 攻擊。應使用 POST request。
其他 HTTP Methods#
| Method | 說明 |
|---|---|
HEAD | 與 GET 類似但 response 不含 body |
CONNECT | 建立雙向通訊,用於通過 proxy 連線 |
OPTIONS | 查詢資源支援哪些 method |
TRACE | 回傳原始 request 的完整副本,建議關閉以避免被惡意 JavaScript 利用 |
HTTP Responses#
HTTP response 包含:
- Protocol description(如
HTTP/1.1) - Status code(三位數字代碼)
- Status message(如
OK) - Headers(如
Content-Type、Cache-Control) - Body(通常是 HTML、CSS、JavaScript 或二進位資料)
HTTP Status Codes#
| 範圍 | 意義 |
|---|---|
| 2xx | 請求被理解、接受並回應 |
| 3xx | 重導向到不同的 URL |
| 4xx | 客戶端錯誤(如 404 Not Found) |
| 5xx | 伺服器錯誤(請求有效但 server 無法完成) |
Stateful Connections#
- HTTP 本身不區分來自不同 user agent 的請求 — 它是 stateless 的
- 現代網站需要追蹤使用者的登入狀態與活動,因此需要 stateful 的連線
- 當 client 與 server 進行 handshake 後持續交換封包,這就是 stateful connection
HTTP Sessions 與 Cookies#
- 完整的 user agent 與 web server 之間的對話稱為 HTTP session
- 最常見的追蹤方式是 server 在初始 response 中送回
Set-Cookieheader - Cookie 是一小段文字資料,與特定 web domain 關聯
- User agent 在後續的每個 request 中將 cookie 放入
Cookieheader 送回 server - Cookie 的來回傳遞唯一識別了 user agent,建立起 HTTP session
Cookie 中的 session 資訊是駭客的重要目標。若攻擊者竊取了使用者的 cookie,就能冒充該使用者;若成功偽造 cookie,則能假冒任何使用者。各種竊取與偽造 cookie 的手法將在 Chapter 10 詳述。
Encryption#
- 早期的 HTTP request 和 response 以明文傳送,任何攔截封包的人都能讀取內容 — 這種攻擊稱為 man-in-the-middle attack
- 現代 web 使用 encryption(加密)來保護通訊內容
TLS 與 HTTPS#
- Transport Layer Security (TLS) 是一種加密方法,確保隱私與資料完整性
- TLS 保證被攔截的封包無法被解密(除非擁有正確的加密金鑰),且任何竄改都能被偵測到
- 使用 TLS 的 HTTP 對話稱為 HTTPS (HTTP Secure)
- HTTPS 要求 client 和 server 進行 TLS handshake,協商加密方法(cipher)並交換金鑰
- Handshake 完成後,所有後續的 request 和 response 都對外部不可見
Encryption 是保護網站安全的關鍵技術。如何為你的網站啟用加密將在 Chapter 13 詳細說明。
本章總結#
- TCP 在不可靠的網路上實現可靠的通訊
- 每台連網電腦都有 IP address,DNS 提供人類可讀的別名
- HTTP 建立在 TCP 之上,透過 request/response 模式在 user agent 與 web server 之間傳輸資料
- Web server 透過 cookie 建立 stateful connection
- HTTPS 透過 encryption 保護 user agent 與 web server 之間的通訊安全