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