資訊中心管理
揭曉 2023 原始碼掃描弱點 Top 10 修復指南(下)
前往目錄
近年資安意識抬頭,無論是民間企業或是政府單位,系統安全性已成為極為重要的關注點。因此,對於系統上線前的要求,普遍要通過程式碼靜態掃描檢測才可上線,這樣的資安政策往往給工程師們帶來相當的挑戰。然而,市面上存在眾多原始碼檢測工具,且沒有一款工具是完美的,我們的系統原始程式碼仍有可能被掃描出各種中高風險漏洞,也使得修復漏洞變得相當具有挑戰性。

叡揚資訊資安事業處的顧問團隊們服務眾多企業客戶,在過去的一年中,我們接收到近 1,300 個弱點的諮詢,平均下來每個月回覆超過 100 個弱點問題!而面對如此龐大的諮詢量,為此我們建立了叡揚資安獨家知識庫,以協助客戶更有效解決各種弱點問題!

本文整理自 2023 年以來最常被諮詢的十大弱點修復問題!提供各位可以事半功倍的修復錦囊,快速地找出風險的關鍵點,並且有效地進行修復!文章分為上下兩篇,上篇解析第六至第十名的弱點問題及修復錦囊,下篇將要揭曉前五大最多人諮詢的弱點問題。

弱點諮詢 第 5 名 Privacy Violation

Privacy Violation,「隱私權侵犯」是指在未經授權的情況下,未經允許地收集、存儲、使用或共享個人敏感資訊的行為。這些敏感資訊可能包括個人身份、財務資訊、偏好、地理位置、健康資訊等。隱私侵犯可能由個人、組織或公司進行,其目的可能包括非法獲利、監視、誹謗、身份盜竊等。

常見的原因是不合理地儲存使用者敏感個資,應用程式中在處理資料的過程,出現不合理儲存個人敏感資訊的情況,敏感資訊包含銀行帳戶、密碼、信用卡、電話、 地址等,而常見的儲存方式例如:寫日誌、檔案或資料庫等。如果這些資料被有心人士取得,將可能造成使用者的敏感資料外洩。

預防措施

1. 檢視應用程式中是否有使用或儲存到 使用者敏感個資,如果是非業務所必要儲存的資料則建議應全數清除。

2. 如果是業務所必需的功能,應檢視保存資料的位置是否有對應適當的權限

3. 從管理面的角度進行列管,有處理使用者敏感個資的系統通常是屬於核心系統,定期監控系統以發現異常行為。

4. 確保敏感資料在傳輸和存儲過程中受到加密保護,實施良好的存取控制和身份驗證機制。

5. 遵循相應的隱私保護法規和標準, 如 GDPR(General Data Protection Regulation,歐洲一般資料保護法)、 CCPA(California Consumer Privacy Act,加州消費者隱私保護法)及我國的《個人資料保護法》等,確保敏感資訊的合法處理和保護。

弱點諮詢 第 4 名 SQL Injection

SQL Injection,是一種常見的網路安全漏洞,攻擊者利用應用程式對資料庫的 SQL 查詢未進行適當驗證和過濾的情況 下,插入惡意的 SQL 程式碼。這種攻擊可能導致破壞性後果,包括資料洩漏、資料操控和系統破壞。

攻擊方法和目的

1. 注入攻擊:攻擊者通常在應用程式的輸入字段中插入 SQL 程式碼。當應用程式未適當處理這些輸入時,攻擊者可以 利用這些漏洞執行惡意 SQL 語句。

2. 目的:SQL Injection 攻擊的目的是獲取敏感資料(如使用者名稱、密碼、信用卡資訊)、修改資料庫內容(如刪除資料、更改資料)或利用資料庫特性 (如資料庫管理權限)進行更多攻擊。

攻擊例子

考慮以下假想的使用者驗證查詢:

eis112 19 1

如果應用程式未對使用者輸入進行適當處理,攻擊者可以在 inputUsername 中插入惡意的 SQL 程式碼,如:

eis112 19 2

在這種情況下,應用程式未能區分使用者輸入和 SQL 程式碼,導致 SQL 語句變成:

eis112 19 3

這將使得該查詢始終返回 True(1=1 永遠成立),並忽略密碼的驗證,因此攻擊者可能成功登錄到系統中。

防範方法

1. 參數化查詢(Prepared Statements): 使用參數化查詢可以有效防止 SQL Injection 攻擊。通過參數化查詢,使用者 輸入會被視為參數而不是 SQL 程式碼的 一部分。

2. 預存程式(Stored Procedures):使用預存程式來執行資料庫操作,可以減少對動態 SQL 語句的需求,降低 SQL Injection 攻擊風險。

3. 正確的輸入驗證和過濾:對使用者輸入進行驗證和過濾,防止攻擊者插入惡意的 SQL 程式碼。

4. 最小權限原則(Least Privilege):確保資料庫連接的使用者僅具有必要的權限,減少攻擊者成功利用漏洞的機會。

5. 使用 ORM(Object-Relational Mapping): 使用 ORM 工具,如 Entity Framework (C#)、Hibernate(Java),可以幫助防範 SQL Injection 攻擊。

總結來說,防範 SQL Injection 攻擊的關鍵是保護您的應用程式不受到惡意 SQL 程式碼的影響,這需要正確的輸入驗證、適當 的資料庫操作和安全性最佳實踐。

以下是 JAVA 和 C# 中使用參數化查詢的範例:

1.JAVA(使用 JDBC):

eis112 19 4

2.C#(使用 NET):

eis112 19 5

弱點諮詢 第 3 名 CSRF

CSRF,跨站請求偽造(Cross-Site Request Forgery)是一種網路安全性漏洞 ,它利用使用者目前在其他網站上的驗證身份來執行未經授權的操作。攻擊者利用受害者的瀏覽器已驗證的會話(Session)來發送偽造的請求,從而執行未經授權的操作。

攻擊方法和目的

1. 偽造請求:攻擊者在受害者訪問的頁面中嵌入了惡意連結或腳本,該連結或腳本會觸發對受害者登錄狀態下的 另一個網站發送的請求,並使用受害者的身份驗證。攻擊者能夠利用這些偽造的請求執行操作,例如更改密碼、進行資金轉移、刪除帳戶等。

2. 隱藏的請求:攻擊者可能在圖片、表單或網站的其他元素中嵌入偽造請求,讓使用者在不知情的情況下發送這些請求。

3. 目的:攻擊者的目的可能是從受害者的帳戶中竊取資金、敏感資訊,或者執行損壞操作,破壞使用者體驗。

防範方法

1. CSRF Token (CSRF 權杖 ):在每個表單或請求中包含一個 CSRF Token, 該 Token 只有在網站上執行的操作中有 效。攻擊者無法獲取這個 Token,因此無法發送有效的偽造請求。

2. 同源策略(Same-Origin Policy):瀏覽器的同源策略限制了來自不同源(功能變數名稱、協議或埠)的網站的訪問, 可以幫助減少 CSRF 攻擊的風險。

3. 檢查 HTTP Referer:某些情況下,檢查 HTTP Referer Header 可以確保請求來自預期的來源。

4. 使用 CsrfShield 或類似工具:有些框架或函式庫提供了內建的防範 CSRF 攻擊的機制,例如 Django 的 CSRF 防護。

經常更新和測試: 定期更新您的程式碼、函式庫和框架,並定期進行安全測試以發現潛在的 CSRF 漏洞。

總之,CSRF 攻擊是一種常見的網路攻擊,開發人員應該採取措施來防範這種攻擊,確保使用者和資料的安全性。 各種程式語言都有相應的方法和函式可以幫助您避免 CSRF 弱點。以下是一些不同程式語言的修改範例,以防範 CSRF 攻 擊:

1. Python(使用 Django 框架):

eis112 19 6

在後端,Django 框架內建的 csrf_protect 裝飾器會處理 CSRF Token 的驗證。如果 CSRF Token 驗證失敗,Django 將會引發 CSRF 驗證失敗的異常。

2. JAVA(使用 Spring 框架):

在 Spring 框架中, 可以使用 <form: form> 標籤生成 CSRF Token,並且後端會自動處理驗證。

eis112 19 7

Spring 框架會自動處理 CSRF Token 的生成和驗證。

3. C# (ASP.NET Core):

在 ASP.NET Core 中,您可以使用內建的 CSRF 保護中間件來處理 CSRF Token 的生成和驗證。

eis112 19 8

弱點諮詢 第 2 名 Missing HSTS Header

Missing HSTS(HTTP Strict Transport Security)Header,是一種設定上的安全性弱點,指的是在 Web 服務器未配置 HTTP Strict Transport Security Header 的情況下,進行通信時缺乏對安全傳輸的強制要求。HSTS Header 旨在增強網站的安全性, 強制使用安全的 HTTPS 連接來防範某些攻擊,如中間人攻擊或 SSL/TLS 剝離攻擊。

攻擊方法和目的

1. 中間人攻擊(Man-in-the-Middle,MitM): 沒有 HSTS Header 的網站可能受到中間人攻擊的影響。在這種攻擊中,攻擊者可以截取通信流量,並將受害者重新轉址到不安全的 HTTP 連接,即使受害者試圖訪問的網站本應使用 HTTPS。攻擊者可能會在通信過程中竊取敏感資訊,如登錄認證、信用卡資料等。

2. SSL/TLS 剝離攻擊:或稱 HTTP 降級攻擊,沒有 HSTS Header 的網站容易 受到 SSL/TLS 剝離攻擊。在這種攻擊 中,攻擊者可能利用某些漏洞或技術, 將使用者的 HTTPS 連接轉換為不安全 的 HTTP 連接,從而竊取敏感資訊或篡 改資料。

防範方法

1.使用 HSTS Header:通過在 Web 服務器上配置 HSTS Header,您可以強制要求瀏覽器僅使用安全的 HTTPS 連接訪 問網站,從而防止以上提到的攻擊。

2. 啟用 HTTP 到 HTTPS 的重新導向 / 轉址:確保使用者訪問的所有 URL 都自動導向到 HTTPS 版本,從而降低 HTTP 連接的風險。

3. 定期檢查和測試:定期檢查您的網站是否正確配置了 HSTS Header,並進行安全測試,以確保網站能夠防範相關攻擊。

HSTS Header 是維持網站安全性的重要工 具之一,它可以幫助防範某些攻擊並確保使用者的隱私和資料安全。

以 Tomcat 設定 web.xml 為例:

eis112 19 9

這個 Header 告訴瀏覽器,在接下來的 31,536,000 秒(一年)內,使用 HTTPS 訪問該網站,包括所有子網域或子功能變數名稱。這將使得瀏覽器在接下來的一段時間內強制使用 HTTPS,並且當使用者首次訪問該網站時,瀏覽器會記住這個設置, 即使使用者嘗試使用 HTTP 訪問,瀏覽器也會自動將其重新轉址到 HTTPS 版本。

請注意,這個設置可能會因為不同的 Web 服務器和配置而有所不同。在實際應用中,您可能需要根據您使用的 Web 服務器或框架,以及安全性需求進行進一步的配置。

這是一個基本的範例,但在實際應用中, 您應該根據您的需求和環境對 HSTS 進行更精細的配置。該 Header 可以設置的參數包括 max-age(指定 HSTS 政策的持續時間)、includeSubDomains(指示瀏覽器將該政策套用到所有子網域或子功能變數名稱)、preload(將您的功能變數名稱新增到 HSTS preload 列表中, 讓瀏覽器預載 HSTS,強制使用 HTTPS Header)等。

弱點諮詢 第1名 XSS

XSS,指的是跨站腳本攻擊(Cross-Site Scripting),它允許攻擊者將惡意的客戶端腳本(通常是 JavaScript)注入到網頁中,然後被其他使用者瀏覽時執行。XSS 弱點的主要目的是在受害者的瀏覽器中執行惡意腳本,從而實現各種攻擊,包括以下情況:

攻擊方法和目的

1. 竊取會話資訊(Session Hijacking): 攻擊者可以通過 XSS 攻擊來竊取受害者的 Session ID,並以受害者身份執 行操作,例如更改密碼、發送訊息或執行其他操作。

2. 竊取個人資訊:攻擊者可以通過 XSS 來竊取受害者的個人資訊,例如使用者名稱、密碼、Cookie 等。

3. 網站重新導向 / 轉址:攻擊者可以通過 XSS 來將受害者重新導向到惡意網站, 從而進行釣魚攻擊或散佈惡意軟體。

4. 植入惡意廣告或詐騙或做為挖礦的肉機:攻擊者可以通過 XSS 將廣告或詐騙內容注入到受害者的網頁中,以實現廣告收益或各種詐騙。更甚者,受害者的主機可能被攻擊者接管,進而成為幫人挖礦的肉機。

5. 執行任意操作:攻擊者可以通過 XSS 在受害者的瀏覽器中執行任意操作, 從而對網站進行惡意竄改或破壞。

防範方法

1. 對輸入驗證和過濾:對於從使用者輸入的資料,應該進行驗證和過濾,以確保不允許惡意腳本注入。

2. 對輸出編碼:所有從使用者輸入或其他不可信來源輸出到網頁的資料應該經過適當的編碼處理,以防止腳本注入。

3. HTTP Header 設置:使用 HTTP Header 來禁用允許的內嵌內容,例如 Content Security Policy(CSP)。

4. 安全的 Cookie 管理:使用 HttpOnly 和 Secure 標誌來強化 Cookie 的安全性

各種程式語言都有相應的方法和函式可以幫助您避免 XSS 弱點。以下是一些不同程式語言的修改範例,以防範 XSS 攻擊:

1. JavaScript:

防範 XSS 攻擊的最直接方法是避免將使用者輸入的資料直接插入到 HTML 中。取而代之,您應該使用 JavaScript 的內建函數來將輸入資料進行編碼處理,例如使用 encodeURIComponent 或 encodeURI。 以下是一個簡單的範例:

eis112 19 10

2. Python(使用 Django 框架):

Django 框架提供了一個內建的 escape 模組系統, 它會自動將使用者輸入進行 HTML 編碼處理。這意味著您可以在 Django 模組中使用變數而不必擔心 XSS 攻擊。

eis112 19 11

3. PHP:

在 PHP 中,您可以使用 htmlspecialchars或 htmlentities 函數將使用者輸入的資料 進行 HTML 編碼處理。

eis112 19 12

小提醒:使用此函式進行處理時,忘別了 "ENT_QUOTES" 與 "UTF-8" 的設定,才能將單引號與雙引號都進行轉換與設定正確的編碼唷。

4. Java(使用 Spring 框架):

Spring 框架提供了 Thymeleaf 等範本引擎,它們可以自動處理 HTML 編碼。

eis112 19 13

5. C#:

在 C# 中,您可以使用 HttpUtility. HtmlEncode 函數來對使用者輸入的資料進行 HTML 編碼處理。

eis112 19 14

請注意,要使用 HttpUtility,您需要將 System.Web 命名空間添加引用, 並且確保代碼在 .NET Framework 項目中運行。如果您在 .NET Core 或 .NET 5+ 中工作, 可以使用 System.Net.WebUtility. HtmlEncode 函數, 而不需要添加 System.Web 作為引用。

另外一種是使用 System.Text.Encodings. Web 命名空間的 HtmlEncoder Class,或者,您可以使用 Razor 進行 HTML 編碼,每當您使用 @ 指示詞時,它會套用 HTML 屬性編碼規則。

eis112 19 15

總結

下篇內容深入探討 2023 年以來諮詢度最高的前五名弱點修復問題,提供深度的分析和防範方法。這些資安挑戰的背後蘊含企業在不斷演進的數位威脅環境中所面臨的現實,也突顯安全程式碼撰寫品質與人才培訓的重要性。這不僅僅是技術上的挑戰,更涉及在開發階段就應該強調的資安意識,源頭安全的程式碼撰寫品質與開發者的資安培訓成為防範日益複雜威脅的關鍵環節。 透過「揭曉 2023 原始碼掃描弱點 Top 10 修復指南」系列文章,期望為客戶提供實際且可行的資安建議,如有任何疑問或討論,歡迎與叡揚資安團隊的顧問或業務分享您的想法,期待與您共同努力,建構更安全的數位環境!

訂閱資安電子報>>>https://www.gss.com.tw/content-page/74-security-tools/3289-form-sub

加入資安官方 Line>>>https://liff.line.me/1645278921-kWRPP32q/?accountId=878wdgcf