近年資安意識抬頭,無論是民間企業或是政府單位,系統安全性已成為極為重要的關注點。因此,對於系統上線前的要求,普遍要通過程式碼靜態掃描檢測才可上線,這樣的資安政策往往給工程師們帶來相當的挑戰。然而,市面上存在眾多原始碼檢測工具,且沒有一款工具是完美的,我們的系統原始程式碼仍有可能被掃描出各種中高風險漏洞,也使得修復漏洞變得相當具有挑戰性。
叡揚資訊資安事業處的顧問團隊們服務眾多企業客戶,在過去的一年中,我們接收到近 1300 個弱點的諮詢,平均下來每個月回覆超過 100 個弱點問題!而面對如此龐大的諮詢量,為此我們建立了叡揚資安獨家知識庫,以協助客戶更有效解決各種弱點問題!
本文整理自 2023 年以來最常被諮詢的十大弱點修復問題!提供各位可以事半功倍的修復錦囊,快速地找出風險的關鍵點,並且有效地進行修復!文章分為上下兩篇,上篇解析第六至第十名的弱點問題及修復錦囊,下篇將要揭曉前五大最多人諮詢的弱點問題。
第五名:Privacy Violation,「隱私權侵犯」是指在未經授權的情況下,未經允許地收集、存儲、使用或共享個人敏感資訊的行為。這些敏感資訊可能包括個人身份、財務資訊、偏好、地理位置、健康資訊等。隱私侵犯可能由個人、組織或公司進行,其目的可能包括非法獲利、監視、誹謗、身份盜竊等。
常見的原因是不合理地儲存使用者敏感個資,應用程式中在處理資料的過程,出現不合理儲存個人敏感資訊的情況,敏感資訊包含銀行帳戶、密碼、信用卡、電話、地址等,而常見的儲存方式例如:寫日誌、檔案或資料庫等。如果這些資料被有心人士取得,將可能造成使用者的敏感資料外洩。
預防措施:
第四名: SQL Injection,是一種常見的網路安全漏洞,攻擊者利用應用程式對資料庫的 SQL 查詢未進行適當驗證和過濾的情況下,插入惡意的 SQL 程式碼。這種攻擊可能導致破壞性後果,包括資料洩漏、資料操控和系統破壞。
攻擊方法和目的:
攻擊例子:
考慮以下假想的使用者驗證查詢:
如果應用程式未對使用者輸入進行適當處理,攻擊者可以在 inputUsername 中插入惡意的 SQL 程式碼,如:
在這種情況下,應用程式未能區分使用者輸入和 SQL 程式碼,導致 SQL 語句變成:
這將使得該查詢始終返回 True(1=1 永遠成立),並忽略密碼的驗證,因此攻擊者可能成功登錄到系統中。
防範方法:
總結來說,防範 SQL Injection 攻擊的關鍵是保護您的應用程式不受到惡意 SQL 程式碼的影響,這需要正確的輸入驗證、適當的資料庫操作和安全性最佳實踐。
以下是 JAVA 和 C# 中使用參數化查詢的範例:
在 JAVA 中,使用 JDBC 進行資料庫操作,可以使用 PreparedStatement 來執行參數化查詢。
在 C# 中,可以使用 ADO.NET 來執行參數化查詢,這種方式可防範 SQL Injection 攻擊。
第三名: CSRF ,跨站請求偽造(Cross-Site Request Forgery)是一種網路安全性漏洞,它利用使用者目前在其他網站上的驗證身份來執行未經授權的操作。攻擊者利用受害者的瀏覽器已驗證的會話(Session)來發送偽造的請求,從而執行未經授權的操作。
攻擊方法和目的:
防範方法:
經常更新和測試: 定期更新您的程式碼、函式庫和框架,並定期進行安全測試以發現潛在的 CSRF 漏洞。
總之,CSRF 攻擊是一種常見的網路攻擊,開發人員應該採取措施來防範這種攻擊,確保使用者和資料的安全性。
各種程式語言都有相應的方法和函式可以幫助您避免 CSRF 弱點。以下是一些不同程式語言的修改範例,以防範 CSRF 攻擊:
在 form 中插入 CSRF 令牌
在後端驗證 CSRF 令牌
在後端,Django 框架內建的 csrf_protect 裝飾器會處理 CSRF 令牌的驗證。如果 CSRF 令牌驗證失敗,Django 將會引發 CSRF 驗證失敗的異常。
在 Spring 框架中,可以使用<form:form> 標籤生成 CSRF 令牌,並且後端會自動處理驗證。
在 JSP 頁面中嵌入 CSRF 令牌
在後端 Controller 處理 POST 請求:
Spring 框架會自動處理 CSRF 令牌的生成和驗證。
在 ASP.NET Core 中,您可以使用內建的 CSRF 保護中間件來處理 CSRF 令牌的生成和驗證。
在 View 中插入 CSRF 令牌:
在 Controller 中驗證 CSRF 令牌:
第二名: Missing HSTS (HTTP Strict Transport Security ) Header,是一種設定上的安全性弱點,指的是在 Web 服務器未配置 HTTP Strict Transport Security Header 的情況下,進行通信時缺乏對安全傳輸的強制要求。HSTS Header 旨在增強網站的安全性,強制使用安全的 HTTPS 連接來防範某些攻擊,如中間人攻擊或 SSL/TLS 剝離攻擊。
攻擊方法和目的:
防範方法:
HSTS Header 是維持網站安全性的重要工具之一,它可以幫助防範某些攻擊並確保使用者的隱私和資料安全。
以 Tomcat 設定 web.xml 為例:
這個 Header 告訴瀏覽器,在接下來的 31536000 秒(一年)內,使用 HTTPS 訪問該網站,包括所有子網域或子功能變數名稱。這將使得瀏覽器在接下來的一段時間內強制使用 HTTPS,並且當使用者首次訪問該網站時,瀏覽器會記住這個設置,即使使用者嘗試使用 HTTP 訪問,瀏覽器也會自動將其重新轉址到 HTTPS 版本。
請注意,這個設置可能會因為不同的 Web 服務器和配置而有所不同。在實際應用中,您可能需要根據您使用的 Web 服務器或框架,以及安全性需求進行進一步的配置。
這是一個基本的範例,但在實際應用中,您應該根據您的需求和環境對 HSTS 進行更精細的配置。該 Header 可以設置的參數包括 max-age(指定 HSTS 政策的持續時間)、includeSubDomains(指示瀏覽器將該政策套用到所有子網域或子功能變數名稱)、preload(將您的功能變數名稱新增到 HSTS preload 列表中,讓瀏覽器預載 HSTS,強制使用 HTTPS Header)等。
第一名: XSS,指的是跨站腳本攻擊(Cross-Site Scripting),它允許攻擊者將惡意的客戶端腳本(通常是 JavaScript)注入到網頁中,然後被其他使用者瀏覽時執行。XSS 弱點的主要目的是在受害者的瀏覽器中執行惡意腳本,從而實現各種攻擊,包括以下情況:
為了防止 XSS 攻擊,網站開發人員應該實施以下安全措施:
各種程式語言都有相應的方法和函式可以幫助您避免 XSS 弱點。以下是一些不同程式語言的修改範例,以防範 XSS 攻擊:
防範 XSS 攻擊的最直接方法是避免將使用者輸入的資料直接插入到 HTML 中。取而代之,您應該使用 JavaScript 的內建函數來將輸入資料進行編碼處理,例如使用 encodeURIComponent 或 encodeURI。以下是一個簡單的範例:
Django 框架提供了一個內建的 escape 模組系統,它會自動將使用者輸入進行 HTML 編碼處理。這意味著您可以在 Django 模組中使用變數而不必擔心 XSS 攻擊。
在 PHP 中,您可以使用 htmlspecialchars 或 htmlentities 函數將使用者輸入的資料進行 HTML 編碼處理。
小題醒:使用此函式進行處理時,忘別了 "ENT_QUOTES" 與 "UTF-8" 的設定,才能將單引號與雙引號都進行轉換與設定正確的編碼唷。
Spring 框架提供了 Thymeleaf 等範本引擎,它們可以自動處理 HTML 編碼。
前端網頁輸入 template.html
後端程式編碼處理
在 C# 中,您可以使用 HttpUtility.HtmlEncode 函數來對使用者輸入的資料進行 HTML 編碼處理。
請注意,要使用 HttpUtility,您需要將System.Web命名空間添加引用,並且確保代碼在.NET Framework項目中運行。如果您在 .NET Core 或 .NET 5+ 中工作,可以使用 System.Net.WebUtility.HtmlEncode 函數,而不需要添加 System.Web 作為引用。
另外一種是使用 System.Text.Encodings.Web 命名空間的 HtmlEncoder Class,或者,您可以使用 Razor 進行 HTML 編碼,每當您使用 @ 指示詞時,它會套用 HTML 屬性編碼規則。
下篇內容深入探討 2023 年以來諮詢度最高的前五名弱點修復問題,提供深度的分析和防範方法。這些資安挑戰的背後蘊含企業在不斷演進的數位威脅環境中所面臨的現實,也突顯安全程式碼撰寫品質與人才培訓的重要性。
這不僅僅是技術上的挑戰,更涉及在開發階段就應該強調的資安意識,源頭安全的程式碼撰寫品質與開發者的資安培訓成為防範日益複雜威脅的關鍵環節。
透過「揭曉 2023 原始碼掃描弱點 Top 10 修復指南」系列文章,期望為客戶提供實際且可行的資安建議,如有任何疑問或討論,歡迎與叡揚資安團隊的顧問或業務分享您的想法,期待與您共同努力,建構更安全的數位環境!