在外吃飯,手機接到土砲 SIEM 傳來一連串警示,顯示有個 IP 正在對某對外網站嘗試各式各樣的無效 URL,研判是惡意機器人正在探索漏洞準備攻擊。(總不會是公益團體在幫人免費做滲透測試吧?)

這種事在網路每天都在上演,網站只要 IP 對外就絕對會遇到。攻擊者會放出機器人在 Internet 四處亂槍打鳥,發現網站後把所有想到的漏洞 URL 全部掃一次,反正成本不高,就算 999 個失敗,只要有一個成功就挖到寶了。

這種對同一網站遍歷所有漏洞 URL 的手法,有個專有名詞叫 Web Fuzzying (模糊測試) 攻擊,是一種針對 Web 應用程式常見的自動化安全測試與攻擊技術,其原理是大量產生並輸入隨機、半隨機或精心設計的資料至 Web 服務的各種輸入點,觀察應用程式行為,進而發掘潛在的安全漏洞如 SQL Injection、XSS、目錄遍歷、檔案上傳等。攻擊者通常利用 fuzzer 工具如 ffuf、wfuzz、Burp Suite、JBroFuzz 等,使用 HTTP 的 GET/POST 參數進行模糊測試。

事後整理 Nginx log,大約知道整起事件是某個 IP 在六分鐘裡對主機發動了 11 萬次 GET/POST (還包含 34 個 PUT 及 9 個 DELETE):

來源 IP 不例外地在 AbusedIPDB 已被通報為惡意來源,至此事件應可以「惡意機器人的隨機式無差別攻擊」簽結。

不過難得能拿到完整 Web Fuzzing 攻擊樣本,又正好在玩 Github Copilot CLI,就順手請 Copilot CLI 整理排序得到大約三千條樣本(原始筆數 11 萬筆,但機器人對同一 URL 會用不同 User Agent 各試一次[註],故有大量重複),再丟給 NotebookLM、Perplexity、ChatGPT、Claude、Genimi 歸納分析,藉此機增廣見聞,觀摩惡意程式的手法與攻擊武器有哪些,再回推有哪些錯誤千萬不能犯跟如何做好自我保護。
註:許多站台會依 User-Agent 切換行為(例如行動版/桌面版、舊IE兼容分支、App WebView專屬路徑),不同分支常有不同模板、參數處理或中介層,對同一 URL 用多種UA能觸發更多後端程式碼路徑,提升撞到邏輯缺陷或漏洞的機率。另外一方面,部分服務會把 User-Agent 當作爬蟲辨識或白名單/黑名單條件,例如對特定爬蟲或內部監測 User-Agent 放寬速率限制或回傳更多診斷細節。

thumbnail

綜合各家 LLM 的分析結果,我整理成自己版本的筆記,分類說明:

  1. 路徑遍歷與任意檔案讀取 (Path Traversal / Arbitrary File Read)

    這是非常常見的攻擊類型,攻擊者會嘗試用 ../ 找上層目錄,試圖拿到網站目錄範圍外的系統敏感檔案。
    攻擊者主要會嘗試以 ../、百分比編碼、多次編碼或混合斜線、NULL-byte、Unicode 等技巧來繞過過濾,例如:%2e%2e%2f、%252e%252e%252f(雙重編碼) 並混合使用不同分隔符號(例如:../、..\、..%5c),試圖取得系統敏感檔案,例如 /etc/passwd、windows/win.ini、wp-config.php、.env、SSH 私鑰 (.ssh/id_rsa)、AWS 憑證 (.aws/credentials)、docker/ssh/credentials... 等等,Java 網站常見的目標則有 WEB-INF/web.xml 或 WEB-INF/weblogic.xml,其中包含 Java 應用程式的結構、Servlet 配置和潛在的敏感資訊。
    樣本中遍歷深度最多達到 18 層,其中 5 層遍歷最為常見。以下是一些範例:

    • 基本遍歷: GET /../../../../../../etc/passwd
    • 用 URL 編碼繞過: GET /api/2.0/mlflow-artifacts/artifacts/%252E%252E%252F%252E%252E%252F%252E%252E%252F%252E%252E%252F%252E%252E%252F%252E%252E%252Fetc%252fpasswd 這裡的 %252E 是 %2E 的雙重編碼,. 的 URL 編碼是 %2e,/ 是 %2f。
      攻擊者利用多層編碼來繞過簡單的資安防護規則。
    • 參數注入: GET /ACSServer/WebServlet?act=getMapImg_acs2&filename=../../../../../../../etc/passwd 攻擊者將遍歷路徑作為 filename 參數的值傳入,試圖讓後端程式讀取並返回任意檔案。
    • 針對特定平台: GET /public/plugins/grafana-clock-panel/../../../../../conf/defaults.ini 這個請求明確針對 Grafana 平台,嘗試利用插件路徑進行路徑遍歷,讀取 Grafana 的預設設定檔。
  2. Remote Code Execution(RCE)或 OGNL injection(特別針對 Apache Struts)

    利用框架內的表達式語言或遠端範本注入及執行系統命令。例如樣本中就有大量 index.action?...%23context...Runtime.getRuntime().exec(...) 的 Payload。(說著說著就出現了 【打破砂鍋】資訊、資安常在說的 Payload 到底是什麼?)

    • 利用 OGNL (Object-Graph Navigation Library) 表達式注入漏洞來執行命令 - GET /%24%7B%28%23_memberAccess%5B%22allowStaticMethodAccess%22%5D%3Dtrue%2C%23a%3D@java.lang.Runtime@getRuntime%28%29.exec%28%27cat%20/etc/passwd%27%29...%7D/actionChain1.action 透過 OGNL 表達式呼叫 Java 的 Runtime.getRuntime().exec() 方法來執行 cat /etc/passwd 命令,並試圖將結果輸出到網頁上,另一個變體是執行 whoami。
    • 利用 PHP 函式漏洞或特性(如 system()、shell_exec())執行命令 - GET /__debugging_center_utils___.php?log=;echo%20cekurzpqyhikfdufobsffhkblpjobpti%20|%20id 攻擊者在 log 參數後方用分號 ; 結束前一個指令,然後注入 id 或 ipconfig 命令,並將結果輸出。
    • 許多舊式或嵌入式設備的 CGI 程式存在漏洞,允許直接將命令注入到 URL 參數中,例如:
      GET /cgi-bin/mainfunction.cgi/apmcfgupload?session=...cat${IFS}/etc/passwd 利用 ShellShock (Bash 漏洞) 嘗試將命令注入到環境變數中執行。
      GET /cgi-bin/account_mgr.cgi?cmd=cgi_user_add&group=%27;id;%27 在 group 參數中注入 ;id; 命令,試圖利用應用程式拼接系統命令時的漏洞來執行 id。
  3. SQL 注入 (SQL Injection, SQLi)

    SQL Injection 是老梗中的老梗,但仍是最受駭客歡迎兼最常出現的漏洞,歷久不衰。攻擊者會在輸入參數插入惡意 SQL 程式碼,若程式犯下低級錯誤 - 用參數組裝 SQL 語法,就能對後端資料庫執行非預期的任意操作,常用於竊取資料、繞過認證、拖延系統反應,破壞資料庫、植入木馬... 等等,危險度破表。

    • 攻擊對象不限資料庫不限平台,由樣本發現攻擊者對 MySQL (md5())、SQL Server (substring(sys.fn_sqlvarbasetostr(HASHBYTES('MD5',...))))、PostgreSQL (pg_sleep()) 都做了嘗試。另外也有大量大量 SQLi 攻擊都針對 WordPress 的 rest_route API 或各種插件的參數。
    • 時間盲注攻擊(Time-based Blind Injection) - GET /?rest_route=/lms/stm-lms/order/items&author_id=1&user=1)+AND+%28SELECT+3493+FROM+%28SELECT%28SLEEP%286%29%29%29sauT%29+AND+%283071%3D3071,注入 SLEEP(6) 語句,如果伺服器回應慢了 6 秒,可驗證此處存在 SQL 注入漏洞。
    • 聯合查詢 (UNION-based/MD5 Fingerprint) - GET /admin/manage_user.php?id=-1%20union%20select%201,md5(999999999),3,4,5--+ 攻擊者使用 UNION SELECT 語句,試圖將 md5('999999999') (b7a5779c9384b6f13a07ef41c11e74f1) 塞到 HTML 回應,若在 HTML 發現該內容即代表有漏洞。
    • 錯誤注入 (Error-based) - GET /a/sys/user/resetPassword?mobile=...%27and%20(updatexml(1,concat(0x7e,(select%20md5(999999999)),0x7e),1))%23 故意在 updatexml 函式觸發資料庫錯誤,並將 md5() 包含在錯誤訊息中回傳,若出現就代表有 SQLi。
  4. 敏感資訊與路徑洩漏 (Sensitive Information & Path Disclosure)

    目的在發現伺服器上未受保護的敏感檔案、備份檔、設定檔或管理介面,攻擊者常透過字典檔暴力猜測常見的路徑和檔名。

    • 樣本中有大量請求針對 WordPress wp-config.php 及其各種備份形式(如 wp-config.php.bak, wp-config.old 等)的嘗試,wp-admin/ 和 wp-login.php 也是常見目標。
    • 通用的 Web 伺服器目標包含 .env、.git/config、.svn/entries 等版本控制系統的殘留檔案,以及各種 config.json、database.yml 等設定檔。
    • 針對管理後台與 API 端點的攻擊 - 例如:大量請求嘗試訪問 /admin/、/login、/api/users 等常見的管理介面或 API 路徑。
    • 雲端平台 Metadata,如 GET http://169.254.169.254/latest/meta-data/ 嘗試訪問 AWS EC2 的 Metadata 服務,試圖利用 SSRF (Server-Side Request Forgery) 漏洞來竊取雲端主機的臨時憑證。樣本中也發有有針對其他雲平台(如 Google Cloud, Azure, Alibaba Cloud)Metadata 資料服務的嘗試。
  5. 檔案上傳漏洞 (File Upload Vulnerabilities)

    攻擊者試圖尋找允許上傳檔案的功能,並上傳惡意的 Web Shell (通常是 PHP 或 JSP 檔案),以獲得伺服器的控制權。

    • 尋找 PHP upload.php 或類似功能的端點,直接上傳 Webshell POST /Upload/upload_file.php?l=test,POST 主體很可能包含惡意的 PHP 程式碼,隨後再嘗試讀取上傳檔名(如 GET /Upload/test/33GXVIW1wGVkjgrvdjv48KeQTAf.php)確認是否成功。
    • 嘗試在 WordPress admin-ajax 建立/寫入 PHP,如 POST /wp-admin/admin-ajax.php?+config-create+/&/<?=base64_decode($_GET[0])?>+/tmp/33GXVLqZmI04wSu...php 之後再用 GET 驗證。
    • GET /Uploads/33GXVFaEfezRt7gMXCYpyePTpII.php7 包含繞過檔案類型限制的手法,使用 .php7 這樣的非標準副檔名可繞過僅檢查 .php 副檔名的上傳限制,如果伺服器設定不當,仍可能將其作為 PHP 腳本執行。
    • 尋找允許上傳 .jsp 檔案的漏洞 - 針對特定應用漏洞: POST /WebReport/ReportServer?op=svginit&cmd=design_save_svg&filePath=chartmapsvg/../../../../WebReport/KCFy2ZpF.jsp 此請求利用了 FineReport 的一個漏洞,透過目錄遍歷將任意內容(Webshell)寫入到一個 .jsp 檔案中,從而實現遠端控制。

被瞄準的應用程式 / 平台

瞄準的 CMS、Web 應用、框架和語言包羅萬象,許多我聽都沒聽過

  • WordPress(wp-admin、admin-ajax、wp-json、uploads、wp-file-manager、wp-time-capsule) —— 大量 plugin 路徑與 uploads/webshell 掃描。
  • Confluence:如 /pages/createpage-entervariables.action。
  • Joomla/PrestaShop:外掛上傳如 com_gmapfp、modules/appagebuilder。
  • Pandora FMS:如 /pandora_console/ajax.php。
  • Apache Struts / Java Webapps(index.action, WEB-INF, weblogic.xml) —— OGNL RCE payload 明顯針對 Struts 類漏洞。
  • Nacos / Spring Boot actuator / Airflow / SolarWinds / Geoserver / phpMyAdmin / Nagios / OpenAM / Minio —— 掃描管理 API / 未受保護的 endpoints。
  • 各種 PHP 應用與 plugin(elfinder、uploadify、file-manager、simple-file-list、wp-file-manager 等) —— 上傳漏洞和不當的檔案處理。
  • .NET/ASP:如 human.aspx、WidgetHandler.ashx。

一些企業或管理工具軟體

  • Nacos:如 /nacos/v1/auth/users/ (配置管理)。
  • Seeyon OA:如 /seeyon/thirdpartyController.do (中國 OA 系統)。
  • Oracle E-Business Suite:如 /OA_HTML/ibeCAcpSSOReg.jsp。
  • SolarWinds Orion:如 /SolarWinds/InformationService/v3/Json/Query。

路由器/裝置/資安相關產品

  • Cisco:如 /+CSCOU+/../+CSCOE+/files/file_list.json。
  • Fortinet:如 /ssl-vpn/hipreport.esp。
  • Zabbix/Nagios:如 /zabbix/index.php、nagiosxi/login.php。
  • iDRAC/Supermicro:如 /redfish/v1/SessionService/Sessions/。

其他平台

  • MinIO:如 /minio/bootstrap/v1/verify (物件儲存)。
  • GeoServer:如 /geoserver/wms。
  • Docker/Kubernetes:如 /kubepi/api/v1/users。

攻擊者常用的自動化與偵測特徵

由樣本的 Pattern,可整理出一些明顯特徵,這部分可做為設計 IDS 或 WAF 規則的參考:

  • 大量同類 payload 的快速連續請求(fuzzing)— 檢測同一來源在短時間大量 ..、%00、/etc/passwd、wp-admin/admin-ajax.php?action= 等請求。
  • 對 Known paths 的字典掃描(.env、wp-config.php、jwt/private.pem、private.key 等)。
  • Time-based SQLi 的慢查詢(SLEEP payload)或回顯試探(md5(999999999))。


Comments

Be the first to post a comment

Post a comment