使用 AppScan 进行扫描
针对大型网站的扫描,我们按照戴明环 PDCA 的方法论来进行规划和讨论,建议 AppScan 使用步骤:计划(Plan)、执行(Do)、检查(check)、分析(Analysis and Action)。
下面我们针对每个阶段,进行具体的阐述。
准备阶段
AppScan 安装环境要求和检查
为了保证更好的扫描效果,安装 AppScan 的硬件建议配置如下:
表 1. Rational AppScan 安装配置要求
硬件 | 最低需求 |
---|---|
处理器 | Pentium P4,2.4 GHz |
内存 | 2 GB RAM |
磁盘空间 | 30 GB |
网络 | 1 NIC 100 Mbps(具有已配置的 TCP/IP 的网络通信) |
其中,处理器和内存建议越大越好,而磁盘空间,建议系统盘(一般是 C 盘)磁盘空间至少保留 10G,如果系统盘磁盘空间比较少,可以考虑把用户文件等保存在其他盘;如默认的用户文件是:C:\Documents and Settings\Administrator\My Documents\AppScan;可以修改为其他路径。该路径可以在菜单栏中依次选择工具 - 选项 - 一般 - 文件位置部分修改。
图 1. 设置文件保存路径
磁盘要求:修改临时文件路径
有时候大家会发现,已经把上面的地址都修改到了其他盘,但是在扫描过程中,还是会发现 C 盘的空间快速被消耗,分析原因,是因为很多临时文件都保存在 C 盘,AppScan 中有一个隐藏的参数 APPSCAN_TEMP 来设置临时文件位置。在扫描过程中,如果系统盘空间比较下,可以通过修改系统变量来修改到其他硬盘空间。
临时文件位置说明:描述正常操作期间 AppScan 将其临时文件保存到的位置。缺省情况下,AppScan 将其临时文件存储在以下位置:
C:\Documents and Settings\All Users\Application Data\IBM\Rational AppScan\temp
如果需要修改此缺省位置,请按照要求编辑环境变量 APPSCAN_TEMP 的路径。(访问环境变量的方法是,右键单击我的电脑,然后依次选择属性 > 高级 > 环境变量。)
注意:在新位置的路径中绝不能有任何 Unicode 字符。
修改 AppScan 中的临时文件:
侵入式的测试用例,往往因为有比较强的副作用,可能对系统造成伤害,所以一般扫描生产系统的时候,很少选择。我们可以查看一个 SQL 注入类型的侵入式安全问题,在“输入以查找”输入框中输入“SQL”,然后回车查询。可以看到测试变体的描述“将参数值设置为 Declare/Case SQL 注入攻击(尝试关闭 DB 服务器)”,则扫描过程中,会使用该测试用例去执行尝试关闭数据库的命令,如果该测试用例执行通过,则就关闭了数据库,则整个系统就瘫痪!所以,要很慎重的选择“侵入式的测试用例”。
图 3. 查询测试策
略
其他的在“类型”中,“应用程序”类型表示该问题的存在是因为应用程序不严谨,代码存在安全问题而造成的,修改方法就是修改原代码;而“基础结构”类型,则表示该问题是配置问题,建议修改系统配置或者安装最新的补丁(经常是中间件或数据库补丁)。
了解被测试网站
在对网站进行测试之前,我们经常需要先大概了解下这个网站,比如该网站使用了哪些技术,提供什么类型的业务(功能),网站规模等。这些都和我们的扫描设置相关。如下图,就是我们经常使用的一个调查表,了解被测试系统的基本特点。
表 2. 记录被测网站特点
应用系统名称 | 访问地址 | 应用系统架构(JEE/.Net/PHP…) | URL 数量 | 登陆方式 | 备注 |
其中,用户经常迷惑的是 URL 数量,有些时候,用户很难评估出一个系统的大概页面数量,而按照 AppScan 的工作原理,扫描是针对页面的每个参数的,如果页面越多,参数越多,则扫描要运行的时间也就越长,扫描保存成的接过文件也是越大,更需要进行分解。如果一个扫描任务,本身的已访问 URL 数超过 5000,评估的要运行的安全测试用例数超过 50,000,则建议进行扫描配置的分析,并根据分析结果,决定是否需要进一步的任务分解和分工。
那么,如果可以了解到网站具体有哪些页面呢?这里我们就可以利用 AppScan 的探索(页面爬行)能力。
在扫描配置里面设置了主 URL 以后,工作菜单中中依次选择扫描 - 仅探索。对网站进行探索。一般会让探索工具运行 10 到 30 分钟,看该网站具体存在哪些页面,哪些参数等。这个就可以切换到“应用程序数据”视图来查看。
我们一般关心这几个视图:
伪静态页面
可以选择左边“我的应用程序数据”中的 URL 树下的每一个节点,察看该节点已访问的 URL,已过滤掉的 URL 等。
如在已访问的 URL() 中,我们发现大量类似如下结构的 HTML 页面:
http://www.Test.com//focus/satisfy/file5.html http://www.Test.com//focus/satisfy/file6.html http://www.Test.com/m-zone/news/dgdd/quanbu/bylb/file5.html |
排除所有该类型的页面;.*file\d+.html
增加“例外”,对该类型的页面只扫描 file1.html 和 file20.html
经常存在的其他类似页面,还有 news1.html、content200.html 等类型,采用方法类似。
业务类型的“冗余路径”
和“伪静态页面”对应的有另外一种动态页面,这些页面按照默认的扫描规则,会被自动过滤,但是根据真实的业务场景,这些页面确实不能被过滤的,如访问 demo.testfire.net 时候在“已过滤 URL”内会显示有如下的 URL 地址,过滤原因都是“路径限制”:
http://www.Test.com/default.aspx?content=inside_community.htm http://www.Test.com/default.aspx?content=inside_press.htm http://www.Test.com/default.aspx?content=inside_executives.htm |
在 AppScan 中,默认情况下是有一个“冗余路径限制”(在“扫描配置 - 探索选型 - 冗余路径限制”),默认对于冗余的页面,最多扫描 5 次,关键的问题是,什么页面被被 Appscan 认为是冗余页面呢 ?
图 4. 冗余路径设置
简单说:
http://www.Test.com/default.aspx?content=inside_community.htm http://www.Test.com/default.aspx?content=inside_press.htm |
遇到这样情况的页面,最多被访问 5 次。而这 5 次,具体是使用了哪些参数,是随机的,具体访问到的页面也会在“应用程序数据”视图的“已访问的 URL”中查看:
http://www.Test.com/default.aspx?content=business.htm http://www.Test.com/default.aspx?content=business_lending.htm http://www.Test.com/default.aspx?content=inside_contact.htm |
这些情况经常存在于跳转参数等情况。
顺便备注下,“冗余路径限制”,功能设置的目的是为了处理类似论坛 BBS 等页面,只有文本内容不同,页面架构完全相同的页面:如
http://www.Test.com/showthread.php?id=1 http://www.Test.com/showthread.php?id=2 http://www.Test.com/showthread.php?id=3 |
分析重复的“脚本参数”
在上面的步骤中,分析了“伪静态页面”,对其应该通过“排除路径或者文件名”的方法设置排除规则;而对于“业务类型的冗余路径”,则需要通过增加“冗余路径显示”个数等的方法进行扩充,以扫描到这些 URL。我们在这个步骤来分析另外一种参数,脚本参数。
在“我的应用程序数据”树状结构下,鼠标选择目录以后,在右边视图中选择“脚本参数”,然后查看是否存在不同页面(URL) 存在相同或者类似参数的情况:如下图,在不同 URL 中,都存在 kbKey 参数,默认的参数值是“请输入您要搜索的问题”:
图 5. 脚本参数
访问这些 URL,发现每个页面内都包含了一个搜索功能,这就是为什么在不同页面都发现了该参数。而从业务角度,这些搜索页面在一个 URL 中进行测试以后,没有必要在另外一个页面也进行测试。而且该参数值的变化,可以认为是冗余页面,没有必要进行下一步的重新探索和测试。这可以通过上图中,选择该参数后,鼠标右键,选择“添加到‘参数和 Cookie’选项卡中的列表”来实现。选择后弹出下面的页面:
图表 6 添加参数定义(根据参数来设置冗余路径)
在该页面中,点击“其他选项-冗余调整”,取消选择任何一个选择框,则表示无论是否含有该参数,无论该参数值是否发生变化,都不认为是新页面,没有必要重新测试,而且不应该因为该参数的变化去影响其他参数的测试。
我们知道,AppScan 中的测试,是针对页面的每个参数进行的,而且一个参数值的变化会要求重新测试其他的参数,所以该设置,可以大大减少测试用例数。
关于更多的设置说明,可以参照下面的解释:
表 3. 设置说明
查看每个目录页面个数
如果一个扫描任务,本身的已访问 URL 数超过 5000,评估的要运行的安全测试用例数超过 20,000,则建议进行扫描配置的分析,并根据分析结果,决定是否需要进一步的任务分解和分工。
我们在“我的应用程序数据”树状结构下,鼠标选择目录以后,在右边视图中选择“已访问的 URL()”,记录 URL 数目,如果该目录 URL 数目比较大(超过 500)则可以考虑为该目录单独建立一个扫描任务,只扫描该目录下面的链接。
执行阶段
根据在“计划阶段”确定的扫描策略,和进行的扫描设置,重新进行探索(扫描菜单依次选择:重新扫描 - 重新探索);后继续分析页面数和测试用例数目,如果控制页面数 5000 个以内,测试用例数 20,000 个以内,则可以直接进行扫描;如果没有,建议继续分析,优化扫描配置。
分阶段测试
AppScan 的扫描过程分为“探索”和“测试”两个阶段,默认情况下,使用的是完全扫描模式,即是边探索边测试的。如果网站比较大,建议考虑先探索后测试的模式。
如当 URL 达到 5000,需要进行的测试达到 50000 的时候,可以暂停扫描,手工停止探索,选择“继续仅测试”。对已经发现和分析的页面进行测试,测试完毕,再来选择“继续仅探索”,即:
继续仅探索 --- 继续仅测试—继续仅探索 - 仅测试的一个循环过程。
在这个过程,一个阶段结束以后,建议查看下 .Scan 文件的大小,如果大小超过了 500M,则建议考虑任务分解,可以根据目录把一个扫描任务分解为多个,或者根据扫描策略来进行分解。
该方法是利用了 AppScan 扫描过程中,探索测试可以分离,而且支持扫描过程中断后继续扫描的特性。
按照业务分解扫描任务
在实际工作中,我们扫描的一个大型网站,往往包含多个频道,而每个频道可能需要的扫描配置都不同,这些配置甚至互相冲突。如一个网站的提供了 BBS 论坛功能:
http://www.Test.com/WWW.TEST.COM/showthread?channel=1&thread=1001 http://www.Test.com/WWW.TEST.COM/showthread?channel=30&thread=2001 |
对于这样的页面,访问后发现页面结构相同,只是文本内容不同,则应该使用“冗余路径限制”参数,控制扫描次数,没有必要多次扫描。
同时,该网站的一个服务频道存在如下的页面:
http://www.Test.com/default.aspx?content=inside_executives.htm http://www.Test.com/default.aspx?content=privacy.htm |
即上面提到的业务类型的“冗余路径”,应该多次扫描,配置上要求增大“冗余路径限制”参数。
在这种情况下,就很有必要根据业务分别建立扫描任务,每个任务采用不同的扫描配置。
检查阶段
在扫描执行过程中,需要检查,看是否存在下面的情况:
案例分析
工作中遇到一个案例,使用 AppScan 扫描扫描了 3*24 小时,扫描的 scan 文件已经达到 9G;扫描还在持续进行中,总体进度完成了 30%,可以想象扫描速度已经很缓慢,还需要多长时间才可以完成扫描?扫描完成以后如此大的结果文件是否可以成功打开和修改保存 ?
按照我的经验,如果扫描结果文件大于 1G,那就很有必要立即停止扫描,进行配置分析。我们的分析过程如下:
http://www.Test.com//focus/satisfy/file5.html http://www.Test.com//focus/satisfy/file6.html |
在扫描配置 - 排除路径和文件中:
排除所有该类型的页面;.*file\d+.html
增加“例外”,对该类型的页面只扫描 file1.html 和 file20.html
http://www.Test.com/service |
http://www.Test.com/service/Business.do?menu=Query http://www.Test.com/service/Business.do?menu=Open http://www.Test.com/service/Business.do?menu=Service |
确认该页面是业务类型的“冗余路径”,应该全面扫描,则需要把“冗余路径设置”调整为比较大的参数,同时该频道是网上营业厅频道,也要求用户先登录。所以针对该目录建立一个单独的扫描任务,只扫描该目录和其下子目录。
http://www.Test.com//rdwd/jfmz/jifen/index.html http://www.Test.com//rdwd/txl/rdwdznyd/index.html&kbKey= 请输入您要搜索的问题 http://www.Test.com//rdwd/jfmz/jifen/index.html?queryType=common&applyArea=010 http://www.Test.com//rdwd/txl/rdwdznyd/index.html?queryType=common&applyArea=010 &kbKey= 请输入您要搜索的问题 |
访问上面的页面,发现内容相同,则说明是否带这三个参数不会影响探索发现更多的页面,则可以设置这三个参数每次是否出现,是否有不同值都可以认为是同一个页面。
设置方法:扫描配置中依次选择“参数和 Cookie”来实现。然后增加 queryType,applyArea,kbKey 三个参数,均设置为“是否有参数”、“参数是否变化”不影响测试的模式。
总结
AppScan 作为一种自动化的扫描设置工具,我们了解其工作原理后,需要根据被测系统的业务特点和网站结构特点,优化配置,从而可以快速的针对性扫描。
常用的设置是可以利用其“探索”功能,快速得到结构,然后分析是否存在“伪静态页面”,业务上的“冗余路径”页面,“参数重复”页面等,在扫描配置中对应设置。
同时,如果设置后网站规模还是比较大,则可以根据业务分解为多个扫描任务,从而分而攻之,快速扫描,并结合企业版等工具,综合汇总分析.