一種基于java的web動態(tài)安全漏洞檢測方法
【專利摘要】本發(fā)明涉及WEB應用安全測試,旨在提供一種基于JAVA的WEB動態(tài)安全漏洞檢測方法。該種基于JAVA的WEB動態(tài)安全漏洞檢測方法,對WEB應用系統(tǒng)進行安全漏洞檢測,包括步驟:修改JAVA中間件、進行fuzzing測試和動態(tài)漏洞跟蹤。本發(fā)明能快速地發(fā)現(xiàn)更多的WEB安全漏洞問題;能覆蓋黑盒測試的安全漏洞范圍,并發(fā)現(xiàn)更多的深層次WEB安全問題;能降低白盒測試中高成本的問題;能準確定位漏洞代碼的具體位置;可以保證檢測過程中更低的漏報率和誤報率。
【專利說明】—種基于JAVA的WEB動態(tài)安全漏洞檢測方法
【技術領域】
[0001]本發(fā)明是關于WEB應用安全測試,特別涉及一種基于JAVA的WEB動態(tài)安全漏洞檢測方法。
【背景技術】
[0002]在WEB應用安全測試中,經(jīng)常使用的檢測方法通常為黑盒測試和白盒測試。但黑盒測試和白盒測試都有存在著不同的缺陷。
[0003]黑盒測試只有采用窮舉輸入信息的測試方式,把所有可能的輸入信息都作為測試情況時考慮,才能查出程序中所有存在的錯誤。實際上測試情況有無窮多個,人們不僅要測試所有合法的信息輸入,而且還要對那些不合法但可能的存在的信息輸入進行測試。這樣看來,完全測試結束是不可能的,所以我們要進行有針對性的安全漏洞測試,通過制定測試案例指導測試的實施,保證軟件的測試有組織、有步驟、以及有計劃地進行。黑盒測試行為必須能夠加以量化,才能真正保證軟件質(zhì)量,而測試用例就是將測試行為具體量化的方法之一 O
[0004]白盒測試又稱結構測試、透明盒測試、邏輯驅動測試或基于代碼的測試。白盒測試是一種測試用例設計方法,盒子指的是被測試的軟件,白盒指的是盒子是可視的,測試人員清楚盒子內(nèi)部的東西以及盒子里面物體或系統(tǒng)是如何運作的?!鞍缀小睖y試法全面了解程序內(nèi)部的邏輯結構、對所有的邏輯路徑進行測試?!鞍缀小睖y試法是窮舉路徑測試。在使用這一方案時,測試者必須檢查程序或系統(tǒng)的內(nèi)部結構,從檢查程序或系統(tǒng)的邏輯結構著手,得出準確的測試數(shù)據(jù)。
[0005]在安全測試中黑盒測試可以全局的測試可見的輸入信息和輸出信息,但黑盒測試無法關注到被測試程序或系統(tǒng)的具體內(nèi)部邏輯、出現(xiàn)問題的代碼位置、以及深層次的比較隱蔽的WEB安全漏洞。而白盒測試方法對于測試人員基本素質(zhì)要求很高,在代碼量巨大的情況下花費的測試成本非常高,并且可能無法清楚的了解所有的代碼流情況。
【發(fā)明內(nèi)容】
[0006]本發(fā)明的主要目的在于克服現(xiàn)有技術中的不足,提供一種能夠快速準確地發(fā)現(xiàn)深層次WEB應用安全漏洞的方法。為解決上述技術問題,本發(fā)明的解決方案是:
[0007]提供一種基于JAVA的WEB動態(tài)安全漏洞檢測方法,基于JAVA的WEB應用系統(tǒng)程序并非直接編譯成機器碼進行執(zhí)行,而是編譯成字節(jié)碼,然后通過JAVA虛擬機運行程序,WEB應用系統(tǒng)程序采用JavaAgent啟動或運行時進行代理,基于JAVA的WEB動態(tài)安全漏洞檢測方法,對WEB應用系統(tǒng)進行安全漏洞檢測包括以下步驟:
[0008]步驟A:修改JAVA中間件:將Agent, jar包當做一個JavaAgent附加到WEB應用系統(tǒng)程序中,Agent, jar包是劫持和判斷漏洞的關鍵數(shù)據(jù)包,Agent, jar代碼中使用Javassist動態(tài)修改目標測試程序及中間件的字節(jié)碼,使用java agent方式啟動Agent,jar,使其能在程序運行后動態(tài)進行目標修改,而不是直接修改文件;Agent.jar的代碼中包含了所有需要劫持的關鍵函數(shù),關鍵函數(shù)是通過分析WEB中間件及java源碼獲得的函數(shù)(包括 queryString、PrepareStatement、Jspffriter 等);
[0009]步驟B:進行fuzzing測試,具體包括以下步驟:a)分別啟動步驟A中修改過的JAVA中間件和一個進行代理fuzzing測試的代理工具,準備發(fā)送測試數(shù)據(jù);b)將瀏覽器的代理設置到代理工具上,通過瀏覽器進行普通的功能測試,進行各個頁面模塊的普通訪問;c)代理工具抓取到請求數(shù)據(jù)包后,生成預先設定的帶有攻擊測試向量POC的fuzzing數(shù)據(jù),并發(fā)送到經(jīng)過步驟A處理的JAVA中間件程序中,POC是指在漏洞測試中為能完成漏洞展現(xiàn)的數(shù)據(jù)包;
[0010]步驟C:動態(tài)漏洞跟蹤,具體包括以下步驟:d)當步驟B中的fuzzing數(shù)據(jù)被JAVA中間件程序接收后,JAVA中間件程序發(fā)現(xiàn)請求中包含了攻擊測試向量P0C,Agent.jar包中的程序啟動跟蹤流程;e) Agent, jar包中的程序跟蹤HTTP請求數(shù)據(jù)在關鍵函數(shù)中的流轉,并確認fuzzing數(shù)據(jù)是否已到達任意一個關鍵的函數(shù),如果已到達全部關鍵函數(shù),結束處理,將請求釋放,并在代理工具中記錄跟蹤信息;f)繼續(xù)等待其他fuzzing測試,如果接收到新的fuzzing數(shù)據(jù),貝U跳到步驟d。
[0011]作為進一步的改進,所述代理工具采用Proxy+Fuzzing工具,所述Proxy+Fuzzing工具在接收到代理請求后,原始請求正常代理,并生成測試POC發(fā)送到部署了 web應用和Agent, jar的測試服務器。
[0012]作為進一步的改進,所述步驟C中,Agent, jar包中的程序記錄關鍵流量的跟蹤信息,觸發(fā)相應漏洞的FUZZING規(guī)則,表明該功能流程存在缺陷,在代理工具中記錄或輸出威脅的相關日志。
[0013]作為進一步的改進,所述Agent, jar包在JAVA中間件的class首次加載時,實現(xiàn)對關鍵函數(shù)進行劫持:當發(fā)現(xiàn)需要劫持的代碼后,動態(tài)修改字節(jié)碼,并注入一段回調(diào)函數(shù),當調(diào)用此被劫持的函數(shù)時,會進入到回調(diào)函數(shù)進行處理,處理完成后返回正常流程或者結束整個流程。
[0014]與現(xiàn)有技術相比,本發(fā)明的有益效果是:
[0015]1、能快速地發(fā)現(xiàn)更多的WEB安全漏洞問題;
[0016]2、能覆蓋黑盒測試的安全漏洞范圍,并發(fā)現(xiàn)更多的深層次WEB安全問題;
[0017]3、能降低白盒測試中高成本的問題;
[0018]4、能準確定位漏洞代碼的具體位置;
[0019]5、可以保證檢測過程中更低的漏報率和誤報率。
【專利附圖】
【附圖說明】
[0020]圖1為本發(fā)明的工作流程框圖。
[0021]圖2為本發(fā)明的實施例圖。
【具體實施方式】
[0022]首先需要說明的是,本發(fā)明是計算機技術在信息安全【技術領域】的一種應用。在本發(fā)明的實現(xiàn)過程中,會涉及到多個軟件功能模塊的應用。 申請人:認為,如在仔細閱讀申請文件、準確理解本發(fā)明的實現(xiàn)原理和發(fā)明目的以后,在結合現(xiàn)有公知技術的情況下,本領域技術人員完全可以運用其掌握的軟件編程技能實現(xiàn)本發(fā)明。前述軟件功能模塊包括但不限于:Agent.jar包、Proxy+Fuzzing工具等,凡本發(fā)明申請文件提及的均屬此范疇, 申請人:不再 列舉。
[0023]下面結合附圖與【具體實施方式】對本發(fā)明作進一步詳細描述:
[0024]目前,絕大部企業(yè)級的WEB應用系統(tǒng)都使用J2EE架構規(guī)范,作為首選的WEB應用系統(tǒng)技術架構。基于JAVA的WEB應用系統(tǒng)程序并非直接編譯成機器碼進行執(zhí)行,而是編譯成字節(jié)碼,然后通過JAVA虛擬機運行程序,而字節(jié)碼是可以通過一定的方法進行修改的。WEB應用系統(tǒng)程序采用JavaAgent啟動或運行時進行代理。
[0025]如圖1、圖2所示,基于JAVA的WEB動態(tài)安全漏洞檢測方法,對WEB應用系統(tǒng)進行安全漏洞檢測包括以下步驟:
[0026]步驟A:修改JAVA中間件:將Agent, jar包當做一個JavaAgent附加到WEB應用系統(tǒng)程序中,Agent, jar包用于利用JavaAgent的方式,在JAVA中間件的class首次加載時,實現(xiàn)對關鍵函數(shù)進行劫持:當發(fā)現(xiàn)需要劫持的代碼后,動態(tài)修改字節(jié)碼,并注入一段回調(diào)函數(shù),當調(diào)用此被劫持的函數(shù)時,會進入到回調(diào)函數(shù)進行處理,處理完成后返回正常流程或者結束整個流程,且不修改JAVA中間件本身的代碼,當中間件版本變化時,如果函數(shù)不存在,將不會被攔截,所以在不同的中間件之間可以做到一個比較好的兼容性。
[0027]步驟B:進行fuzzing測試,具體包括以下步驟:a)分別啟動步驟A中修改過的JAVA中間件和一個進行代理fuzzing測試的代理工具,準備發(fā)送測試數(shù)據(jù);b)將瀏覽器的代理設置到代理工具上,通過瀏覽器進行普通的功能測試,進行各個頁面模塊的普通訪問;c)代理工具抓取到請求數(shù)據(jù)包后,生成預先設定的帶有攻擊測試向量POC的fuzzing數(shù)據(jù),并發(fā)送到經(jīng)過步驟A處理的JAVA中間件程序中,POC是指在漏洞測試中為能完成漏洞展現(xiàn)的數(shù)據(jù)包。
[0028]這里的代理工具采用Proxy+Fuzzing工具,所述Proxy+Fuzzing工具在接收到代理請求后,原始請求正常代理,并生成測試POC發(fā)送到發(fā)送到部署了 web應用和Agent,jar的測試服務器。采用代理的方式抓取URL,這樣做有兩個好處:1、測試軟件在做業(yè)務測試時,會盡可能多地訪問各個業(yè)務模塊,這樣就可以更多地發(fā)現(xiàn)需要檢測的頁面信息;2、在業(yè)務流程復雜的情況下,使用代理進行可以很方便地解決訪問順序的問題,可解決訪問順序異常導致的問題。這樣就可以抓到更多的請求信息,并根據(jù)策略漏洞類型自定義測試向量。
[0029]步驟C:動態(tài)漏洞跟蹤,具體包括以下步驟:d)當步驟B中的fuzzing數(shù)據(jù)被JAVA中間件程序接收后,JAVA中間件程序發(fā)現(xiàn)請求中包含了攻擊測試向量P0C,Agent.jar包中的程序啟動跟蹤流程;e) Agent, jar包中的程序在關鍵函數(shù)中跟蹤HTTP請求數(shù)據(jù)在關鍵函數(shù)中的流轉,并確認fuzzing數(shù)據(jù)是否已到達任意一個關鍵的函數(shù),如果已到達全部關鍵函數(shù),結束處理,將請求釋放,并在代理工具中記錄跟蹤信息;跟蹤信息觸發(fā)相應漏洞的FUZZING規(guī)則,表明該功能流程存在缺陷,在代理工具中記錄或輸出威脅的相關日志,這樣就可快速地定位出現(xiàn)問題的位置和整個調(diào)用堆棧的使用情況;f)繼續(xù)等待其他fuzzing測試,如果接收到新的fuzzing數(shù)據(jù),則跳到步驟d。
[0030]下面的實施例可以使本專業(yè)的專業(yè)技術人員更全面地理解本發(fā)明,但不以任何方式限制本發(fā)明。以下流程以SQL注入漏洞測試為例,展示了工作過程,實際工作時會需要劫持大量的關鍵函數(shù),以完成各種漏洞的安全監(jiān)測。[0031 ] 1、修改中間件的啟動函數(shù)增加JavaAgent的參數(shù),使用我們定制的Agent, jar包;
[0032]2、Java 的 Premain 函數(shù)中增加 transform 的監(jiān)視;
[0033]3、在Transform中對所有加載的class進行檢測;
[0034]4、修改 org/Apache/Catalina/Connector/Request class 的字節(jié)碼對SetRequestedSessionId 和 Recycle 兩個函數(shù)進行劫持;
[0035]5、修改 com/mysql/jdbc/Statementlmpl class 的字節(jié)碼對 ExecuteQuery 函數(shù)進行劫持;
[0036]6、使用自己開發(fā)的Proxy+Fuzzing工具代理瀏覽器;
[0037]7、瀏覽器正常訪問各個頁面;
[0038]8,Proxy+Fuzzing工具接收到代理請求后,原始請求正常代理,生成大量SQL注入測試POC發(fā)送到測試服務器;
[0039]9、測試服務器接收到正常請求后按正常流程處理;
[0040]10、測試服務器接收到Fuzzing數(shù)據(jù)后,在SetReuquestedSessionId函數(shù)給測試請求生成一個Request Session用于全程跟蹤數(shù)據(jù)流;
[0041]11、目標頁面存在SQL注入漏洞時,會再ExecuteQuery函數(shù)中出現(xiàn)測試POC的部分內(nèi)容,在函數(shù)中截獲到以后就可判斷已經(jīng)存在SQL注入漏洞;
[0042]12、結束后在Recycle中將請求結束;
[0043]13、由于已經(jīng)劫持關鍵函數(shù),所以可以在函數(shù)中直接跟蹤到代碼的調(diào)用堆棧,可以完全清楚整個漏洞的函數(shù)調(diào)用順序。并定位整個漏洞在代碼中的運行情況。
[0044]最后,需要注意的是,以上列舉的僅是本發(fā)明的具體實施例。顯然,本發(fā)明不限于以上實施例,還可以有很多變形。本領域的普通技術人員能從本發(fā)明公開的內(nèi)容中直接導出或聯(lián)想到的所有變形,均應認為是本發(fā)明的保護范圍。
【權利要求】
1.一種基于JAVA的WEB動態(tài)安全漏洞檢測方法,基于JAVA的WEB應用系統(tǒng)程序并非直接編譯成機器碼進行執(zhí)行,而是編譯成字節(jié)碼,然后通過JAVA虛擬機運行程序,其特征在于,WEB應用系統(tǒng)程序采用JavaAgent啟動或運行時進行代理,基于JAVA的WEB動態(tài)安全漏洞檢測方法,對WEB應用系統(tǒng)進行安全漏洞檢測包括以下步驟: 步驟A:修改JAVA中間件:將Agent, jar包當做一個JavaAgent附加到WEB應用系統(tǒng)程序中,Agent, jar包是劫持和判斷漏洞的關鍵數(shù)據(jù)包,Agent, jar代碼中使用Javassist動態(tài)修改目標測試程序及中間件的字節(jié)碼,使用java agent方式啟動Agent, jar,使其能在程序運行后動態(tài)進行目標修改,而不是直接修改文件;Agent.jar的代碼中包含了所有需要劫持的關鍵函數(shù),關鍵函數(shù)是通過分析WEB中間件及java源碼獲得的函數(shù); 步驟B:進行fuzzing測試,具體包括以下步驟:a)分別啟動步驟A中修改過的JAVA中間件和一個進行代理fuzzing測試的代理工具,準備發(fā)送測試數(shù)據(jù);b)將瀏覽器的代理設置到代理工具上,通過瀏覽器進行普通的功能測試,進行各個頁面模塊的普通訪問;c)代理工具抓取到請求數(shù)據(jù)包后,生成預先設定的帶有攻擊測試向量POC的fuzzing數(shù)據(jù),并發(fā)送到經(jīng)過步驟A處理的JAVA中間件程序中,POC是指在漏洞測試中為能完成漏洞展現(xiàn)的數(shù)據(jù)包; 步驟C:動態(tài)漏洞跟蹤,具體包括以下步驟:d)當步驟B中的fuzzing數(shù)據(jù)被JAVA中間件程序接收后,JAVA中間件程序發(fā)現(xiàn)請求中包含了攻擊測試向量P0C,Agent.jar包中的程序啟動跟蹤流程;e) Agent, jar包中的程序跟蹤HTTP請求數(shù)據(jù)在關鍵函數(shù)中的流轉,并確認fuzzing數(shù)據(jù)是否已到達任意一個關鍵的函數(shù),如果已到達全部關鍵函數(shù),結束處理,將請求釋放,并在代理工具中記錄跟蹤信息;f)繼續(xù)等待其他fuzzing測試,如果接收到新的fuzzing數(shù)據(jù),則跳到步驟d。
2.根據(jù)權利要求1所述的一種基于JAVA的WEB動態(tài)安全漏洞檢測方法,其特征在于,所述代理工具采用Proxy+Fuzzing工具,所述Proxy+Fuzzing工具在接收到代理請求后,原始請求正常代理,并生成測試POC發(fā)送到部署了 web應用和Agent,jar的測試服務器。
3.根據(jù)權利要求1所述的一種基于JAVA的WEB動態(tài)安全漏洞檢測方法,其特征在于,所述步驟C中,Agent, jar包中的程序記錄關鍵流量的跟蹤信息,觸發(fā)相應漏洞的FUZZING規(guī)則,表明該功能流程存在缺陷,在代理工具中記錄或輸出威脅的相關日志。
4.根據(jù)權利要求1所述的一種基于JAVA的WEB動態(tài)安全漏洞檢測方法,其特征在于,所述Agent, jar包在JAVA中間件的class首次加載時,實現(xiàn)對關鍵函數(shù)進行劫持:當發(fā)現(xiàn)需要劫持的代碼后,動態(tài)修改字節(jié)碼,并注入一段回調(diào)函數(shù),當調(diào)用此被劫持的函數(shù)時,會進入到回調(diào)函數(shù)進行處理,處理完成后返回正常流程或者結束整個流程。
【文檔編號】G06F11/36GK103699480SQ201310631280
【公開日】2014年4月2日 申請日期:2013年11月29日 優(yōu)先權日:2013年11月29日
【發(fā)明者】吳卓群, 劉志樂, 范淵 申請人:杭州安恒信息技術有限公司