攻击模块API概述

AppSpider是一个web应用程序安全扫描程序。其主要目的是发现网站和web服务中可利用的安全缺陷。

AppSpider拥有50多个内置攻击模块。在某些情况下,您可能需要添加特定于您的环境的其他攻击。您可以通过修改模块配置和攻击配置文件来添加或更改现有攻击模块发送的攻击有效载荷,但在某些情况下,您可能需要添加一个自定义模块,以发现新类型的漏洞,或使用与我们的攻击模块不同的方法发现漏洞。对于这些情况,您可以创建包含自定义攻击代码的自定义攻击模块。

自定义攻击模块API的所有信息包括在AppSpider 6.14.015中可用的接口和数据结构。

扫描仪的工作原理

AppSpider扫描程序分为两个组件:爬虫程序和攻击者。爬虫程序对网站进行爬网,并发现可以发送到服务器的所有请求。这些请求可以是静态页面、动态页面或web服务请求。然后,攻击者从爬虫程序获取发现数据,并审核所有漏洞请求。攻击者使用攻击模块执行实际攻击。每个攻击模块旨在发现特定类型的漏洞。但是,在某些情况下,所提供的攻击模块可能无法覆盖您需要的漏洞类型。这是您需要构建自定义攻击模块的时候。

概念

在创建自定义攻击模块之前,您应该熟悉一些关键概念。

模块声明

模块声明由以下几个文件组成:

  • 模块声明文件-这是一个名为module.cfg,这是一个XML文件,包含有关攻击模块的信息。有关更多信息,请参阅模块配置文件参考."

  • 攻击声明文件-这是一个名为攻击.cfg,这是一个包含攻击声明的XML文件。有关更多信息,请参阅攻击配置文件参考部分。

  • 攻击模块动态链接库-此DLL是可选的。AttackModule DLL是使用C#创建的。除了文件名必须在中正确引用之外,不要求文件名module.cfg文件名,如以下示例所示:< >位置SampleSQLi.dll > < /位置

一般来说,不要求模块DLL与配置文件位于同一目录中;这只是一个惯例。在某些情况下(例如,调试攻击模块时),可能更容易指向module.cfg文件到Visual studio输出目录中的DLL。

攻击模块从两个位置加载:

  • AppSpider内部模块的位置—内部模块目录位于C:\ProgramFiles(x86)\Rapid7\AppSpider 6\ScanEngine\Modules

  • 用户特定位置-用于存储您开发的自定义模块的目录是您在安装期间指定的用于存储AppSpider用户特定数据的目录。默认情况下,目录设置为%USERPROFILE%\Documents\AppSpider

这两个位置都包含子目录,每个子目录代表一个Attack Module。要添加一个新模块,应该用模块配置文件和攻击配置文件创建一个新的子目录。

攻击声明和默认攻击配置

模块攻击声明在攻击.cfg配置文件。您可以查看示例SampleSQLi以了解典型的attacks.cfg文件。此文件包含AttackConfig结构的列表。每个攻击由一个AttackConfig条目表示。

通常在攻击配置文件中会有多个攻击。同样常见的情况是,攻击具有几乎相同的结构,只有少数特定于特定攻击的字段。为了避免在attacks.cfg文件中有冗余数据,AppSpider允许用户将所有攻击中相同的数据移动到模块配置文件中声明的DefaultAttackConfig结构中。如果在AttackConfig结构中没有定义字段,AppSpider将从defaultatackconfig结构中读取该值。这就是为什么SampleSQLi模块中的AttackConfig结构如此之小的原因;大部分数据是从DefaultAttackConfig读取的。

API结构

AppSpider攻击模块API的结构使得攻击模块实现的函数要么没有参数,要么只有一个整数参数(请参见C#Interface部分)。使用ModuleRunner对象检索实际执行攻击所需的其余信息(例如攻击点)(请参阅API参考部分)。ModuleRunner对象应由攻击模块在其加载函数中显式实例化:

公共空间负载(使用uint模块(NNERID)

{

_模内=AttackerCOMLib。模内();

_moduleRunner.SetModuleInstanceID(moduleRunnerId);

}

在创建了ModuleRunner之后,其余所需的数据可以通过其接口直接或间接访问:AttackPoint对象、Attack对象、Attack Configuration等。

攻击点

对整个网站进行爬网后,攻击空间被划分为攻击点。此划分允许AppSpider优化攻击执行,以确保站点有效地受到攻击,并在框架级别消除许多冗余攻击。在攻击攻击点时,API允许攻击模块仅执行该攻击点允许的操作。

有几种类型的攻击点提供给攻击模块:

  • 主机攻击点—Host为网站名称的地址。例如,http://www.webscantest.com.如果攻击模块想要执行特定于主机的攻击,它应该使用这个攻击点。注意,协议被认为是主机的一部分。

  • 目录攻击点—Directory为站点下的目录。例如,http://www.webscantest.com/datastore/. 需要执行目录分析的模块可以使用此攻击点(例如,检查目录中可能存在的一些已知文件)。

  • 文件攻击点-文件攻击点的一个示例是http://www.webscantest.com/datastore/get \ _item \ _by \ _id.php

  • 爬网结果攻击点。CrawlResult攻击点是对网站的请求,包含所有参数。如果模块希望将攻击有效负载注入现有请求,则这是模块应该使用的攻击点。

  • 参数攻击点—参数攻击点允许攻击模块对请求的特定参数施加攻击载荷。使用参数攻击点将攻击模块从请求格式的知识中分离出来;无论该参数是JSON post数据、谷歌工具包数据还是简单查询参数的一部分,框架都确保攻击有效负载将被正确插入请求中。

AppSpider如何创建攻击点?

为了理解AppSpider如何创建攻击点,让我们考虑爬虫发现的以下网页:http://www.webscantest.com/datastore/store1/get \ _item \ _by \ _id.php ? id = 3名=耙

从爬虫接收数据后,攻击者创建以下攻击点:

之后,模块可以决定它感兴趣的攻击点。有两种机制可以控制它:配置文件(参见攻击配置文件参考,ParameterLocations元素)或函数CalculateEnumberOfAttacks(参见C#接口部分)

请注意,如果有许多请求被发现的主机http://www.webscantest.com/,只创建一个主机攻击点,这样攻击模块就不必跟踪它是否攻击了该主机。同样的方法也适用于其他攻击点。可以有多个指向相同参数名称和值的参数攻击点,但这些参数总是来自不同的请求,具有一组唯一的其他请求参数。

配置和自定义参数

可以使用模块配置文件和攻击配置文件中的自定义参数配置攻击模块。下面显示了此类参数声明的示例

< CustomParameterList >

< CustomParameter >

ParameterName

<![CDATA[ParameterData]>

有两个单独的自定义配置参数列表:

  • ModuleConfig数据结构中的一个,在module.cfg文件,并可选地使用扫描配置文件中的ScanModulesParametersList添加到该文件中。

  • AttackConfig数据结构中的一个,在module.cfg(在DefaultAttackConfig元素中)和攻击.cfg文件夹。

在模块执行期间,模块可以使用以下代码读取这些参数。

  • 对于AttackConfig数据结构中的内容:

AttackerCOMLib。IAttackConfigurationattackConfig=_moduleRunner.GetAttackConfig();

attackConfig.CustomParameters.GetParameter(“ParameterName”);

  • 对于ModuleConfig数据结构中的模块:

_moduleRunner.GetParameters().GetParameter(“ParameterName”);

在扫描配置文件中通常找不到ScanModulesParametersList。如果要使用,必须由用户添加。ScanModulesParametersList元素是ScanConfig元素的子元素,每个模块有一个ScanModuleParameters元素。但是,如果存在需要对多个模块可用的参数,则ModuleId可以使用空Guid使参数对所有模块可用。

示例结构如下所示:

FA48FA7E33B6407B8793D1993C3FF582

< CustomParameterList >

< CustomParameter >

模块特定参数1

特定值1

< CustomParameter >

<名称>模块具体参数2 .

特定值2

00000000000000000000

< CustomParameterList >

< CustomParameter >

全球参数1 <名称> < /名称>

全局值1

< CustomParameter >

全局参数2

全局值2

< / ScanModuleParametersList >

无状态的攻击模块

在扫描运行期间,攻击者多次调用攻击模块。每次调用模块方法时,它都会创建一个新的ICSModule对象。对于这些对象中的每一个,它都调用方法ICSModule加载以允许模块绑定到它的ModuleRunner对象。例如,用于运行CalculateNumberOfAttacks的对象将在调用该函数后立即销毁,并将构造一个不同的对象来运行该攻击(通过调用方法ICSModule)RunAttack)。对象的状态不能在函数调用之间保留。当然,例外是ICSModule::Load方法,它总是在构造新对象之后被调用。

并发性

AppSpider创建多个线程以运行多个攻击。每次攻击都在同一线程中从头到尾执行。但是,可能会同时执行同一攻击模块的两个实例。如果攻击模块的代码使用共享资源,则攻击模块编写器负责同步对共享资源的访问。