OWASP TOP 10 - 2021
網站常見 漏洞修補建議
可以的話,建議在程式碼方面做修復或者防堵,雖然防火牆是必須的,但是不代表只靠防火牆是安全的,防火牆是有機會可以被繞過的,因此,想要解決根本問題請盡量從修補程式碼或者相關設定檔做起。
OWASP TOP 10
A01 權限控制失效
通常又稱,無效的存取控制,修補方式大概如下
留言 編輯此處
審查和更新權限策略:
首先,仔細審查您應用程序的權限策略。確保只有授權的用戶能夠執行特定操作或訪問特定資源。如果發現了不正確的授權或不足的授權,請立即修正。實施強大的身份驗證和授權機制:
確保您的應用程序使用堅固的身份驗證機制,以確保只有合法的用戶能夠登錄。授權應該基於用戶的身份和角色,並且應該嚴格執行。最小特權原則:
應用最小特權原則,即給予用戶最小必要權限來執行其工作。這可以通過角色和權限管理實現。實現強大的會話管理:
確保會話管理是堅固的,並避免會話漏洞。這可以包括適當的會話過期策略、用戶登出功能和防止會話固定攻擊的措施。對敏感操作進行二次驗證:
對於重要或敏感操作,實施二次驗證,以確保用戶真正授權執行這些操作。
A02 加密機制失效
選擇適當的加密演算法:
確保您使用的加密演算法是安全且合適的。不安全的加密演算法或已經被破解的演算法應該被替換為更安全的選項。常見的安全加密演算法包括AES、RSA和SHA-256等。更新加密庫和工具:
確保您使用的加密庫和工具是最新版本,包括操作系統本身的加密元件。及時更新可以修復已知的漏洞和安全問題。金鑰管理:
確保金鑰的生成、存儲和分發是安全的。使用強密碼來保護金鑰,並定期輪換金鑰,以減少潛在的風險。加強加密設置:
檢查您的加密設置,確保使用適當的加密模式和參數。例如,在使用AES時,選擇適當的區塊密碼模式(如CTR或GCM),並確保使用強大的初始化向量(IV)。金鑰保護:
保護金鑰的機密性,確保只有授權的人能夠訪問它們。使用硬件安全模組(HSM)來存儲關鍵金鑰可以提高安全性。
A03 注入式攻擊
XSS (Cross-site scripting)
PHP的話可以用內建函數htmlspecialchars()來預防XSS輸入驗證:
對所有輸入數據進行嚴格的驗證,包括來自用戶的數據。確保只有符合預期格式的數據才能被接受。輸出編碼:
在將用戶輸入的數據插入到HTML、JavaScript、CSS或URL中之前,使用合適的輸出編碼方式。這可以通過內置函數(如PHP的htmlspecialchars())來實現,不要使用前端(如JavaScript)來阻擋,因為這是可以被繞過的。不要信任用戶輸入:
不要將用戶輸入視為可信任的。即使數據看起來無害,也應該經過適當的處理和編碼。避免使用innerHTML:
盡量避免使用innerHTML將用戶輸入的數據插入到HTML中,優先使用textContent或innerText。HTTP Only Cookie標誌:
將敏感信息存儲在帶有HTTP Only標誌的Cookie中,以防止客戶端JavaScript訪問它們。Content Security Policy(CSP):
實施CSP,限制允許加載的資源和執行的腳本。腳本過濾:
使用過濾器或WAF(Web應用程式防火牆)來檢測和過濾惡意腳本。這可以在應用程序層面捕捉和阻止XSS攻擊。字元過濾:
過濾特定特殊符號,但是過濾不乾淨可能依舊導致漏洞產生。
SQL injection
PHP的話可以用PDO框架來預防SQL injection。使用參數化查詢:
使用參數化查詢或預處理語句來處理SQL查詢,而不是將用戶輸入的數據直接插入到SQL語句中。這可以防止攻擊者通過操縱輸入來注入惡意SQL。使用ORM框架:
使用ORM(對象關係映射)框架,這些框架通常會自動處理參數化查詢,減少了SQL注入的風險。避免拼接SQL字符串:
絕對不要通過拼接用戶輸入的數據來構建SQL字符串。這是SQL注入的主要來源之一。請使用參數化查詢。最小特權原則:
為您的數據庫用戶授予最小的必要權限,以限制攻擊者在發生SQL注入時可以進行的操作。過濾和驗證輸入:
對用戶輸入的數據進行過濾和驗證,以確保它符合預期的格式和範圍。但不要依賴過濾和驗證來防止SQL注入,這只是一個額外的安全層。安全配置:
設置您的數據庫和Web伺服器以最大程度地減少攻擊面。關閉不必要的服務和功能,並確保安全性配置設置正確。使用Web應用程式防火牆(WAF):
使用WAF可以檢測和阻止SQL注入攻擊,作為額外的安全層。
Command injection
不信任用戶輸入:
當處理用戶輸入時,始終不信任用戶提供的數據。
輸入驗證是防止命令注入的第一道防線。驗證輸入是否合法,並且僅接受預期的數據。使用參數化查詢:
在執行命令或SQL查詢時,使用參數化的方式,而不是將用戶輸入直接插入命令字符串中。
這可以防止攻擊者將恶意命令插入到您的命令中。限制命令的執行權限:
在系統上限制應用程序執行的命令的權限,僅賦予最小必要權限。
確保應用程序運行在受限的用戶或群組下,以降低攻擊者能夠執行的命令。避免使用外部輸入作為命令的一部分:
不要將來自不信任來源的數據作為命令的一部分。
如果必須使用外部數據,請確保嚴格過濾和清理它。
A04 不安全設計
安全架構設計:
重新評估應用程序的架構,確保安全性是整個設計的一部分。
使用多層次安全模型,包括防火牆、入侵檢測系統(IDS)、權限控制和身份驗證機制。
數據分類和保護:
將數據根據其敏感性進行分類,確保適當的數據保護措施應用於每個類別。
使用加密來保護敏感數據的儲存和傳輸。
身份驗證和授權:
實施強大的身份驗證機制,確保只有授權的用戶能夠訪問應用程序。
使用最小特權原則,僅授予用戶所需的權限,以降低攻擊風險。
輸入驗證和輸出編碼:
對用戶輸入的數據進行嚴格的驗證,以確保它是合法且安全的。
在輸出數據到瀏覽器時使用適當的輸出編碼,以防止跨網站腳本(XSS)攻擊。
安全的API設計:
如果您的應用程序包括API,確保API設計具有適當的身份驗證和授權機制,並實施限流和速率限制。
使用OAuth等標準協議來保護API訪問。
A05 安全設定缺陷
審查和更新設定:
定期審查應用程序和系統的安全設定,確保它們仍然符合最佳實踐和安全需求。
儘早應用安全補丁,以修補已知的安全漏洞。
最小特權原則:
確保每個用戶、進程或服務僅獲得其所需的最小權限,以降低攻擊風險。
僅啟用需要的服務和功能,關閉不必要的服務。
密碼和身份驗證設定:
使用強大的密碼政策,要求用戶使用長、複雜、並且定期更換的密碼。
實施多因素身份驗證,特別是對於訪問敏感資源的用戶。
防火牆和安全群組:
使用防火牆和安全群組來限制流量,只允許來自信任來源的流量進入系統。
定期審查防火牆規則,以確保它們仍然符合應用程序的需求。
加密和傳輸設定:
使用SSL/TLS來保護數據在傳輸過程中的安全性。
確保加密密鑰和證書的安全存儲和管理。
A06 危險或過舊的元件
保持元件最新:
定期檢查您的應用程序和系統中使用的元件,包括庫、框架和軟體包。
訂閱元件的安全公告,以確保您獲得有關已知漏洞和更新的信息。
及時應用安全補丁和更新,以修補已知的漏洞。
自動化元件管理:
使用自動化工具來監控和更新元件。這些工具可以幫助您及時檢測和應用安全更新。
考慮使用軟體組態管理工具,以管理和自動更新元件。
替換不再維護的元件:
如果某個元件已經不再維護,或者無法獲得安全更新,請考慮替換它,以選擇一個更安全和維護的替代方案。
元件漏洞掃描:
使用元件漏洞掃描工具,檢查您的應用程序中是否存在已知漏洞的元件。
解決掃描結果中的漏洞,並確保及時應用相關的安全更新。
最小化元件使用:
僅使用您應用程序需要的元件,避免不必要的元件。減少元件的數量可以降低攻擊面。
定期審查和清理未使用的或不必要的元件。
A07 認證及驗證機制失效
嚴格的身份驗證:
實施強大的身份驗證機制,確保只有授權的用戶能夠訪問應用程序或系統。
考慮使用多因素身份驗證(例如,密碼加上一次性驗證碼)來提高安全性。
密碼政策:
使用強大的密碼政策,要求用戶使用長、複雜、並且定期更換的密碼。
防止用戶使用容易猜測的密碼(例如,“123456"或"password”)。
帳戶鎖定:
實施帳戶鎖定策略,以限制失敗登錄嘗試的次數,從而防止暴力破解攻擊。
提供安全的方法來解鎖帳戶,例如通過電子郵件或短信驗證。
會話管理:
管理用戶會話,確保它們在不使用後適當地終止,避免長時間的無操作會話。
考慮實施單一登錄(SSO)機制,以提供用戶方便的訪問,同時保持安全性。
授權機制:
使用適當的授權機制來確保用戶僅能訪問他們有權訪問的資源和功能。
總是在用戶試圖訪問特定資源之前檢查其授權。
會話令牌安全性:
如果您使用會話令牌(如JWT),確保它們受到適當的簽名和加密保護。
不要在令牌中包含敏感信息。
A08 軟體及資料完整性失效
加強存取控制:
實施強大的存取控制機制,確保只有授權的用戶能夠訪問敏感資源和功能。
使用角色和權限管理,並確保用戶僅獲得他們所需的最小權限。
使用數字簽名:
使用數字簽名來驗證數據和軟體的完整性。這可以確保數據未經更改且來自可信任的來源。
在資料傳輸中使用SSL/TLS等協議,以保護數據的完整性。
實施安全的更新管理:
定期檢查軟體和系統的更新,以確保它們是最新的且安全的版本。
儘早應用安全補丁,以修補已知的漏洞。
數據備份和恢復:
定期備份重要數據,並確保備份是可用和可靠的。
測試數據恢復流程,以確保在數據損壞或損失時可以迅速恢復。
最小化用戶許可權:
僅授予用戶他們所需的最小許可權,以降低未經授權的更改風險。
限制用戶對系統設置的訪問,特別是敏感設置。
A09 資安記錄及監控失效
設計完善的監控系統:
確保您的應用程式和系統有適當的監控機制,可以記錄重要的安全事件和活動。
使用監控工具來即時監控系統的效能和安全狀態。
規定合適的監控指標:
確定哪些安全事件和指標對您的組織很重要,並設定相應的警報。
監控登入事件、使用者活動、網路流量和資源存取等。
實施日誌和事件管理:
啟用全面的日誌記錄,包括安全事件、系統事件和應用程式事件。
確定記錄到集中式系統以便於管理和分析。
自動警報和通知:
設定自動警報和通知,以便在發現異常或潛在的安全事件時立即採取行動。
確定有適當的流程來處理警報和通知。
安全資訊和事件管理(SIEM):
考慮使用SIEM工具來整合、分析和報告安全事件,以便更好地理解和回應潛在的威脅。
SIEM可以幫助您實現全面的安全監控。
測試監控系統:
定期測試監控系統,確保能夠準確偵測安全事件。
進行攻擊模擬和漏洞掃描,以評估監控系統的有效性。
A10 伺服端請求偽造
SSRF
白名單授權的URL:定義一個白名單,包含允許訪問的外部URL。在SSRF攻擊中,只允許訪問這些受信任的URL,並拒絕所有其他URL。
使用應用程序級的隔離:在應用程序層面實施隔離措施,以確保應用程序內部的代碼無法訪問應用程序外部的資源。這可能涉及沙箱化技術或使用安全代理。
限制協議和端口:限制允許訪問的協議(如HTTP、HTTPS)和端口。這有助於防止攻擊者通過其他危險的協議或端口進行攻擊。
請求驗證:對從用戶收到的所有請求進行驗證,以確保它們不包含惡意的URL。這可能包括檢查URL的結構、主機名和路徑等。
降級訪問權限:為應用程序內部的代碼配置最小的權限,以防止它們進行未經授權的外部訪問。
使用代理:如果需要從應用程序內部訪問外部資源,則使用代理來過濾和控制訪問。這可用於監視和記錄請求,並檢查它們是否安全。
其餘常見攻擊利用弱點
LFI (本地檔案引入)
如果是PHP的話,可以使用類似下方寫法預防
ini_set('open_basedir','./');
ini_set('allow_url_include','off');輸入驗證和過濾:
對所有輸入資料(包括URL參數、表單輸入、Cookie等)進行嚴格的驗證和過濾,以防止攻擊者嘗試填滿惡意檔案路徑。文件路徑白名單:
建立一個白名單,上市允許被包含的文件或目錄,並確保只有這些文件或目錄可以被包含。拒絕包含任何在白名單之外的文件。使用安全程式語言和框架:
使用具有安全性內建功能的程式語言和Web應用框架,例如Python的Django、Ruby on Rails等。這些框架通常會提供一些機制保護來防止LFI漏洞。不要將使用者輸入直接初始化檔案路徑:
永遠不要將使用者提供的資料直接安裝文件路徑。如果需要使用使用者提供的輸入來定位文件,請確保使用安全的方法來建立文件路徑,例如使用白名單或相對路徑。限製檔案存取權限:
設定和檔案系統的存取權限,確保只有授權使用者才可以存取檔案。避免使用過多伺服器的檔案權限設定。
弱密碼
又稱弱口令,把密碼改複雜一點就好,並且可以的話最好加上 captcha。
複雜的標準為如下,達成項目越多複雜度越高英文大小寫
數字
符號
至少12碼