開源組件漏洞
常見的有Structs2 遠程命令執行漏洞、COMMONS FILEUOLOAD 遠程拒絕服務漏洞、FASTJSON 遠程命令執行漏洞、APACHE SHIRO 遠程命令執行漏洞,具體的漏洞列表及單個解決方案可以參見各個組件官網說明。
解決方案
1、實際開發中建議采用通用研發組件,統一組件使用及引用規范。
2、將可信的參數預定義到一個map中,在需要時進行匹配,當匹配不到時,就按默認的執行。
源代碼安全漏洞
1、語言自身漏洞
常見類型:
Java 原生態反序列化漏洞:反序列化將字節流還原成對象,如果應用對不可信數據進行了反序列化處理,攻擊者可以通過構造惡意輸入,讓反序列化產生非預期的對象,可能帶來任意代碼執行。
2、業務邏輯漏洞
1)越權類漏洞
安全缺陷:攻擊者可以越權操作(增刪查改)其他用戶的數據。信息安全三要素:保密性、完整性、可用性。這三個要素越權都能破壞:查看破壞保密性, 修改破壞完整性,刪除破壞可用性。
常見類型:
水平越權
同級別權限的用戶訪問其他用戶的資源。操作服務端數據時,服務端未驗證數據是否歸屬於請求用戶,使得攻擊者可操作其他用戶數據,導致水平越權漏洞。
垂直越權
低級別權限的用戶訪問高級別權限的資源,又稱為權限提升,主要是由於應用程序沒有做權限控制或僅通過JS在前端進行權限控制,導致攻擊者猜測到管理頁面或繞過前端驗證達到權限提升的目的。常出現在后台管理中。
測試方法:
換Cookie:使用兩個賬號的cookie或者直接切換賬號,發送同一個請求包,看相應內容是否相同
換資源ID:關注有特定標識字段的接口,修改該字段的值為非本用戶的id,看是否得到響應
解決方案:
開啟業務鑒權。如下兩種場景:
1、據當前登錄用戶信息進行業務處理
關鍵在於
a、使用正確的方式獲取用戶pin :禁止從Get、Post 參數、Cookie 參數以及Header 頭中獲取pin 的值,所有獲取當前用戶身份的方式都應該從session中獲取,不以任何客戶端傳遞的明文數據作為鑒權方式。
b、對用戶的權限進行校驗:任何和賬戶相關的增刪改查都要用當前用戶身份去約束。
2、基於業務資源數據進行業務處理的場景
建議
a、安全編碼
b、業務系統設計關鍵編號應設計為不可預測類型(如UUID),盡量避免使用遞增數字類型編號,用戶可見索引字段盡量設置成無規律
c、資源數據的獲取需要增加風控,如采用划分角色進行防御
d、對請求來源、請求頻率進行限制,在訪問數據庫之前進行攔截
e、對敏感數據的增刪改查導出等需要增加日志記錄並定期審計
2)SQL注入漏洞
安全缺陷:應用程序直接將用戶輸入的內容拼接到SQL語句中執行。在特定條件下,攻擊者可以查詢數據庫中任何數據,同時可以直接獲取數據庫服務器的系統權限。如操作數據庫中數據、拖庫、在數據庫服務器上執行操作系統命令、DRUID檢測(泄露數據庫的庫表和SQL語句等敏感信息)。
常見類型:
SQL處理時采用拼接模式${param}
解決方案:采用預編譯模式#{param}
a、select * from table_A where id =#{id}
b、like concat('%',#{param},'%'}
c、in
<foreach collections='ids' item='item' open='(' separator=',' close=')' >
#{item}
</foreach>
d、order by 在java層面做映射
3)XSS跨站腳本攻擊
Cross Site Script, 跨站腳本漏洞 ,通常發生在客戶端,攻擊者在Web頁面中插入惡意JavaScript代碼(也包括VBScript和ActionScript代碼等),用戶瀏覽此頁面時,會執行這些惡意代碼,從而使用戶受到攻擊。
安全缺陷:未做數據校驗或任何數據處理即展示在前端。如數據展示對客戶輸入校驗規則不足,導致可以通過相關編碼或者特殊標簽來繞過,進而實現XSS攻擊。攻擊者可以利用此漏洞開展信息竊取、網絡釣魚、蠕蟲攻擊、內網探測、插入廣告、劫持流量、惡意跳轉等攻擊。
常見類型:
類型 | 介紹 | 觸發方式 | 是否經過后端 | 是否經過數據庫 |
反射型 | 攻擊者發送一個URL給用戶並誘導其訪問,瀏覽器會執行頁面嵌入的惡意腳本,從而達到惡意攻擊的目的 | 受害者點擊鏈接 | √ | × |
存儲型 | 攻擊者利用應用程序提供的添加、修改數據功能,將惡意數據存儲到服務器中,當其他用戶瀏覽展示該數據的頁面時,瀏覽器會執行頁面嵌入的惡意腳本,從而達到惡意攻擊的目的。 | 訪問對應頁面 | √ | √ |
DOM | 在Html頁面中,未通過規范JavaScript直接操作用戶輸入的數據,當攻擊者插入一段惡意代碼,在頁面最終展示會執行惡意腳本,從而達到惡意攻擊的目的 | 訪問對應頁面 | × | × |
解決方案:
位置 | 方案 |
前端 | 1、用戶可控的輸入不可信,建議實施安全編程技術確保正確過濾用戶提供的數據,並編碼所有用戶提供的數據以防以可執行的格式向終端用戶發送攻擊腳本。 2、禁止向HTML頁面輸出未經安全過濾或未正確轉義的用戶數據。 |
服務器端 | 1、在maven中引入XSS防護方案。 2、在服務器端調用並處理入參,輸出在CSS中的服務器。 |
Velocity模板 | 1、配置resource路徑下velocity.properties 文件中的userdirecttive 2、在mvc-servlect.xml(或spring-servlet.xml)中配置configLocation參數為:classpath:velocity.properties 3、在不同的位置進行輸出轉義 |
4)文件上傳漏洞
安全缺陷:Web 業務系統在處理用戶上傳文件時 ,未對擴展名進行驗證。同時如果用戶上傳文件的路徑、名擴展成為可控數據,就會導致直接腳本木馬到 Web 服務器上,直接控制 Web服務器。
編碼缺陷:
對上傳的文件類型沒有校驗
設定的文件保存在web目錄下,路徑不安全
對文件后綴名的校驗僅在前端進行,沒有再服務器端進行驗證
未對http請求頭的content-type 字段進行校驗
未對http請求中的擴展名進行驗證
解決方案:
禁止將文件(含臨時存緩存文件)存儲在web應用程序目錄
使用文件后綴白名單
禁止上傳html\html\swf 等可被瀏覽器解析的文件
文件格式強制轉換
對文件進行重命名且不可預測
5)任意文件讀取漏洞
安全缺陷:根據讀取URL獲取文件在網站上的絕對路徑,讀取文件。
編碼缺陷:
將待下載文件直接返回給客戶端
解決方案:
校驗用戶下載文件夾是否為指定文件夾
6)CSRF跨站請求偽造
安全缺陷:Cross-Site Request Forgery 跨站請求偽造,可以在受害者毫不知情的情況下以受害者名義偽造請求發送給受攻擊站點,從而在未授權的情況下執行在權限保護之下的操作。
編碼缺陷:
前端表單缺失CSRF防護相關代碼
服務器端缺失對獲取referer信息的校驗
服務器端缺失對CSRF防御的相關代碼
漏洞使用:
表單提交時,捕獲HTTP請求,修改Referer,執行請求,生成CSRF 請求
解決方案:
驗證HTTP Referer 字段
在業務請求中添加token 並驗證
7)URL跳轉漏洞
安全缺陷:Web業務系統接收到用戶提交的URL參數后,未對URL參數進行“可信 URL”校驗,就向用戶瀏覽器返回跳轉到該不可信URL。
常見類型:
釣魚攻擊,攻擊者向用戶發送一個存在URL跳轉的鏈接,用戶點擊鏈接后跳轉至釣魚網站頁面。
編碼缺陷:
從客戶端傳入完整或部分URL參數:
1、未校驗傳入參數的URL協議
2、未校驗傳入參數的URL域名是否合法
3、未判斷host中是否包含\(URL.getHost()存在繞過行為)
解決方案:
1、host做繞過判斷:url.replace('\\','/')
2、判斷域名是否在白名單之內
3、請求某個固定業務接口
使用白名單策略限制請求地址協議
使用白名單策略限制請求地址端口
使用白名單策略限制請求域名或者IP地址,禁止使用通配域名
禁止請求地址可以解析到內網地址
禁止使用301、302等重定向
8)XXE漏洞
安全缺陷:XML External Entity XML 外部實體注入,通過構造惡意內容,可導致讀取任意文件、執行系統命令、探測內網端口、攻擊內網網站等危害。
漏洞危害:
可以導致SSRF,危害內網安全
可導致DoS攻擊,影響服務器正常運行
可讀取服務器文件,泄露服務器數據。
解決方案:
禁用外部實體
DocumentBuilderFactory 禁用DTDS
SAXParserFactory 禁用DTDS
9)CORS跨域資源共享漏洞
Cross-origin Resource Sharing跨域資源共享,使用自定義的HTTP頭部讓瀏覽器與服務器進行溝通,從而決定請求或相應是成功還是失敗。
解決方案:
設置 Access-Control-Allow-Origin 及Origin 白名單域名
攜帶Coolie時才允許設置Access-Control-Allow-Credentials 並設置精細化白名單
僅允許特定域發起跨域請求
10)JSONP漏洞
JSON with Padding是 JSON的一種使用模式,用於解決主流瀏覽器的跨域數據訪問問題。跨域的JSON接口如果未校驗請求來源就會存在JSONP劫持漏洞,從服務器返回的關鍵信息就可能被惡意站點通過跨域加載的方式獲取。
常見類型:
JSONP跨越資源共享:JS從其他域名獲取資料
解決方案
驗證JSON文件調用的來源,如校驗http頭部的referer 處於白名單內
URL referer = new URL(request.getHeader("Referer")); String host = referer.getHost();
11)SSRF服務器端請求偽造漏洞
Server-Side Request Forgery 服務器端請求偽造,通過攻擊者構造的由服務器端發起請求。攻擊目標通常是從外網無法訪問的內部系統。
編碼缺陷:
服務端提供了從其他服務器應用獲取數據的功能且沒有對目標地址做過濾與限制。
漏洞危害
掃描內部網絡
向內外部主機發送精心構造的數據包
DOS:請求大文件,始終保持連接
解決方案
1、必須使用白名單策略限制請求地址協議,原則上僅允許http、https 協議
2、必須使用白名單策略限制請求地址端口,原則上僅允許80、443等常規端口
3、建議使用白名單策略限制請求地址域名或IP地址,禁止使用通配域名
4、禁止請求地址可以解析到內網地址
5、禁止301、302等重定向
12)信息泄露
安全缺陷:
泄露用戶隱私
網絡劫持時會泄露敏感信息
泄露項目相關信息,被攻擊者定向滲透
常見類型:
用戶敏感數據未脫敏
敏感信息明文傳輸
配置文件敏感路徑外網可以訪問
項目后門工具對外
服務器報錯信息
解決方案:
敏感信息脫敏,並做加密處理
13)暴力破解
常見類型:
利用窮舉法,將密碼進行逐個推算直到找到真正的密碼