七個常見的Java應用安全陷阱及應對
Java應用程序已經成為黑客經常攻擊的目標,畢竟,它涉及的組件太多:服務器端邏輯、客戶端邏輯、數據存儲、數據傳輸、API及其他組件,確保所有組件安全無疑困難重重。實際上,23%的.NET應用程序存在嚴重漏洞,而44%的Java應用程序存在嚴重漏洞。
Java應用安全方面的挑戰有很多,不過,本文列舉了七個較常見的典型安全陷阱,如果企業安全團隊意識到Java應用程序中可能存在漏洞,先試著從這幾個方面著手開展工作,可能會更容易、更快捷發現并消除問題。
XXE攻擊
如果網絡攻擊者利用可擴展標記語言(XML)解析器讀取服務器上的任意文件,會出現這種攻擊。隨后他們可以部署XML外部實體(XXE),以檢索獲取用戶信息、配置文件甚至云環境的憑證。大多數Java XML解析器默認啟用XXE要求,因此企業安全人員應該主動禁用XXE以避免XXE攻擊。
不安全的反序列化
在序列化過程中,編程語言中的對象被轉換成可以保存到數據庫或通過網絡傳輸的格式。反序列化過程中則出現相反的情況,即序列化的對象從文件或網絡中讀取,因此可以將其轉回成對象。然而,黑客會尋找不安全的反序列化漏洞,以便可以操縱序列化對象,發起身份驗證繞過、拒絕服務或任意代碼執行等攻擊。為防止出現這種情況,安全人員需要打上最新補丁,并確保第三方代碼符合防御標準,因為許多不安全的反序列化漏洞通過依賴項引入。
遠程代碼執行
黑客經常在受害者的機器上執行遠程代碼(RCE),常常通過命令注入漏洞來實現:用戶輸入直接與系統命令相關聯。因為應用程序無法區分用戶輸入和系統命令,所以會將用戶輸入作為代碼來執行,這讓黑客得以在機器上執行任意命令。最有效的對策是列出一份有效的許可名單,這將確保形成穩健的輸入驗證機制。
SQL注入
籠統地講,當應用程序無法正確區分不受信任的用戶數據和合法/有效代碼時,就會出現注入。在操作系統命令中,這會導致命令注入。以結構化查詢語言(SQL)注入為例,攻擊者注入數據以操縱SQL命令。如果應用程序無法正確驗證用戶輸入,攻擊者將會插入為SQL語言指定的字符,以破壞查詢邏輯,并執行任意SQL代碼。他們可以利用受感染的查詢結構來篡改或竊取數據,及/或在操作系統中執行任意命令。為此可以預編譯SQL語句,以便嚴格提供插入到語句來執行的參數(或變量/輸入)。
NoSQL注入
NoSQL數據庫不使用SQL語言。在NoSQL注入期間,黑客會將數據注入到數據庫語言邏輯中,以啟用身份驗證繞過和RCE。MongoDB、Couchbase、Cassandra、HBase及其他NoSQL數據庫容易受到這類攻擊。NoSQL查詢語法針對特定的數據庫,查詢常常用應用程序的編程語言來編寫。因此,必須采用針對特定數據庫的方法來阻止NoSQL注入。
LDAP注入
輕量級目錄訪問協議(LDAP)使開發人員能夠查詢有關系統用戶和設備的目錄服務。但是當應用程序在這些查詢中允許不受信任的輸入時,黑客可以提交精心設計的輸入,以繞過身份驗證,并篡改存儲在目錄中的數據。設置參數化查詢在這里同樣會起到有效的預防作用。
日志注入
安全團隊依靠系統日志來檢測網絡中的惡意活動。攻擊者也意識到這一點,會在攻擊期間篡改日志文件以掩飾行蹤,通過典型的日志注入,他們可以誘騙應用程序在日志文件中寫入虛假條目。比如,攻擊者可能會尋找那些不清理寫入到日志輸入內容中換行符的應用程序,引入自己的換行符,并插入新的應用程序日志條目。或者將惡意HTML注入到日志條目中,對監管日志的管理員的瀏覽器發起跨站點腳本(XSS)攻擊。
為避免出現這種情況,企業安全人員需要在每個日志條目前加上時間戳、進程ID、主機名及其他形式的元數據,以此區分真實日志條目和虛假日志條目。在采用零信任原則時,應該將日志文件內容視為不受信任的輸入,除非輸入完全通過了驗證,否則不能允許訪問和操作。
參考鏈接:https://sdtimes.com/java/how-to-avoid-the-top-7-java-security-pitfalls/