淺談OWASP TOP10
不安全的軟件正在破壞著我們的金融、醫療、國防、能源和其他重要的基礎設施。隨著我們的軟件變得愈加重要、復雜且相互關聯,實現應用程序安全的難度也呈指數級增長。而現代軟件開發過程的飛速發展,使得快速、準確地識別軟件安全風險變得愈發的重要。
1. 注入
將不受信任的數據作為命令或查詢的一部分發送到解析器時,會產生諸如SQL注入、NoSQL注入、OS注入和LDAP注入的注入缺陷。攻擊者的惡意數據可以誘使解析器在沒有適當授權的情況下執行非預期命令或訪問數據。
如何防止:
- 防止注入漏洞需要將數據與命令語句、查詢語句分隔開來。
- 最佳選擇是使用安全的API,完全避免使用解釋器,或提供參數化界面的接口,或遷移到ORM或實體框架。
- 使用正確的或“白名單”的具有恰當規范化的輸入驗證方法同樣會有助于防止注入攻擊,但這不是一個完整的防御,因為許多應用程序在輸入中需要特殊字符,例如文本區域或移動應用程序的API。
- 對于任何剩余的動態查詢,可以使用該解釋器的特定轉義語法轉義特殊字符。OWASP的JavaEncoder和類似的庫提供了這樣的轉義例程。
- 在查詢中使用LIMIT和其他SQL控件,以防止在SQL注入時大量地泄露記錄。
2. 失效的身份認證
通常,通過錯誤使用應用程序的身份認證和會話管理功能,攻擊者能夠破譯密碼、密鑰或會話令牌,或者利用其它開發缺陷來暫時性或永久性冒充其他用戶的身份。
如何防止:
- 在可能的情況下,實現多因素身份驗證,以防止自動、憑證填充、暴力破解和被盜憑據再利用攻擊。
- 不要使用發送或部署默認的憑證,特別是管理員用戶。
- 執行弱密碼檢查,例如測試新或變更的密碼,以糾正“排名前10000個弱密碼”列表。
- 修改密碼復雜度策略,密碼由大/小寫字母+特殊字符+數字組成,長度大于8位,定期90天修改密碼。
- 確認注冊、憑據恢復和API路徑,通過對所有輸出結果使用相同的消息,用以抵御賬戶枚舉攻擊。
- 限制或逐漸延遲失敗的登錄嘗試。記錄所有失敗信息并在憑據填充、暴力破解或其他攻擊被檢測時提醒管理員。
- 使用服務器端安全的內置會話管理器,在登錄后生成高度復雜的新隨機會話ID。會話ID不能在URL中,可以安全地存儲和當登出、閑置、絕對超時后使其失效。
3. 敏感數據泄露
許多Web應用程序和API都無法正確保護敏感數據,例如:財務數據、醫療數據和PII數據。攻擊者可以通過竊取或修改未加密的數據來實施信用卡詐騙、身份盜竊或其他犯罪行為。未加密的敏感數據容易受到破壞,因此,我們需要對敏感數據加密,這些數據包括:傳輸過程中的數據、存儲的數據以及瀏覽器的交互數據。
如何防止:
- 對系統處理、存儲或傳輸的數據分類,并根據分類進行訪問控制。
- 熟悉與敏感數據保護相關的法律和條例,并根據每項法規要求保護敏感數據。
- 對于沒必要存放的、重要的敏感數據,應當盡快清除,或者通過PCIDSS標記或攔截。未存儲的數據不能被竊取。
- 確保存儲的所有敏感數據被加密。
- 確保使用了最新的、強大的標準算法或密碼、參數、協議和密匙,并且密鑰管理到位。
- 確保傳輸過程中的數據被加密,如:使用TLS。確保數據加密被強制執行,如:使用HTTP嚴格安全傳輸協議(HSTS)。
- 禁止緩存對包含敏感數據的響應。
- 確保使用密碼專用算法存儲密碼,如:Argon2、scrypt、bcrypt或者PBKDF2。將工作因素(延遲因素)設置在可接受范圍。
- 單獨驗證每個安全配置項的有效性。
4. XML外部實體(XXE)
當開發人員暴露一個對內部實現對象的引用時,例如,一個文件、目錄或者數據庫密匙,就會產生一個不安全的直接對象引用。在沒有訪問控制檢測或其他保護時,攻擊者會操控這些引用去訪問未授權數據。許多較早的或配置錯誤的XML處理器評估了XML文件中的外部實體引用。攻擊者可以利用外部實體竊取使用URI文件處理器的內部文件和共享文件、監聽內部掃描端口、執行遠程代碼和實施拒絕服務攻擊。
如何防止:
- 盡可能使用簡單的數據格式(如:JSON),避免對敏感數據進行序列化。
- 及時修復或更新應用程序或底層操作系統使用的所有XML處理器和庫。同時,通過依賴項檢測,將SOAP更新到1.2版本或更高版本。
- 在應用程序的所有XML解析器中禁用XML外部實體和DTD進程。
- 在服務器端實施積極的(“白名單”)輸入驗證、過濾和清理,以防止在XML文檔、標題或節點中出現惡意數據。
- 驗證XML或XSL文件上傳功能是否使用XSD驗證或其他類似驗證方法來驗證上傳的XML文件。
- 盡管在許多集成環境中,手動代碼審查是大型、復雜應用程序的最佳選擇,但是SAST工具可以檢測源代碼中的XXE漏洞。
5. 失效的訪問控制
未對通過身份驗證的用戶實施恰當的訪問控制。攻擊者可以利用這些缺陷訪問未經授權的功能或數據,例如:訪問其他用戶的帳戶、查看敏感文件、修改其他用戶的數據、更改訪問權限等。
如何防止:
- 除公有資源外,默認情況下拒絕訪問。
- 使用一次性的訪問控制機制,并在整個應用程序中不斷重用它們,包括最小化CORS使用。
- 建立訪問控制模型以強制執行所有權記錄,而不是接受用戶創建、讀取、更新或刪除的任何記錄。
- 域訪問控制對每個應用程序都是唯一的,但業務限制要求應由域模型強制執行。
- 禁用Web服務器目錄列表,并確保文件元數據(如:git)不存在于Web的根目錄中。
- 記錄失敗的訪問控制,并在適當時向管理員告警(如:重復故障)。
- 對API和控制器的訪問進行速率限制,以最大限度地降低自動化攻擊工具的危害。
- 當用戶注銷后,服務器上的JWT令牌應失效。
6. 安全配置錯誤
安全配置錯誤是最常見的安全問題,這通常是由于不安全的默認配置、不完整的臨時配置、開源云存儲、錯誤的HTTP標頭配置以及包含敏感信息的詳細錯誤信息所造成的。因此,我們不僅需要對所有的操作系統、框架、庫和應用程序進行安全配置,而且必須及時修補和升級它們。
如何防止:
- 一個可以快速且易于部署在另一個鎖定環境的可重復的加固過程。開發、質量保證和生產環境都應該進行相同配置,并且,在每個環境中使用不同的密碼。這個過程應該是自動化的,以盡量減少安裝一個新安全環境的耗費。
- 搭建最小化平臺,該平臺不包含任何不必要的功能、組件、文檔和示例。移除或不安裝不適用的功能和框架。
- 檢查和修復安全配置項來適應最新的安全說明、更新和補丁,并將其作為更新管理過程的一部分。
- 一個能在組件和用戶間提供有效的分離和安全性的分段應用程序架構,包括:分段、容器化和云安全組。
- 向客戶端發送安全指令,如:安全標頭。
- 在所有環境中能夠進行正確安全配置和設置的自動化過程。
7. 跨站腳本(XSS)
當應用程序的新網頁中包含不受信任的、未經恰當驗證或轉義的數據時,或者使用可以創建HTML或JavaScript的瀏覽器API更新現有的網頁時,就會出現XSS缺陷。XSS讓攻擊者能夠在受害者的瀏覽器中執行腳本,并劫持用戶會話、破壞網站或將用戶重定向到惡意站點。
如何防止:
- 使用設計上就會自動編碼來解決XSS問題的框架,如:Ruby3.0或ReactJS。了解每個框架的XSS保護的局限性,并適當地處理未覆蓋的用例。
- 為了避免反射式或存儲式的XSS漏洞,最好的辦法是根據HTML輸出的上下文(包括:主體、屬性、JavaScript、CSS或URL)對所有不可信的HTTP請求數據進行恰當的轉義。
- 在客戶端修改瀏覽器文檔時,為了避免DOMXSS攻擊,最好的選擇是實施上下文敏感數據編碼。
- 使用內容安全策略(CSP)是對抗XSS的深度防御策略。如果不存在可以通過本地文件放置惡意代碼的其他漏洞(例如:路徑遍歷覆蓋和允許在網絡中傳輸的易受攻擊的庫),則該策略是有效的。
8. 不安全的反序列化
不安全的反序列化會導致遠程代碼執行。即使反序列化缺陷不會導致遠程代碼執行,攻擊者也可以利用它們來執行攻擊,包括:重播攻擊、注入攻擊和特權升級攻擊。
如何防止:
- 執行完整性檢查,如:任何序列化對象的數字簽名,以防止惡意對象創建或數據篡改。
- 在創建對象之前強制執行嚴格的類型約束,因為代碼通常被期望成一組可定義的類。繞過這種技術的方法已經被證明,所以完全依賴于它是不可取的。
- 如果可能,隔離運行那些在低特權環境中反序列化的代碼。
- 記錄反序列化的例外情況和失敗信息,如:傳入的類型不是預期的類型,或者反序列處理引發的例外情況。
- 限制或監視來自于容器或服務器傳入和傳出的反序列化網絡連接。
- 監控反序列化,當用戶持續進行反序列化時,對用戶進行警告。
9. 使用含已知漏洞的組件
組件(例如:庫、框架和其他軟件模塊)擁有和應用程序相同的權限。如果應用程序中含有已知漏洞的組件被攻擊者利用,可能會造成嚴重的數據丟失或服務器接管。同時,使用含有已知漏洞的組件的應用程序和API可能會破壞應用程序防御、造成各種攻擊并產生嚴重影響。
如何防止:
- 移除不使用的依賴、不需要的功能、組件、文件和文檔。
- 利用如versions、DependencyCheck、retire.js等工具來持續的記錄客戶端和服務器端以及它們的依賴庫的版本信息。持續監控如CVE和NVD等是否發布已使用組件的漏洞信息,可以使用軟件分析工具來自動完成此功能。訂閱關于使用組件安全漏洞的警告郵件。
- 僅從官方渠道安全的獲取組件,并使用簽名機制來降低組件被篡改或加入惡意漏洞的風險。
- 監控那些不再維護或者不發布安全補丁的庫和組件。如果不能打補丁,可以考慮部署虛擬補丁來監控、檢測或保護。
10. 不足的日志記錄和監控
不足的日志記錄和監控,以及事件響應缺失或無效的集成,使攻擊者能夠進一步攻擊系統、保持持續性或轉向更多系統,以及篡改、提取或銷毀數據。大多數缺陷研究顯示,缺陷被檢測出的時間超過200天,且通常通過外部檢測方檢測,而不是通過內部流程或監控檢測。
如何防止:
- 確保所有登錄、訪問控制失敗、輸入驗證失敗能夠被記錄到日志中去,并保留足夠的用戶上下文信息,以識別可疑或惡意帳戶,并為后期取證預留足夠時間。
- 確保日志以一種能被集中日志管理解決方案使用的形式生成。
- 確保高額交易有完整性控制的審計信息,以防止篡改或刪除,例如審計信息保存在只能進行記錄增加的數據庫表中。
- 建立有效的監控和告警機制,使可疑活動在可接受的時間內被發現和應對。