本頁說明如何解讀、重現及修正 Web Security Scanner 發現的問題。
您可以在機構、資料夾或專案層級授予 Security Command Center 的 IAM 角色。您能否查看、編輯、建立或更新發現項目、資產和安全性來源,取決於您獲准的存取層級。如要進一步瞭解 Security Command Center 角色,請參閱存取權控管。
安全漏洞類別
Web Security Scanner 會偵測下列類別的安全漏洞:
- 跨網站指令碼攻擊 (XSS)
- 伺服器端偽造要求
- Flash 插入
- 複合型內容
- 過時或有安全漏洞的程式庫
- 純文字密碼
- 不安全的來源驗證
- 標頭無效
- 標頭拼字有誤
- 可存取的存放區
- SQL 插入
- XML 注入
- 原型鏈汙染
錯誤設定類別
Web Security Scanner 會偵測下列類別的設定錯誤:
- HTTP 嚴格傳輸安全性標頭設定錯誤
- 缺少內容安全政策標頭
- 內容安全政策標頭設定有誤
- 缺少 Cross-Origin-Opener-Policy 標頭
- 缺少點擊劫持防護機制
如果系統偵測到上述任何安全漏洞或設定錯誤,就會醒目顯示相關結果,方便您深入研究。
對記錄的影響
Web Security Scanner 掃描追蹤記錄會顯示在您的記錄檔中。舉例來說,Web Security Scanner 會針對 ~sfi9876
和 /sfi9876
這類異常字串產生要求,這個程序可讓掃描作業檢查應用程式的錯誤頁面。您的記錄檔中會顯示這種刻意無效的頁面要求。
修正後停用發現項目
修正安全性漏洞或設定錯誤後,Web Security Scanner 不會自動將對應 Security Command Center 發現項目的狀態設為 INACTIVE
。除非手動變更狀態,否則 Security Command Center 中 Web Security Scanner 產生的發現項目狀態會維持 ACTIVE
。
如果您使用的是獨立版 Web Security Scanner,修復安全漏洞或設定錯誤後,Web Security Scanner 就無法再偵測到這些問題,後續的報告也不會再列出這些問題。過去的調查結果報告仍會保留調查結果記錄。
Web Security Scanner 每週都會執行代管掃描。
如要進一步瞭解 Web Security Scanner 掃描,請參閱「掃描類型」。
修正 Web Security Scanner 發現項目
本節說明如何修正不同類型的 Web Security Scanner 發現項目。如要瞭解如何防範 OWASP Top 10 中列出的常見應用程式層級攻擊,請參閱 Google Cloud上的 OWASP Top 10 緩解選項。
XSS
API 中的類別名稱:XSS
Web Security Scanner 跨網站指令碼 (XSS) 植入測試會將一段無害的測試字串插入至可供使用者編輯的欄位,並執行各種使用者動作,藉以模擬植入攻擊行為。自訂偵測工具會在測試期間觀察瀏覽器和 DOM,以判斷植入行為成功與否,並評估導致惡意利用的可能性。
如果執行字串內含的 JavaScript 執行無礙,系統即會啟動 Chrome 偵錯工具。如果測試字串可以執行,就可能在網頁上插入並執行 JavaScript。如果攻擊者發現這個問題,他們就能以點選惡意連結的使用者 (受害者) 身分,執行他們選擇的 JavaScript。
在某些情況下,測試中的應用程式可能會在瀏覽器剖析該應用程式之前,就先修改了測試字串。舉例來說,應用程式可能會驗證輸入內容或限制欄位大小。當瀏覽器嘗試執行修改過的測試字串時,很可能會故障,並傳回 JavaScript 執行錯誤。這項錯誤表示有注入問題,但可能無法加以利用。
如要解決這項問題,請手動驗證是否能避免測試字串遭到修改,確認這其實是 XSS 安全漏洞的問題。如要進一步瞭解如何驗證這項安全漏洞,請參閱「跨網站指令碼」一文。
有多種方式可修正這項發現。建議的修正方式是逸出所有輸出內容,並使用支援上下文自動逸出的範本系統。
XSS angular callback
API 中的類別名稱:XSS_ANGULAR_CALLBACK
當 Angular 內插使用者提供的字串時,AngularJS 模組可能會發生跨網站指令碼攻擊 (XSS) 的安全漏洞。將使用者提供的值植入 AngularJS 內插類型時,可能會導致下列攻擊行為得以成功:
- 攻擊者可將任意程式碼植入由瀏覽器轉譯的頁面。
- 攻擊者可在頁面的來源代表受害者瀏覽器執行動作。
如要重現此潛在安全漏洞,請在執行掃描後,按照 Google Cloud 控制台中的重製網址連結的指示操作。此連結會直接開啟警告對話方塊,或是插入「XSSDETECTED」字串,藉以證明攻擊行為可執行程式碼。XSSDETECTED
如果插入字串,您可以開啟瀏覽器的開發人員工具,然後搜尋 XSSDETECTED
來找出插入內容的確切位置。
XSS error
API 中的類別名稱:XSS_ERROR
XSS_ERROR
發現的問題是 JavaScript 故障造成的潛在 XSS 錯誤。在某些情況下,測試中的應用程式可能會在瀏覽器剖析該應用程式之前,就先修改了測試字串。當瀏覽器嘗試執行修改過的測試字串時,很可能會故障,並傳回 JavaScript 執行錯誤。這項錯誤表示有注入問題,但可能無法利用。
如要修正這項發現,您需要手動驗證是否能避免測試字串遭到修改,確認是否有 XSS 安全漏洞。如要進一步瞭解如何驗證這項安全漏洞,請參閱「跨網站指令碼」。
Server side request forgery
API 中的類別名稱:SERVER_SIDE_REQUEST_FORGERY
SERVER_SIDE_REQUEST_FORGERY
安全漏洞會強制伺服器向受限制的服務端點提出要求 (例如 HTTP 要求),讓網路應用程式使用者取得內部資料的存取權。舉例來說,攻擊者可以利用這項安全漏洞,從 Google Cloud 中繼資料 Google Cloud 服務擷取資料。
如要修正這項發現,請使用許可清單,限制網頁應用程式可提出要求的網域和 IP 位址。
Rosetta flash
API 中的類別名稱:ROSETTA_FLASH
Web Security Scanner 可能會發現要求參數的值反映至回應開頭,例如使用 JSONP 的要求。這項安全漏洞也稱為 Flash 注入。在特定情況下,攻擊者可能會佯裝為易受安全漏洞攻擊網路應用程式所提供的 Flash 檔案,讓瀏覽器執行回應。
如要修正這項發現,請勿在 HTTP 回應的開頭加入使用者可控制的資料。
Mixed content
API 中的類別名稱:MIXED_CONTENT
Web Security Scanner 會被動觀察 HTTP 流量,並在 HTTPS 頁面環境中,偵測何時透過 HTTP 提出 JavaScript 或 CSS 檔案要求。在這種情況下,中間人攻擊者可能會竄改 HTTP 資源,並取得載入該資源網頁或監控使用者行動的完整權限。
如要修正這項發現項目,請使用相對的 HTTP 連結,例如將 http://
替換為 //
。
Outdated library
API 中的類別名稱:OUTDATED_LIBRARY
Web Security Scanner 可能會發現內建資料庫的版本確實有安全性問題。Web Security Scanner 是一種簽章型掃描工具,會嘗試識別所用程式庫的版本,並檢查該版本是否符合已知含有安全漏洞程式庫的清單。如果版本偵測失敗或已透過手動方式修補資料庫,則可能會發生系統誤判。
如要修正這項發現,請更新為已知安全版本的內建資料庫。
Struts insecure deserialization
API 中的類別名稱:STRUTS_INSECURE_DESERIALIZATION
Web Security Scanner 可能會發現您的網路應用程式使用的 Apache Struts 版本容易遭受遠端指令插入攻擊。受影響的 Struts 版本可能會錯誤剖析攻擊者的無效 Content-Type HTTP 標頭。這個漏洞可讓惡意指令以網路伺服器的權限執行。
容易遭受攻擊的 Apache Struts 版本如下:
- 2.3.x 版本 (2.3.32 之前的版本)
- 2.5.x 版本 (2.5.10.1 之前的版本)
如要修正這項發現,請將 Apache Struts 升級至最新版本。
如要進一步瞭解 Apache Struts 安全漏洞,請參閱 CVE-2017-5638。
Cacheable password input
API 中的類別名稱:CACHEABLE_PASSWORD_INPUT
Web Security Scanner 可能會發現,網頁應用程式針對密碼輸入使用 <input>
元素,但該元素未將 type
屬性設為 password
。這可能會導致瀏覽器在一般瀏覽器快取 (而非安全的密碼儲存空間) 中快取使用者輸入的密碼。
如要修正這項發現,請在 <input>
元素中新增 type
屬性,並將其設為 password
,例如 <input type="password">
。這個屬性會遮蓋使用者在密碼欄位中輸入的字元。
Clear text password
API 中的類別名稱:CLEAR_TEXT_PASSWORD
Web Security Scanner 可能會發現應用程式似乎是以純文字格式傳輸密碼欄位。攻擊者可能會攔截網路流量並竊取密碼欄位。
如要保護在用戶端與伺服器間傳送的機密資訊,請務必採取下列預防措施:
- 使用 TLS/SSL 憑證。
- 在包含密碼欄位的頁面上一律使用 HTTPS。
- 確認表單動作屬性一律指向 HTTPS 網址。
Insecure allow origin ends with validation
API 中的類別名稱:INSECURE_ALLOW_ORIGIN_ENDS_WITH_VALIDATION
Web Security Scanner 可能會發現跨網站 HTTP 或 HTTPS 端點只會驗證 Origin
要求標頭的後置字串,接著就會在 Access-Control-Allow-Origin
回應標頭中呈現該後置字串。如果驗證設定錯誤,端點可能會將存取權授予與許可網域具有相同字尾的惡意網域。舉例來說,如果端點的驗證器符合 *google.com
等網域,可能會錯誤地授予 maliciousdomaingoogle.com
的存取權。
如要修正這項發現,請先確認預期的根網域是 Origin
標頭值的一部分,然後再呈現在 Access-Control-Allow-Origin
回應標頭中。如為子網域萬用字元,請在根網域開頭加上半形句號,例如 .endsWith(".google.com")
。
Insecure allow origin starts with validation
API 中的類別名稱:INSECURE_ALLOW_ORIGIN_STARTS_WITH_VALIDATION
Web Security Scanner 可能會發現跨網站 HTTP 或 HTTPS 端點只會驗證 Origin
要求標頭的前置字串,接著就會在 Access-Control-Allow-Origin
回應標頭中呈現該前置字串。如果驗證設定錯誤,端點可能會授予惡意網域存取權,而該網域與許可清單中的網域具有相同前置字元。舉例來說,如果端點的驗證器只會檢查要求網域是否包含 google.com
,就可能會誤將存取權授予 google.com.maliciousdomain.com
。
如要修正這項發現,請先驗證預期網域是否完全符合 Origin
標頭值,再將其反映在 Access-Control-Allow-Origin
回應標頭中,例如 .equals(".google.com")
。
Session ID leak
API 中的類別名稱:SESSION_ID_LEAK
Web Security Scanner 可能會在網頁應用程式跨網域要求的 Referer
要求標頭中,發現工作階段 ID。收到 Referer
的網域可以使用工作階段 ID 模擬使用者 (使用使用者的權杖),或明確識別使用者。
如要修正這項發現,請將工作階段 ID 儲存在 Cookie 中,而非網址。 此外,請使用下列屬性保護 Cookie 安全:
Invalid content type
API 中的類別名稱:INVALID_CONTENT_TYPE
Web Security Scanner 可能會發現載入的資源與回應的 Content-Type HTTP 標頭不符。在這種情況下,應用程式會傳回內容類型無效的機密內容,或是沒有 X-Content-Type-Options: nosniff
標頭。
如要修正這項發現,請確認下列事項:
- 透過 Content-Type 標頭
application/json
提供 JSON 回應 - 透過適當的 MIME 類型提供其他敏感回應
- 透過 HTTP 標頭
X-Content-Type-Options: nosniff
提供內容
Invalid header
API 中的類別名稱:INVALID_HEADER
Web Security Scanner 可能會發現安全性標頭語法錯誤,導致標頭格式錯誤或擁有無效值。因此瀏覽器會忽略這些標頭。
有效標題說明如下。
Referrer-Policy 標頭
有效的參照網址政策會包含下列其中一個值:
- 空字串
no-referrer
no-referrer-when-downgrade
same-origin
origin
strict-origin
origin-when-cross-origin
strict-origin-when-cross-origin
unsafe-url
X-Frame-Options 標頭
有效的 X-Frame-Options 標頭只能有下列值:
DENY
:禁止所有框架SAMEORIGIN
:如果頂層網址來源相同,則允許框架ALLOW-FROM URL
Chrome 不支援 ALLOW-FROM URL
。不允許使用多重 X-Frame-Options。
X-Content-Type-Options 標頭
有效的 X-Content-Type-Options 標頭僅可具有單一值:nosniff
。
X-XSS-Protection 標頭
有效的 X-XSS-Protection 標頭必須以 0
(「停用」) 或 1
(「啟用」) 開頭。接著,只有在啟用保護措施後,才能新增最多兩個選項:
mode=block
顯示空白頁面,而非篩除 XSSreport=URL
將報告傳送給URL
請用半形分號分隔選項,例如 1; mode=block; report=URI
。請確認沒有結尾分號。
Misspelled security header name
API 中的類別名稱:MISSPELLED_SECURITY_HEADER_NAME
Web Security Scanner 可能會發現安全性標頭名稱拼字有誤。如安全性標頭拼字有誤,則安全性標頭會無效且必須修正。
如要重現此安全漏洞,請在瀏覽器的開發人員工具網路分頁中,檢查拼字是否有誤。
Mismatching security header values
API 中的類別名稱:MISMATCHING_SECURITY_HEADER_VALUES
Web Security Scanner 可能會發現重複且與安全性相關的回應標頭 (具有衝突值)。如在回應中使用不相符的值執行兩次宣告,部分與安全性相關的 HTTP 標頭就會出現未定義的行為。
如要修正這項發現,請只保留其中一個不相符的標頭。
可存取的存放區
Web Security Scanner 可能會在應用程式中發現可存取的 GIT 或 SVN 存放區。這可能會導致設定和原始碼外洩。
如要重現安全漏洞,請按一下發現報告中的重製網址。
XXE reflected file leakage
API 中的類別名稱:XXE_REFLECTED_FILE_LEAKAGE
如果網路應用程式會剖析使用者輸入的 XML,Web Security Scanner 可能會發現 XML 外部實體 (XXE) 安全漏洞。攻擊者可以提供含有外部實體的 XML。這個外部實體可以參照應用程式有權存取的內容,例如應用程式主機上的檔案。當應用程式的 XML 剖析器處理惡意 XML 時,可能會洩漏主機上的檔案內容。
如要修正這項發現,請將 XML 剖析器設為禁止外部實體。
如要進一步瞭解這項安全漏洞,請參閱「XML 外部實體 (XXE) 處理」。
SQL injection
API 中的類別名稱:SQL_INJECTION
Web Security Scanner 可能會發現 SQL 植入安全漏洞。攻擊者可以建立輸入內容,藉此操控伺服器上執行的基礎 SQL 查詢的查詢結構。這些輸入內容可讓他們從資料庫竊取資料,有時還能修改資料。如要解決這項發現,請使用參數化查詢,防止使用者輸入內容影響 SQL 查詢的結構。
如要進一步瞭解這項安全漏洞,請參閱「SQL 植入」。
Prototype pollution
API 中的類別名稱:PROTOTYPE_POLLUTION
如果網路應用程式的物件屬性指派了攻擊者可控制的值,Web Security Scanner 可能會發現原型鏈汙染安全漏洞。攻擊者可以建立輸入內容,使應用程式容易受到跨網站指令碼攻擊或其他用戶端安全漏洞影響。
如要修正這項發現,請刪除已淘汰的 proto
屬性,並將 Object.prototype
物件設為無法變更。如果這種緩解做法與您的程式碼不相容,請變更有安全漏洞的程式碼部分,僅複製攻擊者可以控制的輸入內容預期值。
修正 Web Security Scanner 設定錯誤發現項目
本節說明如何修正各種 Web Security Scanner 設定錯誤發現項目。
HTTP 嚴格傳輸安全性設定錯誤
API 中的類別名稱:HSTS_MISCONFIGURATION
Web Security Scanner 會確保每個 HTTP 回應都會傳送 HTTP 嚴格傳輸安全性標頭,且設定正確。如要減少對網站穩定性的影響,請採取下列措施:
- 先從較小的
max-age
開始,且只能includeSubDomains
包含 (不得preload
)。 範例:max-age
=3600;includeSubDomains
。 - 等待期約為一週,期間未回報任何問題,即可提高 max-age。例如:
max-age
=604800;includeSubDomains
或max-age
=2592000;includeSubDomains
。 - 如果三個月內沒有任何回報問題,請將網站及其子網域新增至 hstspreload.org,並指定預先載入指令。指定預先載入指令後,瀏覽器就會內建 HTTP 嚴格傳輸安全性需求,惡意行為人無法降級連線。預先載入指令:
max-age=63072000; includeSubDomains; preload.
缺少 Content-Security-Policy 標頭
API 中的類別名稱:CSP_MISSING
Web Security Scanner 會確保每個 HTTP 回應都附有嚴格的 Content-Security-Policy 標頭 (僅限隨機數)。
Content-Security-Policy: script-src 'nonce-{random}' 'report-sample'; object-src 'none'; base-uri 'none'; report-uri https://link-to-report-endpoint
Content-Security-Policy 標頭設定有誤
API 中的類別名稱:CSP_MISCONFIGURATION
Web Security Scanner 會確保每個 HTTP 回應都附有嚴格的 Content-Security-Policy 標頭 (僅限隨機數)。
Content-Security-Policy: script-src 'nonce-{random}' 'report-sample'; object-src 'none'; base-uri 'none'; report-uri https://link-to-report-endpoint
缺少 Cross-Origin-Opener-Policy 標頭
API 中的類別名稱:COOP_MISSING
Web Security Scanner 會確保每個 HTTP 回應都隨附 Cross-Origin-Opener-Policy 標頭,包括下列其中一個有效指令:
unsafe-none
same-origin-allow-popups
same-origin
缺少點擊劫持防護機制
API 中的類別名稱:CLICKJACKING_PROTECTION_MISSING
Web Security Scanner 會確保每個 HTTP 回應都附上 X-Frame-Options 或 Content-Security-Policy 標頭,防止點擊劫持:
- 如果您使用 X-Frame-Options 標頭,請使用
DENY
或SAMEORIGIN
指令。 - 如果您使用 Content-Security-Policy 標頭,請設定
frame-ancestors
指令。
驗證問題
如 Web Security Scanner 回報問題,您必須驗證問題位置。本節說明如何使用發現項目報表重現及驗證安全漏洞。
前往 Google Cloud 控制台的「Web Security Scanner」(網頁安全掃描器) 頁面。
選取專案。系統會顯示頁面,列出您管理的掃描和自訂掃描。
在「掃描設定」下方,選取包含要驗證發現項目的掃描。系統會開啟頁面,顯示掃描詳細資料。
前往「結果」分頁,展開類別,然後選取要查看詳細資料的發現項目。
驗證方法會因發現項目類別而異。請使用測試瀏覽器,並按照下列指示操作。
- 跨網站指令碼:按照重現網址操作後,瀏覽器會產生空白彈出式視窗,表示掃描作業已成功將良性程式碼注入指令碼。
- 過時的程式庫:追蹤有安全漏洞的網址會傳回含有「Exploited」文字的網頁,表示掃描作業已成功將良性程式碼注入指令碼。
- 複合型內容:在HTTPS 網頁網址後方會傳回複合型內容安全漏洞的警告。調查結果報告會找出「透過 HTTP 提供的資源網址」下方的易受攻擊資源。
- Flash 注入:Web Security Scanner 可能會傳回這個類別的發現項目,但大多數現代瀏覽器都受到保護,可防範 Flash 注入。這些發現項目不太可能遭到濫用。
- 原型污染:按照「可以重現安全漏洞的網址」欄位中的網址,使用下列 JavaScript 程式碼片段,搜尋酬載帶來的
Object.prototype
物件異動。({}).__secret_injected_property
({}).__defineGetter__.__secret_injected_property
({}).hasOwnProperty.__secret_injected_property
強制執行「內容安全性政策」(CSP) 可能仍會使 JavaScript 程式碼無法運作,這種情況會讓 XSS 更難重現。如果遇到此問題,請檢查瀏覽器記錄主控台,以取得關於發生 CSP 違規行為的詳細資訊。