ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 基于 AppScan eXtension Framework 开发 Rational AppScan 插件

基于 AppScan eXtension Framework 开发 Rational AppScan 插件

原创 Linux操作系统 作者:habug 时间:2009-03-31 15:28:45 0 删除 编辑

AppScan 简介

IBM Rational AppScan 是一个面向 Web 应用安全检测的自动化工具,使用它可以自动化检测 Web 应用的安全漏洞,比如跨站点脚本攻击(Cross Site Scripting Flaws)、注入式攻击(Injection Flaws)、失效的访问控制(Broken Access Control)、缓存溢出问题(Buffer Overflows)等等。这些安全漏洞大多包括在 OWASP(Open Web Application Security Project,开放式 Web 应用程序安全项目)所公布的 Web 应用安全漏洞中



AppScan eXtension Framework 介绍

Rational AppScan 在 7.5 版本以后提供了一个扩展框架,称为 AppScan eXtension Frameowrk。利用 Appscan 提供的 eXtension framework,用户可以非常简单的为 AppScan 提供扩展。扩展的内容几乎没有任何限制,可以从一个简单的通知程序到一个非常复杂的安全分析工具,使得用户可以根据自己的需要来客户化 AppScan。AppScan eXtension Framework 支持多种语言,如 Python、C#、C++、J#、Jscript. 等等,本文主要介绍如何利用 C# 进行扩展。

下面是 AppScan eXtension Framework 的扩展接口 IExtensionLogic 的类图:


图 1. IExtensionLogic 类图
IExtensionLogic 类图

IExtensionLogic 是 AppScan 扩展的入口接口,它包含两个方法:

  • void Load(IAppScan appScan, IAppScanGui appScanGui, string extensionDir)

    扩展点初始化方法,一般来说,都是在 AppScan 启动时调用。

    参数:

    • appScan:AppScan SDK 的主接口 IAppScan 的实例对象。IAppScan 接口包含了 AppScan 扫描测试引擎的主要功能对象,通过使用这个接口的实例,就可以调用 AppScan 的主要功能,它一般作为客户端访问 AppScan 的入口。如该接口中的 Scan 属性,它实际上是 IScanManager 的实例对象。上面的类图列举了 IScanManager 中的部分方法,比如 Scan() 方法用来开始对目标网站的同步扫描,ScanAsync() 和 Scan() 方法功能相同,只不过是异步方法,ResetExploereAndTestData() 用来清空网站扫描和安全测试结果等等。
    • appScanGui:AppScan 的图形界面元素入口,它实际上是 AppScan 扩展在 AppScan 界面上的体现,它使得 AppScan 的扩展点用户界面入口能够出现在 AppScan 界面的菜单(Extensions Menu、ToolsMenu、IssueContextMenu 和 AppTreeNodeContextMenu),工具栏,显示面板等位置。
    • extensionDir:传入参数,用来确定扩展点的安装地址,方便扩展程序 IO 操作。
  • ExtensionVersionInfo GetUpdateData(Edition edition, Version targetAppVersion)

    用来获取当前扩展的版本更新信息,如果没有更新数据或不支持这项功能,可以返回空值。

    参数:

    • Edition:当前 AppScan 的版次,是一个枚举类型,包含测试版,开发版等等 .
    • targetAppVersion:当前版本信息,比如本文就是以 7.7 版本为例 .
  • Rational AppScan 插件开发 Step by Step

    这部分提供一个 C# 开发的插件实例,在这个实例中会创建一个表单,内部有三个按钮分别用来扫描网站资源,进行测试和显示扫描结果。下面就一步一步来展示如何为 AppScan 做扩展应用。

    前提条件:

    • 安装 Rational AppScan 7.5 或者是更新的版本
    • 安装 Visual Studio 2008(本文使用的是 Visual Studio 2008,Visual Studio 2005 也可以使用)。

    第 1 步:创建项目和配置 Visual Studio 开发环境

    1. 创建 Visual C# Class Library 类型的项目

    创建 Visual C# Class Library 类型的项目,命名为 AppScanExtensionTestSolution name 输入与项目名称一致,并选择“Create directory for solution”,如下图所示:


    图 2. 新建项目
    新建项目
    1. 需要添加 AppScanSDK.dll 链接库到项目引用中

    由于 AppScan 扩展开发中需要引用很多相关的类,需要添加 AppScanSDK.dll 链接库到项目引用中。在打开的项目中,选中目录 Reference,右键菜单选择“Add Reference…”,如下图所示:


    图 3. 增加引用
    增加引用

    稍等片刻,Add Reference 窗口就会被打开,转到 Browse 页,定位到 Rational AppScan 的安装目录,在其安装目录下选中 AppScanSDK.dll,然后点击 OK,如下图所示:


    图 4. 选中 appscanSKD.dll 链接库
    选中 appscanSKD.dll 链接库

    这时,在 Reference 下会多出一个 AppScanSDK 的命名空间。

    第二步:编写插件代码

    1. 创建插件入口类,实现 IExtensionLogic

    创建一个新的 C# 类文件,将其命名为 AppScanTestExtension,这个类就是这个插件实例的入口类。令其实现 IExtensionLogic 接口,该接口在命名空间 Watchfire.AppScan.Extensions 下,同时实现两个方法 loadGetUpdateData,如下面代码所示:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using Watchfire.AppScan.Extensions;
    
    
    namespace AppScanExtensionTest
    {
        public class AppScanTestExtension : IExtensionLogic
        {
    
    
            private static IAppScan _appscan;
            private static IAppScanGui _appScanGui;        
    
    
            public void Load(IAppScan appscan, IAppScanGui appScanGui, string extensionDir)
            {
                _appscan = appscan;
                _appScanGui = appScanGui;        
    
    
            }
    
    
            public ExtensionVersionInfo GetUpdateData(Edition targetApp, 
            System.Version targetAppVersion)
            {
                return null;
            }
    
    
    
    
        }
    }
    
    

    1. 为 AppScan 插件定义 UI 扩展。

    如上面章节所说,利用 appScanGui 对象可以为 AppScan 插件定义界面入口点,在上面的 AppScanTestExtension 类中加入下面两个方法,方法 AddGuiToAppScan() 会在 AppScan 的“Tools”菜单下增加菜单项“My Extension”,点击“My Extension”时,方法 openExntensionForm() 将会被调用,在 openExtensionForm() 中可以书写一些逻辑来调用客户化的代码。在加入这两个方法后,要在 load 方法中调用 AddGuiToAppScan()

    private void AddGuiToAppScan()
    {
    	IMenuItem myExtensionItem = 
    	new MenuItem("My Extension", openExtensionForm);
    	_appScanGui.ToolsMenu.Add(myExtensionItem);
    }
    private static void openExtensionForm(EventArgs args)
    {           
    }
    

    1. 设计扩展实例窗体,并在窗体中响应 AppScan 安全测试结束事件。

    利用 Visual Studio 2008 设计两个窗体,第一个窗体中有三个按钮,第二窗体的主体为 DataGridView,如下图所示:


    图 5. 入口界面
    入口界面

    图 6. 结果界面
    结果界面

    为第一个窗体的三个按钮编写相应代码如下:

    private void ResScan_Btn_Click(object sender, EventArgs e)
    {
    	if (_appScan.Scan.Status.ExploreOpStatus == ExploreStatus.Finished)
    	{
    		return;
    	}
    	_appScan.Scan.ResetExploreAndTestData();
    	_appScan.Scan.ScanAsync(true, false);
    }
    private void ResTst_Btn_Click(object sender, EventArgs e)
    {
    	_appScan.Scan.ScanAsync(false, true);
    	ResTst_Btn.Enabled = false;
    }
    private void ShowResult_Btn_Click(object sender, EventArgs e)
    {
    	ResultForm. resultform. = new ResultForm(_appScan);
    	resultform.Show();
    }
    

    • ResScan_Btn_Click():Resource Scan 响应代码,这部分代码判断 AppScan 的资源扫描是否已经结束,如果没有结束则运行异步扫描。
    • ResTst_Btn_Click():异步测试,在测试运行后将“Resource Test”按钮置成不可用状态。
    • ShowResult_Btn_Click():打开结果显示表单。

    在上面的代码实现中,方法 ResTst_Btn_Click() 在执行中将按钮置成为不可用状态,需要在测试结束后再次将按钮激活,这就需要利用 AppScan 的事件。AppScan 定义了近四十种事件,来支持 AppScan 扩展能够对 AppScan 的处理做出相应,比如下面几种:

    • ExploreEnded:当一次对目标网站资源扫描结束时发出。
    • ExploreStarting:当一次对目标网站资源扫描结束时发出 .
    • Login:当 AppScan 需要用户手工登录到目标网站时发出
    • SaveEnded:保存操作结束时发出
    • SaveProgress:保存操作在报告进度时发出
    • TestEnded:对目标网站进行测试时发出
    • TestStarting:对目标网站的测试开始时发出 .

    这里使用了 TestEnded 事件,表示当安全测试结束时,重新激活“Resource Test”按钮。在按钮窗体的构造函数中加入如下代码:

    _appScan.Scan.TestEnded += 
    	new EventHandler(testEnded);
    

    上面代码中的 testEnded 方法负责激活按钮。

    1. 提取测试结果:

    Appscan 的扫描结果是以树型结构存储在 appscan.scan.scanData 对象中,appscan.scan.scanData.AppTreeRoot 时这个树型结构的根节点。在 ResultForm 打开时,下面的代码就是递归方法从这个根节点中获取根节点及其所有子节点的扫描结果。

    //Recusive to get all resources and related issues.
    private void visit(IAppTreeNode node, ArrayList totalIssues)
    {
    	if (node.Children.Count > 0)
    	{
    		违规广告ection children = node.Children;
    		foreach (IAppTreeNode child in children)
    		{
    			visit(child, totalIssues);
    		}
    	}
    	else
    	{
    		IIssueType issueType = null;
    		违规广告ection issues = node.GetIssues();
    		ScanResult scanResult;
    		foreach (IIssue issue in issues)
    		{
    			issueType = issue.IssueType;
    			scanResult = new ScanResult();
    			scanResult.ResourceURL = node.Path;
    			scanResult.IssueDesc = issueType.Name;
    			totalIssues.Add(scanResult);
    		}
    	}
    }
    

    1. AppScan 扩展主表单加载时利用 Thread 打开新的线程来运行表单以避免发生内存错误:
    public void Show()
            {
                Thread formThread = new Thread(new ThreadStart(ShowDialog));
                formThread.SetApartmentState(ApartmentState.STA);
                formThread.Start();
            }
    

    第 3 步:插件打包和运行

    1. 创建 info.xml

    info.xml 文件是 AppScan 扩展点的定义文件,其中定义了如下元素:

    • FullName:插件的完整名称;
    • Description:插件描述;
    • Author:插件编写人;
    • HomepageURL:插件主页地址;
    • Version:插件版本;
    • Copyright:版权描述信息;
    • IconFile:为插件指定的图片;
    • TargetEdition:插件的运行环境,用来制定 AppScan 的版次和版本信息;
    • MainDllFile:入口链接库文件,就是 IExtensionLogic 实现类所在的链接库。

    Info.xml 示例以及插件安装后 info.xml 的每项对应的位置,如下图所示:


    图 7. info.xml 显示
    info.xml 显示
    1. 打包

    将上面项目生成的连接库文件 AppScanExtensionTest.dll 和 info.xml 放到同一个文件夹中,连同文件夹一起打包成一个 ZIP 文件,注意,一定要连同文件夹一起打包,否则 AppScan 将无法识别。

    1. 安装

    运行 AppScan,打开菜单“Tools->Extensions->Extension Manager”,如下图:


    图 8. extension manager 菜单
    extension manager 菜单

    Extension Manager 窗口打开,如下图:


    图 9. extension manager 窗体
    extension manager 窗体

    点击“Install”按钮,在文件选择窗口中选择之前打包的 zip 文件,点击“Open”按钮,如下图所示:


    图 10. 选择包文件
    选择包文件

    重新启动 AppScan,新的菜单项“My Extension”会出现:


    图 11. 扩展菜单项
    扩展菜单项
    1. 运行

    点击上面的菜单,依次按下三个按钮,程序运行结果如下:


    图 12. 运行结果
    运行结果 

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/14780873/viewspace-582401/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2008-07-07

  • 博文量
    211
  • 访问量
    325329