iT邦幫忙

2023 iThome 鐵人賽

DAY 30
0
Security

道德駭客新手入門系列 第 30

Day 30 網站應用程式入侵 8

  • 分享至 

  • xImage
  •  

防禦注入攻擊

  • SQL Injection
  1. 限制使用者輸入的長度。
  2. 使用自訂的錯誤訊息。
  3. 監控資料庫流量,使用入侵偵測系統(IDS)和網路應用程式防火牆(WAF)。
  4. 停用命令,如 xp_cmdshell。
  5. 隔離資料庫伺服器和網頁伺服器。
  6. 總是使用 POST 方法屬性,並使用低權限帳號進行資料庫連線。
  7. 使用具有最少權限的權限運行資料庫服務帳號。
  8. 移動擴充儲存程序到一個獨立的伺服器。
  9. 使用類型安全的變數或函數,例如 isNumeric(),以確保類型安全性。
  10. 驗證和清理傳遞到資料庫的使用者輸入。
  11. 避免使用動態 SQL 或構建查詢時使用使用者輸入。
  12. 使用預先準備的陳述句、參數化查詢或儲存程序來存取資料庫。
  13. 顯示最低必要的資訊,使用 "RemoteOnly" 自訂錯誤模式在本機機器上顯示詳細錯誤訊息。
  14. 執行正確的轉義和字元過濾,以避免特殊字串字元和符號,如單引號(')。
  15. 總是邏輯上設定白名單,而不是黑名單,以避免不良程式碼。
  16. 使用物件關聯對映(ORM)框架,以使 SQL 結果集轉換為程式碼物件更一致。
  17. 使用弱點掃描程式來識別可能的入口點。
  18. 避免使用共享資料庫和相同帳號用於多個資料庫。
  19. 要求參與應用程式開發的人員考慮與 SQL 注入相關的所有風險。
  20. 總是使用最新版本的程式語言和技術進行開發。
  21. 定期更新和修補應用程式和資料庫伺服器。
  22. 依照供應商發布的指南,加強作業系統和應用程式。
  23. 停用資料庫不必要的功能。
  24. 定期稽核資料庫、記錄、權限和綁定條款。
  25. 使用動態網頁弱點掃描器掃描應用程式,以防止程式碼注入。
  26. 列舉條件陳述式中的授權值。
  • Command Injection Flaws
  1. 執行輸入驗證,確保接受的數據不包含惡意內容。
  2. 轉義危險字符,以防止它們被誤解為執行命令。
  3. 使用語言特定的庫,以避免與外部命令相關的問題。
  4. 執行輸入和輸出編碼,以確保數據的正確性。
  5. 使用安全的 API,完全避免使用解釋器。
  6. 結構化請求,確保所有提供的參數都被視為數據,而不是可執行內容。
  7. 使用參數化的 SQL 查詢。
  8. 從核心分離模塊化的 shell 呼叫。
  9. 使用內建庫函數,避免直接調用操作系統命令。
  10. 實施最低權限以限制執行操作系統命令的權限。
  11. 避免在沒有適當驗證和消毒的情況下執行命令,如 exec 或 system。
  12. 防止使用 PHP 內部使用 pcntl_fork 和 pcntl_exec 的 shell 解釋器。
  13. 在應用程式開發中,使用 Python 作為 Web 框架而不是 PHP。
  14. 使用動態網頁弱點掃描器掃描應用程式,以防止程式碼注入。
  15. 列舉在條件陳述式中的授權值。
  • LDAP Injection
  1. 對所有輸入數據執行類型、模式和域值驗證。
  2. 使LDAP篩選器盡可能具體。
  3. 驗證和限制返回給使用者的數據量。
  4. 在LDAP目錄中實施嚴格的訪問控制。
  5. 執行動態測試和源代碼分析。
  6. 清理所有用戶端輸入並轉義任何特殊字符。
  7. 避免通過串聯字符串來構建LDAP搜索篩選器。
  8. 使用AND篩選器來對相似條目實施限制。
  9. 使用LDAPS(LDAP over SSL)來加密和保護Web伺服器上的通信。
  10. 在具有最低權限的環境中設置LDAP綁定帳號。
  11. 配置LDAP以使用綁定驗證。
  12. 使用基於SaaS的測試服務來對抗LDAP注入攻擊。
  • File Injection
  1. 強化驗證使用者輸入。
  2. 考慮實施chroot jail,以限制檔案系統訪問權限。
  3. 對於PHP,禁用php.ini中的allow_url_fopen和allow_url_include。
  4. 對於PHP,禁用register_globals,使用E_STRICT來查找未初始化的變數。
  5. 確保所有檔案和流函數(stream_*)都經過仔細檢查。
  6. 為檔案和檔案路徑配置獨立的資料庫,並為每個路徑配置獨立的識別符號/ID,以避免中間人攻擊。
  7. 避免在默認目錄中執行檔案,啟用伺服器端通信的自動下載標頭選項。
  8. 檢查PHP包裝器,如PHP filter和PHP ZIP,以防止訪問本地伺服器文件系統中的敏感檔案。
  9. 在執行之前維護可接受的檔案類型和檔案大小限制的白名單。
  10. 使用網頁應用程式防火牆(WAF)作為伺服器上監控檔案注入攻擊的安全層。
  • Server-Side JS Injection
  1. 嚴格驗證使用者輸入,以確保輸入數據的合法性。
  2. 避免使用eval()函數來解析使用者輸入。
  3. 永遠不要使用具有相同效果的命令,如setTimeOut(),setInterval()和Function()。
  4. 使用JSON.parse()來解析JSON輸入,而不是eval()。
  5. 確保在函數的開頭包含"use strict",以在函數作用域內啟用嚴格模式。
  6. 僅接受短的字母數字字串作為使用者輸入。
  7. 不要使用代碼序列化。
  • Server-Side Include Injection
  1. 驗證使用者輸入,確保它不包含用於SSI指令的字符。
  2. 在執行使用者輸入之前,對其進行HTML編碼,以防止潛在的攻擊。
  3. 確保SSI指令僅應用在需要它們的網頁上,避免在不必要的地方使用它們。
  4. 避免使用具有文件擴展名,如.stm、.shtm和.shtml的網頁,以防止攻擊。
  5. 實施SUExec,以使用網頁文件的擁有者身份執行它們。
  6. 通過配置全局access.conf文件,使用OPTIONS IncludesNOEXEC來限制在目錄內執行SSI。
  • Server-Side Template Injection
  1. 不要使用使用者輸入來創建模板或將使用者輸入作為模板的參數。
  2. 如果業務需求支持使用者提交的模板,則使用簡單的模板引擎,例如Mustache或Python的模板。
  3. 查看模板引擎的文檔以獲得加固提示。
  4. 在受控環境中執行模板。
  5. 在可能的情況下,載入靜態模板文件。
  6. 確保將動態數據使用模板引擎的內置功能傳遞到模板中。
  7. 定期使用預定義的有效載荷以及內置模板表達式來檢查伺服器響應。
  8. 使用高度複雜且難以濫用的模板編程語言,如FreeMaker、Velocity、Smarty、Twig和Jade來開發模板。
  9. 確保模板字符串和變數永不結合在一起。
  • Log Injection
  1. 通過參數傳遞日誌代碼而不是訊息。
  2. 使用正確的錯誤代碼和易識別的錯誤訊息。
  3. 避免使用API調用來記錄操作,因為它們在瀏覽器網路呼叫中可見。
  4. 確保在記錄端點傳遞使用者ID或公開不可識別的輸入作為參數。
  5. 在伺服器端和客戶端都驗證輸入,並清理和替換惡意字符。
  6. 仔細檢查應用程式,以查找用於生成日誌的潛在弱點。
  7. 使用帶有額外元數據的每個日誌項目的前綴,將合法和虛假的日誌項目分開。
  8. 限制對實際日誌檔案的訪問。
  9. 使用適當的同步來控制執行流程。
  10. 使用靜態分析工具主動掃描日誌注入弱點。
  11. 避免使用具有解釋檔案中的控制字符能力的工具查看日誌。
  • HTML Injection
  1. 驗證所有使用者輸入,以去除使用者提供的文字中的HTML語法子串。
  2. 檢查輸入是否包含不希望的腳本或HTML代碼,例如,等。
  3. 使用安全解決方案,避免誤報並檢測可能的注入攻擊。
  4. 確保使用者輸出也經過編碼、檢查和驗證,並通過維護完整的資料驗證過程來處理使用者輸入和輸出。
  5. 教育開發團隊以及安全團隊,關於最常見的HTML注入攻擊和預防措施。
  6. 在伺服器端啟用HttpOnly標誌,以確保應用程式生成的所有cookie對客戶端使用者不可用。
  • CRLF Injection
  1. 使用函數來編碼CRLF特殊字符,避免在響應標頭中使用使用者輸入。
  2. 升級程式語言的版本,以防止CR和LF字符的注入。
  3. 重寫代碼,以確保使用者的內容不會直接用於HTTP流。
  4. 在將內容傳遞到HTTP標頭之前,檢查並刪除任何換行字串。
  5. 將傳遞到HTTP標頭的數據進行加密,以隱藏CR和LF代碼。
  6. 停用不需要的標頭。
  7. 在Web應用程式中配置XSSUrlFilter以防止CRLF注入攻擊。
  8. 利用工具,如htmlcleaner,來刪除腳本標籤,防禦CRLF注入攻擊。
  • XSS Attacks
  1. 對所有標頭、Cookies、查詢字符串、表單字段和隱藏字段(即所有參數)進行嚴格規範的驗證。
  2. 在設計階段廣泛使用測試工具,以在應用程式投入使用之前消除XSS漏洞。
  3. 使用Web應用程式防火牆來阻止惡意腳本的執行。
  4. 在顯示使用者輸入於搜索引擎和論壇之前,將所有非字母數字字符轉換為HTML字符實體。
  5. 對輸入和輸出進行編碼並過濾輸入中的元字符。
  6. 當涉及XSS時,不要相信使用HTTPS的網站。
  7. 通過過濾腳本輸出,可以防止XSS漏洞的傳播到用戶端。
  8. 實施公共金鑰基礎設施(PKI)進行身份驗證,以確保引入的腳本實際上是經過身份驗證的。
  9. 實施嚴格的安全策略。
  10. Web伺服器、應用伺服器和Web應用程式環境容易受到跨站腳本攻擊。從Web應用程式中識別並消除XSS漏洞是困難的。找到漏洞的最佳方法是對代碼進行安全審查,並在所有來自HTTP請求的輸入作為HTML輸出的地方搜索。
  11. 攻擊者使用各種HTML標記來傳輸惡意JavaScript。Nessus、Nikto等工具可以在某種程度上掃描這些漏洞。如果掃描發現網站中存在漏洞,則高度可能存在其他攻擊可能。
  12. 審查網站代碼以防禦XSS攻擊。通過審查代碼並與確切規格進行比較來檢查代碼的堅固性。檢查以下區域:標頭、Cookies、查詢字符串、表單字段和隱藏字段。在驗證過程中,絕對不能試圖識別活動內容,無論是通過刪除過濾器還是通過消毒。
  13. 有許多方法可以編碼已知的用於活動內容的過濾器。強烈建議使用“正向安全策略”,明確指定允許的內容和必須刪除的內容。基於負面或攻擊特徵的策略很難維護,因為它們不完整。
  14. 輸入字段應限制到最大大小,因為大多數腳本攻擊需要多個字符來啟動。
  15. 實施內容安全策略(CSP)以防止瀏覽器執行XSS攻擊。
  16. 在客戶端修改瀏覽器文檔時,使用上下文敏感編碼,以對抗DOM-XSS。
  17. 使用會話ID和時間戳,以防止攻擊者使用會話Cookie訪問客戶端帳戶信息。
  18. 在Web應用程式的源代碼開發階段使用自動化VAPT工具,以確保應用程式不包含已知漏洞。
  19. 使用內置安全篩選功能的瀏覽器來從客戶端阻止惡意腳本的執行。

對抗網頁應用程式攻擊

損壞訪問控制(Broken Access Control)的攻擊

  1. 在將授權的使用者重定向到所請求的資源之前,執行存取控制檢查。
  2. 避免使用不安全的識別標識,以防止攻擊者猜測它們。
  3. 提供會話超時機制,確保長時間不活動的會話會自動終止。
  4. 將檔案權限限制為授權使用者,以防止濫用。
  5. 避免使用客戶端快取機制,因為這可能導致資訊泄漏。
  6. 在使用者登出時,從伺服器端刪除會話令牌。
  7. 確保授予使用者的權限最低,僅允許執行必要的操作。
  8. 執行一次存取控制機制,然後在整個應用程式中重複使用它們。
  9. 實施默認拒絕策略,除了對於公共資源。
  10. 實施模型存取控制,記錄擁有權,而不允許使用者修改記錄。
  11. 定期對存取控制進行審計和測試,以發現漏洞,並確保控制是否正常運作。
  12. 確保僅信任伺服器端身份驗證,因為相同的控制已經為所有應用程式、使用者和服務實施。
  13. 啟用基於角色的存取控制(RBAC)以提高合規性。
  14. 確保網頁根目錄不包含任何元數據或備份檔案。
  15. 在使用者登出後,無效化伺服器上的有狀態會話標識。
  16. 限制跨源資源共享(CORS)協議的使用。

加密失敗/敏感數據曝露攻擊

  1. 不要創建或使用弱的加密算法。
  2. 離線生成加密金鑰,並安全地存儲它們。
  3. 確保存儲在磁盤上的加密數據不容易解密。
  4. 使用AES加密來存儲數據,使用TLS和HSTS(HTTP Strict Transport Security)來保護傳入流量。
  5. 對應用程式處理、存儲或傳輸的數據進行分類,並相應地應用控制措施。
  6. 使用符合PCI DSS標準的令牌化或截斷,以在不再需要時刪除數據。
  7. 使用正確的金鑰管理,確保所有金鑰都處於適當位置。
  8. 使用TLS與完美前向保密(Perfect Forward Secrecy,PFS)密碼,對所有傳輸中的數據進行加密。
  9. 禁用包含敏感信息的請求的快取技術。
  10. 避免在存儲空間上存儲未使用的重要數據,以避免曝露。
  11. 使用專門設計的算法來保護密碼存儲的安全性。
  12. 禁用高度敏感數據表單的自動填充選項。
  13. 在客戶端使用數據遮罩和自定義機密數據訪問規則之外,採用WAF安全層以提供額外的保護。
  14. 避免使用需要全局JSON載荷的API,這可能導致過多的數據曝露。
  15. 使用鹽化的哈希函數,如PBKDF2和Argon2,來存儲密碼。
  16. 只在需要實施時使用初始化向量(IV)和安全的隨機數生成器(CSPRNG)。
  17. 避免使用過時的哈希函數和填充技術,如MD5、SHA-1、PKCS v1和PKCS v1.5。
  18. 在加密存儲的數據時使用驗證加密技術,以實現機密性和數據完整性。

不安全的設計

  1. 威脅建模:
    • 實施威脅建模系統,以在威脅被利用之前檢測潛在威脅。威脅建模系統在應用程式開發過程中審查安全性和隱私需求。
    • 定期對要添加到應用程式中的每個模組和功能進行評估。
    • 設計用於流程驗證和驗證的測試,以防禦列出的威脅。
  2. 安全設計:
    • 實施安全設計,有助於通過自動評估和潛在威脅的測試來維護應用程式的適當安全性。
    • 確保已對應用程式中的錯誤進行驗證。應分析並記錄估計值。根據記錄的估計值,應實施適當的措施。
  3. 安全開發生命週期:
    • 實施安全開發生命週期,有助於滿足客戶需求,按照安全標準開發應用程式。
    • 確保開發和安全團隊在應用程式開發期間保持良好的溝通,以實施與應用程式相關的安全和隱私控制。

安全配置錯誤

  1. 配置所有安全機制並禁用所有未使用的服務。
  2. 設置角色、權限和帳戶,並禁用所有默認帳戶或更改其默認密碼。
  3. 掃描最新的安全漏洞並應用最新的安全補丁。
  4. 將非SSL請求重定向到SSL頁面,確保所有通信都加密以防止不足的傳輸層保護導致的攻擊。
  5. 對所有敏感的Cookie設置“secure”標誌。
  6. 配置SSL提供者僅支持強大的加密算法。
  7. 確保證書有效且未過期,並與網站使用的所有域名匹配。
  8. 後端和其他連接也應使用SSL或其他加密技術。
  9. 對每個階段,如開發、測試和生產,使用不同的憑據。
  10. 不要將不必要的功能、組件、示例和框架添加到應用程式中。
  11. 將應用程式架構分段,為每個組件和租戶提供個別的安全性。
  12. 實施自動化過程,檢查所有階段中配置和設置的有效性。

XML外部實體

  1. 避免處理包含對弱配置的XML解析器的外部實體引用的XML輸入。
  2. 必須以安全配置設置XML解結器。
  3. 使用安全配置的解析器解析文檔。
  4. 配置XML處理器以使用本地靜態DTD,並禁用XML文檔中包含的任何聲明的DTD。
  5. 實施白名單、輸入驗證、清潔和過濾技術,以防止XML文檔中包含惡意數據。
  6. 更新和打補丁最新的XML處理器和庫。
  7. 確保XML/XLS文件上傳功能通過XSD驗證來驗證XML。
  8. 使用安全工具,如API安全網關、互動應用程序安全測試(IAST)工具和Web應用程序防火牆(WAF),來識別和阻止XXE攻擊。
  9. 通過在源代碼中放置檢查點來監視應用程序的執行流程,以檢測並阻止XML處理。

上一篇
Day 29 網站應用程式入侵 7
系列文
道德駭客新手入門30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言