IBM Security AppScan Glass Box:一種全新的漏洞掃描思想
Glass Box 是 IBM Security AppScan Standard Edition(以下簡稱 AppScan)8.5 版本以后引進的一個新的組件,是對 AppScan 的一個比較大的改進。Glass Box 引進了運行時分析的技術,通過部署在服務器端的代理,在探索和測試階段搜集 Web 應用程序信息,并進行分析,進而反饋給 AppScan,使 AppScan 更有針對性的進行探索和掃描,提高了掃描的精確性,并有利于發現更多的漏洞。
Glass Box 并不僅僅是 AppScan 的一個新的特性,而是代表了一種全新的思想,將動態分析技術與傳統的 AppScan 黑盒測試技術結合起來,對 Web 應用程序進行代碼級別的分析,給出更精確的分析結果,從而更有效的幫助客戶保護好自己的網站。
前言
Glass Box 是 IBM Security AppScan Standard Edition(以下簡稱 AppScan)8.5 版本以后引進的一個新的組件,是對 AppScan 的一個比較大的改進。Glass Box 引進了運行時分析的技術,通過部署在服務器端的代理,在探索和測試階段搜集 Web 應用程序信息,并進行分析,進而反饋給 AppScan,使 AppScan 更有針對性的進行探索和掃描,提高了掃描的精確性,并有利于發現更多的漏洞。Glass Box 并不僅僅是 AppScan 的一個新的特性,而是代表了一種全新的思想,將動態分析技術與傳統的 AppScan 黑盒測試技術結合起來,對 web 應用程序進行代碼級別的分析,給出更精確的分析結果,從而更有效的幫助客戶保護好自己的網站。
本文首先簡單介紹了 AppScan Glass Box 的技術架構,然后介紹了在 AppScan 8.5 中 Glass Box 在 Windows XP 下使用效果。Glass Box 支持 WebSphere、Tomcat、JBoss 等多種應用服務器,本文選擇的 Web 服務器為大家常見的 Tomcat 7.0。
技術架構
Glass Box 可分為客戶端和服務端。客戶端又可分為 GlassAPI 和 Glass Box 引擎服務,GlassAPI 用于和服務器端通信,獲取服務端返回的問題信息;Glass Box 引擎服務基于預定義的驗證規則,對獲取到的服務端進行分析,判斷是否存在漏洞。服務端通過代理程序搜集服務器端信息,包括 Web 應用程序運行時信息(根據預定義的特征匹配規則)、源代碼信息、配置文件信息、操作系統信息、數據庫信息和 Web 服務器信息等,并將搜集到的信息返回給客戶端。
圖 1. Glass Box 技術架構圖
配置及使用
打開掃描配置面板,可對 Glass Box 進行配置。點擊 Glass Box 面板中的添加按鈕,可添加 Glass Box 代理程序。
圖 2. Glass Box 代理程序定義
代理程序的用戶名和密碼分別為安裝 Glass Box 時設定的用戶名和密碼,如需要修改密碼,可運行 AgentCredentials.bat <username> <password> ,或直接修改位于 GBootStrap\WEB-INF 目錄下的 users.xml 文件,重啟 Tomcat 后生效。用戶可添加多個 Glass Box 代理程序,但 AppScan 同一時間只能使用其中的一個。添加代理程序成功后,可對 Glass Box 進行設置,選中"在探索階段使用 glass box ",可發現更多的隱藏的 URL;選中"在測試階段使用 glass box",可發現更多的漏洞和提供更詳細的漏洞信息。配置成功后,AppScan 右下角狀態欄將顯示"Glass box 掃描:已啟用"。
Glass Box 配置成功后,需要對 Web 應用程序重新掃描。需要注意的是,由于 Glass Box 對 URL 的解析問題,掃描本地網站需要配置虛擬域名,即起始 URL 不能是“http://localhost/myproject”, 而應該是“http://mysite/myproject”。Glass Box 目前僅支持 Java 項目。本文所選用掃描網站是 IBM AppScan 開發人員提供的 AltoroJ 項目。
通過對配置 Glass Box 前后的掃描結果進行分析,我們分析一下使用 Glass Box 的三個優勢。為方便起見,本文采用默認的掃描配置(新建一個常規掃描,采用默認的掃描策略,對掃描配置的各項參數不做任何修改),并且沒有對結果進行分析,排除誤報的漏洞。每次掃描,結果可能會略有不同;若差別太大,則應該檢查掃描配置信息,查看日志,找出問題所在。
1. 在探索階段通過檢測出代碼中不可見的參數和 cookie 信息,探索隱藏的掃描路徑,提高掃描覆蓋率。
在應用程序中,有一些參數并未暴露給用戶,即對用戶是"不可見"的,傳統的 AppScan 運行在客戶端,并不能夠檢測到這些參數,更無法探索到相關的頁面。 Glass Box 運行于探索階段全過程,預定義一些"感興趣"的方法(如 getParameter、Runtime.getRuntime().exec 等),并時刻檢測這些方法是否運行,并進而探索出其中的參數,再根據這個參數構造掃描路徑。
2. 在測試階段,Glass Box 可增強 AppScan 在各種漏洞類型方面的檢測。
Glass Box 通過搜集服務端信息,可減少誤報率,增強 AppScan 對各種漏洞類型的檢測,主要能夠增強 AppScan 對注入攻擊、不安全的直接對象引用、安全配置錯誤和不安全的加密存儲等漏洞的檢測。通過掃描 AltoroJ 項目可以發現,配置 Glass Box 前,共掃描出了 100 個漏洞;而配置 Glass Box 后,共掃描到了 139 個漏洞;Glass Box 增加了了大約 40% 的漏洞掃描發現數量。下表是按照 OWASP Top 10 漏洞分類方法,對使用 Glass Box 前后的掃描漏洞數量進行的對比。
表 1. 使用 Glass Box 前后發現的漏洞數量對比
有時候,Web 開發人員會屏蔽錯誤信息,比如設置一個錯誤頁面,發生異常時直接跳轉到該頁面,AppScan 無法直接從 response 信息中判斷是否存在漏洞。Glass Box 通過預定義的方法,搜集服務器端的信息,從而判斷是否存在漏洞。
通過掃描我們發現,未使用 Glass Box 前,AppScan 并未檢測出用戶登錄頁面的 SQL 注入漏洞(AppScan 可檢測出各種類型的漏洞,未檢測出該頁面的 SQL 注入漏洞屬于個別情況)。我們來分析一下原因。
AppScan 在測試階段,向登陸頁面發送請求,我們假定 AppScan 將 Username 和 Password 均設置為"'",服務器返回錯誤信息"Syntax error: Encountered "\'" at line 1, column 63. "。由于在 Response 中并未包含 SQL 異常信息,所以 AppScan 無法判斷是否存在 SQL 注入漏洞。
圖 3. 頁面顯示的錯誤信息
但是如果我們寫一個測試代碼,可得知當我們輸入單引號時,服務器端確實報了 SQL 語法錯誤信息,如圖 4 所示。Glass Box 安裝在服務器端,當它發現請求值為 g'[number]b,且包含了單引號的信息請求時,如果出現 SQL 異常錯誤信息,那么 Glass Box 便判斷出該頁面存在 SQL 注入漏洞。
圖 4.SQL 異常信息
3. 在生成報告階段,可提供代碼級的調試信息和修復建議
我們以 AltoroJ 項目的登陸頁面為例,對比一下使用黑盒測試和使用 Glass Box 發現的漏洞的修復過程。AppScan 通過分別在 Username 和 Password 輸入框中輸入"4ppSc4n"和"A' OR '7659'='7659",發現了該頁面存在 SQL 注入漏洞(AppScan 中稱之為"SQL 注入的認證旁路")。我們根據"請求 / 響應"信息可以發現,該漏洞存在于 doLogin 這個 servlet 中,如圖 5 所示。
圖 5.AppScan “請求 / 響應”
我們根據 WEB-IBF/web.xml 中的信息進一步判斷出漏洞存在于 LoginServlet.java 文件中。
清單 1.web.xml 文件中的 LoginServlet 配置
<servlet-mapping> <servlet-name>LoginServlet</servlet-name> <url-pattern>/doLogin</url-pattern> </servlet-mapping> <servlet> <description> </description> <display-name> LoginServlet</display-name> <servlet-name>LoginServlet</servlet-name> <servlet-class> com.ibm.rational.appscan.altoromutual.servlet.LoginServlet </servlet-class> </servlet> |
打開 LoginServlet.java 文件,我們依然很難一眼就判斷出漏洞的準確位置,需要對代碼做進一步的分析。經過分析,找到存在漏洞的語句:
清單 2. LoginServlet.java 文件中存在漏洞的語句
if (!DBUtil.isValidUser(username, password))
然后,我們再找到 DBUtil 類中的 isValidUser 函數,最終找到了存在漏洞的 sql 語句:
清單 3. 存在漏洞的 SQL 語句
ResultSet resultSet = statement.executeQuery("SELECT COUNT(*)FROM PEOPLE WHERE USER_ID
= '"+ user +"' AND PASSWORD='" + password + "'");
/* BAD - user input should always be sanitized */
雖然有時候對于經驗豐富的開發者來說,對于邏輯簡單程序能夠直接定位到某個 java 文件,省去一些步驟,但是大部分情況下,我們都需要一步步的去分析。而對于 Glass Box 發現的漏洞,則可以大大節省開發人員定位代碼漏洞的時間。Glass Box 可報告出漏洞的具體位置信息,如方法名、類名、文件名和行號等信息;并可報告運行時信息。如圖 6 所示。
圖 6. Glass Box 問題信息
總結
黑盒測試技術由于無法獲取應用程序的內部信息,導致掃描覆蓋率偏低,且無法提供詳細的調試信息;而白盒測試技術的代價過于高昂,需要大量的人工成本,且誤報率較高。而 Glass Box 是有別于傳統黑盒測試和白盒測試的一種混合測試技術,將有效解決這一難題,為客戶創造更好的價值。
posted on 2014-08-05 09:55 順其自然EVO 閱讀(655) 評論(0) 編輯 收藏 所屬分類: 安全性測試