設定完成後 · 約 5 分鐘

驗證方法:確認 WAF 已擋下 php2shell

不需要寫程式。最簡單的方法只要一個瀏覽器:送出一個帶有漏洞特徵的表單,看 WAF 是否回應阻擋頁,再到設備上用 Support ID 查詢。

測試前

方法 A 瀏覽器測試頁(建議)

  1. 用文字編輯器開啟 php2shell_waf_test_page.html。
  2. 把 <form action="https://www.example.com/index.php" 的網址,改成要測試的 PHP 網址。
  3. 用瀏覽器直接開啟這個檔案。不需要把檔案放到網站上。
  4. 按「送出測試」。
測試頁

出現下面的阻擋頁,表示 WAF 已擋下。請記下 Support ID。

WAF 阻擋頁

如果看到網站的回應內容,表示請求已經送到 PHP,WAF 沒有阻擋。請回到 設定步驟 2 檢查。

方法 B curl 指令

把網址換成要測試的 PHP 網址。第一行是一般表單,應該正常回應;第二行帶有漏洞特徵,應該被擋。

# 1) normal form: must pass through the WAF
curl -s -X POST -F "note=test" https://www.example.com/index.php

# 2) php2shell indicator: must be blocked
curl -s -X POST -F "PHP_SESSION_UPLOAD_PROGRESS=waftest" -F "note=test" https://www.example.com/index.php

第二行被擋時,回應內容會包含:

The requested URL was rejected. Please consult with your administrator.
Your support ID is: (a long number)
方法 A、B 只會觸發 200204113另外 2 個 signature 是否生效,請在 policy 中確認 3 個都是 Enforced(設定步驟 2),或用下方的完整測試 script。安裝 ASU 20261022 後回到 Staging 的 200103697、200204115,用方法 A、B 測不出來。

在設備上確認

用阻擋頁上的 Support ID,確認是 php2shell 的 signature 擋下。

GUI 路徑Security ›› Event Logs : Application : Requests
1

按漏斗圖示,在 Support ID 輸入號碼,按 Apply

用 Support ID 篩選
2

確認 Request Status 是 Blocked,violation 包含 Attack signature detected

Blocked,並觸發 Attack signature detected
3

展開 Attack signature detected 的 Occurrence,確認名稱是 PHP Remote Code Execution

比對到的欄位與 signature 名稱

結果判讀

看到的結果代表什麼處理方式
一般表單也被擋新規則誤擋依 Event Log 的 violation 調整,不要直接關閉 signature
特徵表單沒有被擋signature 不在 policy、仍在 staging,或 policy 不是 Blocking回到 設定步驟 2 檢查
回應不是阻擋頁,也不是網站內容可能有 CDN 或其他設備先處理,或使用自訂阻擋頁在 Event Log 用時間與來源 IP 查詢
Event Log 查不到 Support ID請求沒有經過這台 BIG-IP確認 DNS 與連線路徑

進階:完整測試 script

需要更完整的驗證時,可使用 GitHub 上的 Python script(Python 3.6 以上,不需安裝套件)。它會同時送出正常請求與多種漏洞特徵,並判讀每一項的結果。

python3 php2shell_waf_test.py https://www.example.com/index.php

只完成 3 個 signature 的設定時,部分項目不會被擋。這是預期結果,那些項目對應 F5 的選用設定。lab 實測 ASU 20261022:A1、A2 由 200204113 擋下,A4 由 200103697 擋下,A5 由 200204115 擋下。說明見 README。