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 是有别于传统黑盒测试和白盒测试的一种混合测试技术,将有效解决这一难题,为客户创造更好的价值。