OWASP ZAP 作為一款開源網頁應用程式安全掃描器,廣泛應用於滲透測試和安全分析。它提供自動掃描和手動探索兩種模式,並內建爬蟲、被動掃描器和主動掃描器等核心功能,能有效識別網頁應用程式中的潛在漏洞。此外,OWASP ZAP 提供 REST API,方便開發者使用 Python 等程式語言進行自動化安全測試和整合。透過 Python 的 python-owasp-zap-v2.4 套件,可以輕鬆操作 ZAP API,執行爬蟲任務、取得掃描結果,並生成 HTML 格式的報告,提升網頁應用程式安全測試的效率和覆寫率。文章也涵蓋了使用 ZAP 進行 AJAX 爬取、被動掃描和主動掃描的實戰技巧,並結合 WriteHat 工具生成專業的滲透測試報告,提供網頁應用程式安全測試的最佳實踐。

深入探索 OWASP ZAP:自動化網頁安全測試利器

身為一位資安研究者,玄貓經常需要評估網頁應用程式的安全性。在眾多工具中,OWASP ZAP(Zed Attack Proxy)以其功能豐富、易於使用和開源特性,成為進行滲透測試和安全分析的首選。本文將探討 OWASP ZAP 的功能,並分享使用 Python 與其 API 互動的經驗。

OWASP ZAP 簡介與安裝

OWASP ZAP 是一款由 OWASP 基金會開發和維護的網頁應用程式掃描器,被譽為全球最常用的網頁應用程式弱點測試工具。它支援 Windows、macOS 和 Linux 作業系統,使用者可以從官方網站下載最新版本。

以 Linux 系統為例,下載壓縮檔後解壓縮即可使用。執行 zap.sh 指令碼即可啟動 OWASP ZAP,但請確保系統已安裝 Java 環境。

./zap.sh

OWASP ZAP 功能與操作

OWASP ZAP 提供了兩種主要的掃描方式:自動掃描和手動探索。

  • 自動掃描: 使用者只需輸入目標網址,ZAP 即可自動執行爬蟲和主動掃描,快速識別潛在的漏洞。
  • 手動探索: 允許使用者以更精細的方式探索網頁應用程式,並根據需要執行特定測試。

ZAP 的核心功能包括:

  1. 爬蟲功能: ZAP 內建傳統爬蟲和 AJAX 爬蟲,可以自動探索網頁應用程式的結構和連結。
  2. 被動掃描器: 被動掃描器會監控 HTTP 請求和回應,識別其中的漏洞,而不會主動發起攻擊。
  3. 主動掃描器: 主動掃描器會模擬攻擊,並分析應用程式的回應,以發現更深層次的漏洞。

使用 Python 與 OWASP ZAP API 互動

除了圖形化介面操作外,OWASP ZAP 還提供了 REST API,方便使用者以程式化的方式執行掃描任務。透過 Python 的 python-owasp-zap-v2.4 套件,可以輕鬆地與 ZAP API 互動。

首先,使用 pip 安裝套件:

pip install python-owasp-zap-v2.4

接著,使用以下程式碼片段示範如何使用 Python 擷取目標網站的內部和外部連結:

import time
from zapv2 import ZAPv2

apiKey = '<YOUR_API_KEY>'  
target = 'http://testphp.vulnweb.com/'
zap = ZAPv2(apikey=apiKey)

print(f'開始爬取目標網站: {target}')
scanID = zap.spider.scan(target)

while int(zap.spider.status(scanID)) < 100:
    print(f'爬取進度: {zap.spider.status(scanID)}%')
    time.sleep(1)

print('爬取完成!')
print('\n'.join(map(str, zap.spider.results(scanID))))

內容解密:

這段程式碼首先初始化了 ZAP API 物件,並設定了 API 金鑰和目標網址。然後,它使用 zap.spider.scan() 方法啟動爬蟲任務,並使用 zap.spider.status() 方法監控爬蟲進度。當爬蟲完成後,使用 zap.spider.results() 方法取得爬取結果,其中包含了網站的內部和外部連結。

視覺化呈現 ZAP 掃描流程

圖表說明:

此流程圖展示了使用 ZAP 爬蟲的基本流程,包含設定目標網址、啟動爬蟲、監控進度和取得結果等步驟。

與漏洞掃描器互動:實戰技巧與策略

在滲透測試過程中,與漏洞掃描器有效互動至關重要。以下將分享一些使用 OWASP ZAP 的實戰技巧和策略,並介紹如何利用 WriteHat 工具生成專業的滲透測試報告。

使用 ZAP 進行 AJAX 爬取

在現代網頁應用中,AJAX 技術被廣泛使用。為了全面爬取這類別網站,建議使用 ZAP 的 ajaxSpider 功能。以下程式碼片段展示瞭如何使用 ajaxSpider:

import time
from zapv2 import ZAPv2

apiKey = '<YOUR_API_KEY>'
target = 'http://testphp.vulnweb.com/'
zap = ZAPv2(apikey=apiKey)

print(f'Ajax Spider target {target}')
scanID = zap.ajaxSpider.scan(target)

timeout = time.time() + 60 * 2

while zap.ajaxSpider.status == 'running':
    if time.time() > timeout:
        break
    print('Ajax Spider status:' + zap.ajaxSpider.status)
    time.sleep(2)

print('Ajax Spider completed')
ajaxResults = zap.ajaxSpider.results(start=0, count=10)
print(ajaxResults)

內容解密:

這段程式碼首先初始化 ZAP 物件,然後使用 zap.ajaxSpider.scan(target) 啟動 AJAX 爬取。為了避免爬取過程無限期執行,設定了一個兩分鐘的逾時。在迴圈中,程式碼會持續檢查爬取狀態,並在完成或逾時後離開。最後,zap.ajaxSpider.results() 函式用於取得爬取結果。

被動掃描:高效發現常見安全問題

完成爬取後,會執行被動掃描。被動掃描僅分析請求和回應,不會主動傳送攻擊流量,因此是一種相對安全的掃描方式。以下程式碼展示瞭如何使用 ZAP 進行被動掃描:

import time
from pprint import pprint
from zapv2 import ZAPv2

print(f'Accessing target {target}')
zap.urlopen(target)
time.sleep(2)

print(f'Spidering target {target}')
scanid = zap.spider.scan(target)
time.sleep(2)

while int(zap.spider.status(scanid)) < 100:
    print(f'Spider progress %: {zap.spider.status(scanid)}')
    time.sleep(2)

while int(zap.pscan.records_to_scan) > 0:
    print(f'Records to passive scan : {zap.pscan.records_to_scan}')
    time.sleep(2)

with open("report.html", "w") as report_file:
    report_file.write(zap.core.htmlreport())

print('Passive Scan completed')
print('Hosts: {}'.format(', '.join(zap.core.hosts)))
print('Alerts: ')
print(zap.core.alerts())

內容解密:

這段程式碼首先存取目標網站,然後啟動傳統爬取。在爬取完成後,程式碼進入被動掃描迴圈,直到所有記錄都被掃描完成。最後,zap.core.htmlreport() 函式生成 HTML 格式的報告。

主動掃描:深度挖掘潛在漏洞

被動掃描之後,會根據情況選擇是否進行主動掃描。主動掃描會模擬各種攻擊,因此可能對目標系統造成影響。以下程式碼展示瞭如何使用 ZAP 進行主動掃描:

import time
from zapv2 import ZAPv2

print(f'Accessing target {target}')
zap.urlopen(target)
time.sleep(2)

print(f'Active Scanning target {target}')
scanID = zap.ascan.scan(target)

while int(zap.ascan.status(scanID)) < 100:
    print(f'Scan progress %: {zap.ascan.status(scanID)}')
    time.sleep(5)

print('Active Scan completed')

with open("report.html", "w") as report_file:
    report_file.write(zap.core.htmlreport())

print('Hosts: {}'.format(', '.join(zap.core.hosts)))
print('Alerts: ')
print(zap.core.alerts(baseurl=target))

內容解密:

這段程式碼與被動掃描類別似,但使用了 zap.ascan.scan(target) 啟動主動掃描。在掃描過程中,程式碼會定期檢查掃描進度,並在完成後生成報告。

WriteHat:開發專業滲透測試報告

WriteHat 是根據 Django 框架的報告工具,可以生成美觀的滲透測試報告。通常使用 Docker 和 docker-compose 來佈署 WriteHat。

綜上所述,透過結合 OWASP ZAP 的強大掃描功能與 Python 的靈活程式設計,可以顯著提升網頁應用程式的安全性。同時,利用 WriteHat 等工具可以有效地整理和呈現滲透測試結果,為安全研究人員和開發者提供有價值的參考。未來在網路安全領域,這些工具和方法將繼續發揮重要作用,幫助我們更好地保護網路環境。透過持續學習和實踐,我們可以不斷提升自己的技能,為開發更安全的數位世界貢獻力量。

網頁應用程式安全測試

本章節將探討網頁應用程式的安全測試,涵蓋伺服器漏洞、跨站指令碼攻擊(XSS)等關鍵主題,並提供實用的測試方法和工具。

網頁應用程式伺服器漏洞分析

伺服器漏洞是網頁應用程式安全的重要考量。常見的漏洞型別包括:

  • 跨站指令碼攻擊(XSS)
  • SQL 注入
  • 跨站請求偽造(CSRF)
  • 敏感資料洩露
  • 未經驗證的重新導向和轉發

XSS 攻擊原理與防範

XSS 攻擊允許攻擊者在使用者瀏覽器中執行惡意指令碼,可能導致會話劫持、資料竊取等後果。XSS 主要分為三種型別:

  1. 持續型 XSS:惡意程式碼儲存在伺服器端,影響所有存取該頁面的使用者。
  2. 反射型 XSS:惡意程式碼透過 URL 傳遞,僅影響點選特定連結的使用者。
  3. DOM 型 XSS:惡意程式碼在客戶端執行,與伺服器端無關。

防範 XSS 攻擊的關鍵在於對使用者輸入進行嚴格的驗證和過濾。

使用 Python 進行 XSS 漏洞測試

以下是一個使用 Python 進行 XSS 漏洞測試的範例程式碼:

import requests
from bs4 import BeautifulSoup as bs
from urllib.parse import urljoin

def get_all_forms(url):
    """取得網頁中的所有表單"""
    soup = bs(requests.get(url).content, "html.parser")
    return soup.find_all("form")

def test_xss_vulnerability(url):
    """測試網頁是否存在 XSS 漏洞"""
    forms = get_all_forms(url)
    for form in forms:
        # 提交表單並檢查回應中是否包含惡意指令碼
        pass  # 此處省略具體實作細節

# 使用範例
url = "https://example.com/vulnerable-page"
test_xss_vulnerability(url)

SQL 注入漏洞測試

SQL 注入是一種常見的資料函式庫攻擊手段,攻擊者透過在輸入欄位中注入惡意 SQL 程式碼,可能導致資料洩露或資料函式庫被破壞。

使用 sqlmap 進行 SQL 注入測試

sqlmap 是一款強大的開源 SQL 注入測試工具,支援多種資料函式庫型別。以下是使用 sqlmap 進行 SQL 注入測試的基本步驟:

  1. 安裝 sqlmap:sudo apt-get install sqlmap
  2. 使用 sqlmap 掃描目標網址:sqlmap -u "https://example.com/vulnerable-page?id=1"

網頁應用程式安全測試最佳實踐

  1. 定期進行安全掃描:使用 OWASP ZAP、sqlmap 等工具定期掃描網頁應用程式中的漏洞。
  2. 加強輸入驗證:對使用者輸入進行嚴格的驗證和過濾,防止 XSS 和 SQL 注入等攻擊。
  3. 實施內容安全策略(CSP):CSP 可以有效防止 XSS 攻擊。
  4. 保持軟體更新:及時更新網頁應用程式所使用的軟體和函式庫,修補已知的安全漏洞。

透過遵循上述和最佳實踐,可以顯著提高網頁應用程式的安全性,保護使用者資料和隱私。

解析 Tomcat 伺服器應用程式的弱點

在這個部分,我們將探討如何找出 Tomcat 伺服器應用程式中的弱點,包含安裝 Tomcat 伺服器以及使用 ApacheTomcatScanner 工具進行安全性測試。

Tomcat 伺服器的安裝與設定

Apache Tomcat 是一個 Servlet 容器,作為 Java Servlet 和 Java Server Pages (JSP) 技術的參考實作。首先,確認系統已安裝 Java:

java -version

內容解密:

這個命令檢查系統中是否已安裝 Java 並顯示其版本。如果未安裝,需要先下載並安裝適當的 JDK 版本。

接下來,從官方網站下載並安裝 Tomcat:

wget https://downloads.apache.org/tomcat/tomcat-9/v9.0.41/bin/apache-tomcat-9.0.41.tar.gz
tar -xvf apache-tomcat-9.0.41.tar.gz
cd apache-tomcat-9.0.41/bin
./startup.sh

內容解密:

這些命令下載、解壓縮並啟動 Tomcat 伺服器。startup.sh 指令啟動 Tomcat 例項,預設情況下它會監聽 8080 連線埠。

使用 ApacheTomcatScanner 進行安全性測試

ApacheTomcatScanner 是一個用於掃描 Tomcat 伺服器弱點的 Python 工具。它可以幫助識別潛在的安全問題,例如預設憑證、未授權存取和管理介面漏洞。

使用以下命令執行 ApacheTomcatScanner:

python ApacheTomcatScanner.py -H localhost -P 8080

內容解密:

這個命令對執行在 localhost:8080 的 Tomcat 伺服器進行掃描。掃描結果將顯示任何已發現的弱點和建議的修復措施。

弱點分析與修復

掃描完成後,分析報告中的發現並根據建議進行必要的修復。常見的弱點包括:

  1. 預設管理員憑證:更改預設的管理員使用者名稱和密碼。
  2. 未授權存取:限制對管理介面的存取,僅允許特定的 IP 位址。
  3. 過時的軟體版本:定期更新 Tomcat 和相關元件到最新的安全版本。

流程解密:

這個流程圖展示了使用 ApacheTomcatScanner 對 Tomcat 伺服器進行安全性測試的步驟,從啟動伺服器到修復發現的弱點並重新掃描驗證。

從安全掃描到 CVE 分析:強化 Tomcat 伺服器防護

在前面的章節中,我們探討瞭如何安裝和初步測試 Apache Tomcat 伺服器的安全性。本章節將進一步深入,討論如何利用 Censys 搜尋引擎等工具來識別潛在的安全威脅,並詳細分析相關的 CVE 弱點,以提升 Tomcat 伺服器的整體安全性。

利用 Censys 搜尋引擎進行弱點檢測

Censys 是一個強大的搜尋引擎,能夠掃描網際網路上的裝置和服務,包括像 Apache Tomcat 這樣的伺服器。透過 Censys,我們可以快速識別出可能存在安全風險的 Tomcat 伺服器。

首先,存取 Censys 網站並使用以下查詢語法來搜尋公開暴露的 Tomcat 伺服器:

services.service_name: "http" and services.software.product: "Apache Tomcat"

這條查詢陳述式將傳回所有正在執行 Apache Tomcat 的 HTTP 服務。進一步地,您可以結合其他篩選條件,例如特定的版本號,以找出潛在的弱點伺服器。

詳細分析 CVE 弱點

一旦識別出潛在的弱點伺服器,下一步是分析與這些伺服器版本相關的 CVE(通用漏洞和暴露)資訊。CVE 資料函式庫是一個全面收集已知安全弱點的資源。透過查詢 CVE 資料函式庫,我們可以獲得有關特定弱點的詳細資訊,包括其影響、利用方式和修復建議。

例如,考慮 CVE-2022-45143 弱點,這是一個影響多個 Apache Tomcat 版本的安全問題。攻擊者可以透過建構特定的 JSON 請求來利用此弱點,從而可能導致遠端程式碼執行。對於管理 Tomcat 伺服器的管理員來說,瞭解此類別弱點的細節至關重要,以便採取適當的防護措施。

@startuml
skinparam backgroundColor #FEFEFE
skinparam sequenceArrowThickness 2

title OWASP ZAP 與 Python 自動化網頁安全測試

actor "客戶端" as client
participant "API Gateway" as gateway
participant "認證服務" as auth
participant "業務服務" as service
database "資料庫" as db
queue "訊息佇列" as mq

client -> gateway : HTTP 請求
gateway -> auth : 驗證 Token
auth --> gateway : 認證結果

alt 認證成功
    gateway -> service : 轉發請求
    service -> db : 查詢/更新資料
    db --> service : 回傳結果
    service -> mq : 發送事件
    service --> gateway : 回應資料
    gateway --> client : HTTP 200 OK
else 認證失敗
    gateway --> client : HTTP 401 Unauthorized
end

@enduml

內容解密: 上述 Plantuml 圖表展示了從使用 Censys 搜尋引擎到實施安全更新的完整流程。此過程不僅有助於識別潛在的安全威脅,還指導管理員採取具體措施以強化伺服器的安全性。

實施安全最佳實踐

除了識別和修復已知的弱點外,實施安全最佳實踐對於保護 Tomcat 伺服器至關重要。這包括但不限於:

  • 定期更新和修補:保持 Tomcat 和其依賴元件的最新狀態,以修復已知的安全弱點。
  • 組態安全管理:正確組態安全管理功能,例如使用安全的使用者名稱和密碼,以及適當的許可權設定。
  • 監控和日誌記錄:啟用詳細的日誌記錄,並定期監控日誌檔案,以便及時發現可疑活動。

透過結合使用 Censys 等工具進行弱點掃描、深入分析 CVE 弱點資訊,以及實施全面的安全管理措施,您可以顯著提高 Apache Tomcat 伺服器的安全性,保護您的服務免受潛在的安全威脅。