获得扩展程序运行的基本步骤

在我们了解每种语言的具体细节之前,请记住一些一般环境:Burp寻找一个名为的课程Burpextender实例化(没有构造函数参数),然后调用register extenderCallbacks()在这个对象上传递”回调“对象。将其视为扩展的入口点,让您告诉BURP您的扩展功能,以及何时Burp问您的扩展问题。

首先,您需要一个IDE。一些流行的选择是:Intellij Idea,,,,Netbeans, 和

创建一个新项目,并创建一个称为“ Burp”的软件包。接下来,您需要在接口文件中复制,您可以在Extender / apis /保存接口文件中从BURP导出。将接口文件保存到为Burp软件包创建的文件夹中。

现在,您已经设置了一般环境,需要创建实际的扩展文件。创建一个名为的新文件burpextender.java(或一个名为的新课程Burpextender,如果您的IDE为您制作文件)并将其粘贴到以下代码中:

包裹;
公共类Burpextender实施Iburpextender
{public void registerexendEnderCallbacks(iburpextenderCallbacks回调) {
//您的扩展代码在这里}
}

此示例根本没有任何作用,但是将在您从IDE生成JAR文件后可以编译并可以加载到BURP中 - 通常会在构建或Dist目录中。在Burp中,转到扩展器工具和“扩展”选项卡,并添加新的扩展名。选择扩展名类型“ Java”,并指定JAR文件的位置。这应该加载到没有错误的情况下。

Burp依靠Jython提供Python的支持。你需要下载“独立jar”版本并配置Burp及其位置(在Extender / options / Python环境中)。

现在创建一个带有您喜欢的名称的新文件,以'.py'结束,然后将以下内容添加到该文件:

来自Burp Import Imburpextender
burpextender(iburpextender):def regissherextenderCallbacks(self,回调):#您的扩展代码在这里
返回

然后转到“扩展名”选项卡,然后添加新扩展名。选择扩展名类型“ Python”,并指定文件的位置。

这个示例根本没有任何作用,但是应该加载到bur脚,没有任何错误。

笔记:由于Jython动态生成Java类的方式,如果加载了几个不同的Python扩展名,或者您多次卸载并重新加载Python扩展名,则可能会遇到内存问题。如果发生这种情况,您将看到一个错误:

java.lang.outofmemoryerror:permgen空间

您可以通过配置低于8的Java版本来避免此问题xx:maxpermsize开始打bur时,命令行的选项。例如:

Java -XX:MaxPermsize = 1G -Jar burp.jar

此选项在Java 8+中不可用,而应由JVM自动管理Permgen尺寸。

Burp依靠Jruby提供红宝石的支持。你需要下载“完整的.jar”版本并配置Burp及其位置(在Extender / options / Ruby环境中)。

现在创建一个带有您喜欢的名称的新文件,以'.rb'结束,然后将以下内容添加到该文件:

需要“ Java”
java_import'burp.iburpextender'

班级Burpextender包括iburpextender

Def Register ExtExtenDerCallbacks(回调)#您的扩展代码在这里结尾
结尾

然后转到“扩展名”选项卡,然后添加新扩展名。选择扩展名类型“ Ruby”,并指定文件的位置。

这个示例根本没有任何作用,但是应该加载到bur脚,没有任何错误。

有用的API

关于BURP编程扩展的第一个重要一件事是,在大多数情况下,您将要检查的数据以字节数组的形式提供(字节[])如果您通常会用字符串编程,这可能需要一些习惯。重要的是要了解,虽然可以从字节转换为字符串,但此过程并不完全是微不足道的,并且可能会膨胀扩展的内存使用情况。在某些情况下,这是不可避免的(例如,您需要针对请求/响应执行正则态度),但是总的来说,您应该尝试直接使用字节。

BURP将为您提供各种数据对象,哪些模型HTTP请求,响应,参数,cookie等以及特定于BURP的项目(例如问题)。我们将在您熟悉HTTP和BURP作为工具的假设下讨论许多模型。

假设您上面创建的空白扩展名的起点,因为您已经实现了iburpextender接口,扩展名的切入点将是方法:

void register explentExtenDerCallbacks(iburpextenderCallbacks callbacks);

边注:由于Python和Ruby兼容性是通过转换为Java字节码提供的,因此我们将以最严格的意义讨论所有接口。要读取它们为Python或Ruby函数,您可以简单地删除类型。例如在Python:

Def Register ExtExtenDerCallbacks(self,回调)

或Ruby:

Def Register ExtExtenDerCallbacks(回调)

使用Java定义可以使我们尽可能精确,并允许我们讨论其有用的翻译层的细微点。为了清楚起见,本文档中提到的一些方法名称已获得了接口的名称。

您可以使用回调对象可以做的第一件有用的事情是告诉burp您的扩展名为什么:

callbacks.setextensionname(您的扩展名称);

这使用户可以为您的扩展名看到一个漂亮的名称。

您可能要做的第一件事是获得助手的副本,以使您的生活更轻松:

iextensionhelpers helpers = callbacks.gethelpers();

首先要检查的工具是您的字节实用程序:

int indexof(byte []数据,字节[]模式,布尔病例敏感,int trom,int to);
字符串bytestostostring(byte [] data);
字节[] StringTobytes(字符串数据);
字符串urldecode(字符串数据);
字符串urlencode(字符串数据);
byte [] uroldecode(byte [] data);
byte [] urlencode(byte [] data);
byte [] base64decode(字符串数据);
byte [] base64decode(byte [] data);
字符串base64encode(字符串数据);
字符串base64encode(byte [] data);

这些允许您在需要的情况下在字符串和字节之间进行转换,并为您提供用于处理网络上数据的编码。beplay体育能用吗

Burp的扩展器API以方便的方式向您返回了一些数据类型,以模拟HTTP概念。简而言之ihttprequestresponse这使您可以访问ihttpservice(即域,端口和协议)并结束请求和响应。可以通过各种过载来进一步处理请求和响应iextensionhelpers.analyzerequest()为了您检查参数,cookie等。

编写扩展程序的核心部分是告诉BURP您的扩展程序能够处理什么,这通过将您的代码的位注册Burp的位置的机制起作用,以便以后可以通过BURP执行此代码。我们不会浏览IextenderCallbacks对象提供的所有功能;最好的是你浏览源要查看Burp理解的可能功能性,但是作为例子,您可以注册一个对象(也许您的当前对象这个(在Java中)或自己(在Python/Ruby中)通过以下API:

void iburpextenderCallbacks.RegisterExtensionStateListener(iextensionStateListener侦听器);

例如

callbacks.registerextensionstateStateListener(this);

现在,为了了解成为一个iextensionStateListener你应该看看在该API的来源这很简单,因为只有一种方法可以实现:

void iextensionStatElistener.extensionunloaded();

因此,您可以确定用户何时卸下扩展名,Burp将为您通知您(如果您注册了!),以便您进行一些清理,例如关闭数据库连接。这通常称为“事件驱动的架构”,在您知道某些事件可能发生但您不知道何时确切的情况下很常见。注册机制使您可以选择要处理的事情,从而使您集中精力。

通常,您可能想保存一些状态;也许您已经向用户询问了配置,或者只是发现了以后要使用的东西。最简单的方法是使用以下API:

void iburPextEndErcallBacks.saveextensionsetting(字符串名称,字符串值);
字符串iburPextEndErcallBacks.loadextenseTeTting(字符串名称);

这些API存在并且之所以有用的原因是它们避免了自己管理文件或数据库的复杂性。要简单地保存和重新加载数据,您应该始终更喜欢使用这些机制,而不是引入文件系统,权限和操作系统差异的头痛。

另一个帮助您避免管理文件的API是:

itempfile iburpextenderCallbacks.savetotempfile(byte [] buffer);
byte [] itempfile.getBuffer();

如果您要处理大量数据并且不希望膨胀您的内存使用情况,这很有用。注意itempfile.delete()被弃用;临时文件会通过关闭时自动删除。

关于在Python&Ruby中处理Java阵列的特别注释

如前所述,Python和Ruby兼容性是通过翻译层实现的,并且该实现细节有时会泄漏。您会在处理Java阵列(最常使用字节)时注意到这一点。

创建一个兼容字节的对象以传递到Burp Extender API:

bytearray(“ foo”)#=> new byte [] {'f','o','o'}

将现有列表转换为Java数组:

来自Jarray Import Array
阵列([1,2,3],'i')>#=> new Int [] {1,2,3}

注意'一世'对应于“整数”。各种原始类型名称可以在Jython文档中找到。

创建一个兼容字节的对象以传递到Burp Extender API:

“ foo” .bytes.to_a#=> new byte [] {'f','o','o'}

将现有数组转换为Java数组:

[1,2,3] .to_java:int#=> new Int [] {1,2,3}

注意:int对应于“整数”。可以在Jruby文档

更多示例

在官方底部的示例扩展中,一些BURP API被突出显示可扩展性页面,他们的源代码包含解释代码的注释,为在实用环境中学习各种可用API提供了丰富的资源。

Burp社区

有关更多帮助和BURP扩展的例子,您可以参考支持中心的Burp扩展社区讨论。

获得更多帮助