From 6e5c60a738f43eae6e941717751cd23da95a6c7b Mon Sep 17 00:00:00 2001 From: AnonymousUser Date: Wed, 7 Oct 2020 01:27:37 +0800 Subject: [PATCH] Update: Gradle Project --- .DS_Store | Bin 0 -> 8196 bytes .classpath | 7 - .project | 17 - build.gradle | 24 + lib/json.jar | Bin 65966 -> 0 bytes settings.gradle | 1 + src/.DS_Store | Bin 0 -> 6148 bytes src/burp/IBurpCollaboratorClientContext.java | 97 -- src/burp/IBurpCollaboratorInteraction.java | 41 - src/burp/IBurpExtender.java | 31 - src/burp/IBurpExtenderCallbacks.java | 1088 ----------------- src/burp/IContextMenuFactory.java | 39 - src/burp/IContextMenuInvocation.java | 156 --- src/burp/ICookie.java | 61 - src/burp/IExtensionHelpers.java | 356 ------ src/burp/IExtensionStateListener.java | 27 - src/burp/IHttpListener.java | 37 - src/burp/IHttpRequestResponse.java | 102 -- src/burp/IHttpRequestResponsePersisted.java | 25 - src/burp/IHttpRequestResponseWithMarkers.java | 44 - src/burp/IHttpService.java | 39 - src/burp/IInterceptedProxyMessage.java | 116 -- src/burp/IIntruderAttack.java | 31 - src/burp/IIntruderPayloadGenerator.java | 50 - .../IIntruderPayloadGeneratorFactory.java | 40 - src/burp/IIntruderPayloadProcessor.java | 45 - src/burp/IMenuItemHandler.java | 36 - src/burp/IMessageEditor.java | 77 -- src/burp/IMessageEditorController.java | 49 - src/burp/IMessageEditorTab.java | 103 -- src/burp/IMessageEditorTabFactory.java | 38 - src/burp/IParameter.java | 104 -- src/burp/IProxyListener.java | 37 - src/burp/IRequestInfo.java | 95 -- src/burp/IResponseInfo.java | 73 -- src/burp/IResponseKeywords.java | 58 - src/burp/IResponseVariations.java | 62 - src/burp/IScanIssue.java | 123 -- src/burp/IScanQueueItem.java | 81 -- src/burp/IScannerCheck.java | 83 -- src/burp/IScannerInsertionPoint.java | 174 --- src/burp/IScannerInsertionPointProvider.java | 38 - src/burp/IScannerListener.java | 30 - src/burp/IScopeChangeListener.java | 25 - src/burp/ISessionHandlingAction.java | 51 - src/burp/ITab.java | 38 - src/burp/ITempFile.java | 33 - src/burp/ITextEditor.java | 90 -- 48 files changed, 25 insertions(+), 3947 deletions(-) create mode 100644 .DS_Store delete mode 100644 .classpath delete mode 100644 .project create mode 100644 build.gradle delete mode 100644 lib/json.jar create mode 100644 settings.gradle create mode 100644 src/.DS_Store delete mode 100644 src/burp/IBurpCollaboratorClientContext.java delete mode 100644 src/burp/IBurpCollaboratorInteraction.java delete mode 100644 src/burp/IBurpExtender.java delete mode 100644 src/burp/IBurpExtenderCallbacks.java delete mode 100644 src/burp/IContextMenuFactory.java delete mode 100644 src/burp/IContextMenuInvocation.java delete mode 100644 src/burp/ICookie.java delete mode 100644 src/burp/IExtensionHelpers.java delete mode 100644 src/burp/IExtensionStateListener.java delete mode 100644 src/burp/IHttpListener.java delete mode 100644 src/burp/IHttpRequestResponse.java delete mode 100644 src/burp/IHttpRequestResponsePersisted.java delete mode 100644 src/burp/IHttpRequestResponseWithMarkers.java delete mode 100644 src/burp/IHttpService.java delete mode 100644 src/burp/IInterceptedProxyMessage.java delete mode 100644 src/burp/IIntruderAttack.java delete mode 100644 src/burp/IIntruderPayloadGenerator.java delete mode 100644 src/burp/IIntruderPayloadGeneratorFactory.java delete mode 100644 src/burp/IIntruderPayloadProcessor.java delete mode 100644 src/burp/IMenuItemHandler.java delete mode 100644 src/burp/IMessageEditor.java delete mode 100644 src/burp/IMessageEditorController.java delete mode 100644 src/burp/IMessageEditorTab.java delete mode 100644 src/burp/IMessageEditorTabFactory.java delete mode 100644 src/burp/IParameter.java delete mode 100644 src/burp/IProxyListener.java delete mode 100644 src/burp/IRequestInfo.java delete mode 100644 src/burp/IResponseInfo.java delete mode 100644 src/burp/IResponseKeywords.java delete mode 100644 src/burp/IResponseVariations.java delete mode 100644 src/burp/IScanIssue.java delete mode 100644 src/burp/IScanQueueItem.java delete mode 100644 src/burp/IScannerCheck.java delete mode 100644 src/burp/IScannerInsertionPoint.java delete mode 100644 src/burp/IScannerInsertionPointProvider.java delete mode 100644 src/burp/IScannerListener.java delete mode 100644 src/burp/IScopeChangeListener.java delete mode 100644 src/burp/ISessionHandlingAction.java delete mode 100644 src/burp/ITab.java delete mode 100644 src/burp/ITempFile.java delete mode 100644 src/burp/ITextEditor.java diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..91619ef09752134ae27485e496b74bac678c7309 GIT binary patch literal 8196 zcmeHMO-~a+7=DK$wgR$zy0_^>uV`gYbYzXA94lMW)0I?IBdBQrL12{*QXh>`bD(QNAyAb{0i{5@0_^PG1rC(Kf>O)*{Zqc; zIzgCBejy!^&NE$Sqp?^t)*D+lw`k1_t*{!TEq|4LTCl>cysR%#>K@ds{IX-$a@x== z^+L<>Y@d^zqKz(V4;-&ZYiU~biUIG(6b3#}P8-|XOQmim^y|rqdP3iuo=zt8$%z~F zdMrA6HFaxlqr9`b_q6`(wTO$zcLVgb#QCN*$Zga2TWT$ts4o1Od&Id3nR>AQ~@!Q|UQxuCE*F;T&xTxT7W{t#_ zJgaQSjr*c4Zrqc`D2&4ln6L(qp#iVpExd;h@EN|r4-z50WQ1HH<0L_*$TTs?44EYv zGDj8#yJPz)zAD BDH8wy literal 0 HcmV?d00001 diff --git a/.classpath b/.classpath deleted file mode 100644 index b0f6699..0000000 --- a/.classpath +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/.project b/.project deleted file mode 100644 index e4a1f16..0000000 --- a/.project +++ /dev/null @@ -1,17 +0,0 @@ - - - HaE - - - - - - org.eclipse.jdt.core.javabuilder - - - - - - org.eclipse.jdt.core.javanature - - diff --git a/build.gradle b/build.gradle new file mode 100644 index 0000000..099d4d1 --- /dev/null +++ b/build.gradle @@ -0,0 +1,24 @@ +apply plugin: 'java' + +repositories { + mavenCentral() +} + +dependencies { + compile 'net.portswigger.burp.extender:burp-extender-api:1.7.13' + compile 'org.json:json:20200518' +} + +sourceSets { + main { + java { + srcDir '.' + } + } +} + +task fatJar(type: Jar) { + baseName = project.name + '-all' + from { configurations.compile.collect { it.isDirectory() ? it : zipTree(it) } } + with jar +} \ No newline at end of file diff --git a/lib/json.jar b/lib/json.jar deleted file mode 100644 index 0b85b0ee713f85785239da640579469c15b16277..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 65966 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 literal 0 HcmV?d00001 diff --git a/src/burp/IBurpCollaboratorClientContext.java b/src/burp/IBurpCollaboratorClientContext.java deleted file mode 100644 index 348fc44..0000000 --- a/src/burp/IBurpCollaboratorClientContext.java +++ /dev/null @@ -1,97 +0,0 @@ -package burp; - -/* - * @(#)IBurpCollaboratorClientContext.java - * - * Copyright PortSwigger Ltd. All rights reserved. - * - * This code may be used to extend the functionality of Burp Suite Community Edition - * and Burp Suite Professional, provided that this usage does not violate the - * license terms for those products. - */ -import java.util.List; - -/** - * This interface represents an instance of a Burp Collaborator client context, - * which can be used to generate Burp Collaborator payloads and poll the - * Collaborator server for any network interactions that result from using those - * payloads. Extensions can obtain new instances of this class by calling - * IBurpExtenderCallbacks.createBurpCollaboratorClientContext(). - * Note that each Burp Collaborator client context is tied to the Collaborator - * server configuration that was in place at the time the context was created. - */ -public interface IBurpCollaboratorClientContext -{ - - /** - * This method is used to generate new Burp Collaborator payloads. - * - * @param includeCollaboratorServerLocation Specifies whether to include the - * Collaborator server location in the generated payload. - * @return The payload that was generated. - * - * @throws IllegalStateException if Burp Collaborator is disabled - */ - String generatePayload(boolean includeCollaboratorServerLocation); - - /** - * This method is used to retrieve all interactions received by the - * Collaborator server resulting from payloads that were generated for this - * context. - * - * @return The Collaborator interactions that have occurred resulting from - * payloads that were generated for this context. - * - * @throws IllegalStateException if Burp Collaborator is disabled - */ - List fetchAllCollaboratorInteractions(); - - /** - * This method is used to retrieve interactions received by the Collaborator - * server resulting from a single payload that was generated for this - * context. - * - * @param payload The payload for which interactions will be retrieved. - * @return The Collaborator interactions that have occurred resulting from - * the given payload. - * - * @throws IllegalStateException if Burp Collaborator is disabled - */ - List fetchCollaboratorInteractionsFor(String payload); - - /** - * This method is used to retrieve all interactions made by Burp Infiltrator - * instrumentation resulting from payloads that were generated for this - * context. - * - * @return The interactions triggered by the Burp Infiltrator - * instrumentation that have occurred resulting from payloads that were - * generated for this context. - * - * @throws IllegalStateException if Burp Collaborator is disabled - */ - List fetchAllInfiltratorInteractions(); - - /** - * This method is used to retrieve interactions made by Burp Infiltrator - * instrumentation resulting from a single payload that was generated for - * this context. - * - * @param payload The payload for which interactions will be retrieved. - * @return The interactions triggered by the Burp Infiltrator - * instrumentation that have occurred resulting from the given payload. - * - * @throws IllegalStateException if Burp Collaborator is disabled - */ - List fetchInfiltratorInteractionsFor(String payload); - - /** - * This method is used to retrieve the network location of the Collaborator - * server. - * - * @return The hostname or IP address of the Collaborator server. - * - * @throws IllegalStateException if Burp Collaborator is disabled - */ - String getCollaboratorServerLocation(); -} diff --git a/src/burp/IBurpCollaboratorInteraction.java b/src/burp/IBurpCollaboratorInteraction.java deleted file mode 100644 index 07ed661..0000000 --- a/src/burp/IBurpCollaboratorInteraction.java +++ /dev/null @@ -1,41 +0,0 @@ -package burp; - -/* - * @(#)IBurpCollaboratorInteraction.java - * - * Copyright PortSwigger Ltd. All rights reserved. - * - * This code may be used to extend the functionality of Burp Suite Community Edition - * and Burp Suite Professional, provided that this usage does not violate the - * license terms for those products. - */ -import java.util.Map; - -/** - * This interface represents a network interaction that occurred with the Burp - * Collaborator server. - */ -public interface IBurpCollaboratorInteraction -{ - - /** - * This method is used to retrieve a property of the interaction. Properties - * of all interactions are: interaction_id, type, client_ip, and time_stamp. - * Properties of DNS interactions are: query_type and raw_query. The - * raw_query value is Base64-encoded. Properties of HTTP interactions are: - * protocol, request, and response. The request and response values are - * Base64-encoded. - * - * @param name The name of the property to retrieve. - * @return A string representing the property value, or null if not present. - */ - String getProperty(String name); - - /** - * This method is used to retrieve a map containing all properties of the - * interaction. - * - * @return A map containing all properties of the interaction. - */ - Map getProperties(); -} diff --git a/src/burp/IBurpExtender.java b/src/burp/IBurpExtender.java deleted file mode 100644 index eaa4bec..0000000 --- a/src/burp/IBurpExtender.java +++ /dev/null @@ -1,31 +0,0 @@ -package burp; - -/* - * @(#)IBurpExtender.java - * - * Copyright PortSwigger Ltd. All rights reserved. - * - * This code may be used to extend the functionality of Burp Suite Community Edition - * and Burp Suite Professional, provided that this usage does not violate the - * license terms for those products. - */ -/** - * All extensions must implement this interface. - * - * Implementations must be called BurpExtender, in the package burp, must be - * declared public, and must provide a default (public, no-argument) - * constructor. - */ -public interface IBurpExtender -{ - /** - * This method is invoked when the extension is loaded. It registers an - * instance of the - * IBurpExtenderCallbacks interface, providing methods that may - * be invoked by the extension to perform various actions. - * - * @param callbacks An - * IBurpExtenderCallbacks object. - */ - void registerExtenderCallbacks(IBurpExtenderCallbacks callbacks); -} diff --git a/src/burp/IBurpExtenderCallbacks.java b/src/burp/IBurpExtenderCallbacks.java deleted file mode 100644 index 884f0f4..0000000 --- a/src/burp/IBurpExtenderCallbacks.java +++ /dev/null @@ -1,1088 +0,0 @@ -package burp; - -/* - * @(#)IBurpExtenderCallbacks.java - * - * Copyright PortSwigger Ltd. All rights reserved. - * - * This code may be used to extend the functionality of Burp Suite Community Edition - * and Burp Suite Professional, provided that this usage does not violate the - * license terms for those products. - */ -import java.awt.Component; -import java.io.OutputStream; -import java.util.List; -import java.util.Map; - -/** - * This interface is used by Burp Suite to pass to extensions a set of callback - * methods that can be used by extensions to perform various actions within - * Burp. - * - * When an extension is loaded, Burp invokes its - * registerExtenderCallbacks() method and passes an instance of the - * IBurpExtenderCallbacks interface. The extension may then invoke - * the methods of this interface as required in order to extend Burp's - * functionality. - */ -public interface IBurpExtenderCallbacks -{ - - /** - * Flag used to identify Burp Suite as a whole. - */ - int TOOL_SUITE = 0x00000001; - /** - * Flag used to identify the Burp Target tool. - */ - int TOOL_TARGET = 0x00000002; - /** - * Flag used to identify the Burp Proxy tool. - */ - int TOOL_PROXY = 0x00000004; - /** - * Flag used to identify the Burp Spider tool. - */ - int TOOL_SPIDER = 0x00000008; - /** - * Flag used to identify the Burp Scanner tool. - */ - int TOOL_SCANNER = 0x00000010; - /** - * Flag used to identify the Burp Intruder tool. - */ - int TOOL_INTRUDER = 0x00000020; - /** - * Flag used to identify the Burp Repeater tool. - */ - int TOOL_REPEATER = 0x00000040; - /** - * Flag used to identify the Burp Sequencer tool. - */ - int TOOL_SEQUENCER = 0x00000080; - /** - * Flag used to identify the Burp Decoder tool. - */ - int TOOL_DECODER = 0x00000100; - /** - * Flag used to identify the Burp Comparer tool. - */ - int TOOL_COMPARER = 0x00000200; - /** - * Flag used to identify the Burp Extender tool. - */ - int TOOL_EXTENDER = 0x00000400; - - /** - * This method is used to set the display name for the current extension, - * which will be displayed within the user interface for the Extender tool. - * - * @param name The extension name. - */ - void setExtensionName(String name); - - /** - * This method is used to obtain an IExtensionHelpers object, - * which can be used by the extension to perform numerous useful tasks. - * - * @return An object containing numerous helper methods, for tasks such as - * building and analyzing HTTP requests. - */ - IExtensionHelpers getHelpers(); - - /** - * This method is used to obtain the current extension's standard output - * stream. Extensions should write all output to this stream, allowing the - * Burp user to configure how that output is handled from within the UI. - * - * @return The extension's standard output stream. - */ - OutputStream getStdout(); - - /** - * This method is used to obtain the current extension's standard error - * stream. Extensions should write all error messages to this stream, - * allowing the Burp user to configure how that output is handled from - * within the UI. - * - * @return The extension's standard error stream. - */ - OutputStream getStderr(); - - /** - * This method prints a line of output to the current extension's standard - * output stream. - * - * @param output The message to print. - */ - void printOutput(String output); - - /** - * This method prints a line of output to the current extension's standard - * error stream. - * - * @param error The message to print. - */ - void printError(String error); - - /** - * This method is used to register a listener which will be notified of - * changes to the extension's state. Note: Any extensions that start - * background threads or open system resources (such as files or database - * connections) should register a listener and terminate threads / close - * resources when the extension is unloaded. - * - * @param listener An object created by the extension that implements the - * IExtensionStateListener interface. - */ - void registerExtensionStateListener(IExtensionStateListener listener); - - /** - * This method is used to retrieve the extension state listeners that are - * registered by the extension. - * - * @return A list of extension state listeners that are currently registered - * by this extension. - */ - List getExtensionStateListeners(); - - /** - * This method is used to remove an extension state listener that has been - * registered by the extension. - * - * @param listener The extension state listener to be removed. - */ - void removeExtensionStateListener(IExtensionStateListener listener); - - /** - * This method is used to register a listener which will be notified of - * requests and responses made by any Burp tool. Extensions can perform - * custom analysis or modification of these messages by registering an HTTP - * listener. - * - * @param listener An object created by the extension that implements the - * IHttpListener interface. - */ - void registerHttpListener(IHttpListener listener); - - /** - * This method is used to retrieve the HTTP listeners that are registered by - * the extension. - * - * @return A list of HTTP listeners that are currently registered by this - * extension. - */ - List getHttpListeners(); - - /** - * This method is used to remove an HTTP listener that has been registered - * by the extension. - * - * @param listener The HTTP listener to be removed. - */ - void removeHttpListener(IHttpListener listener); - - /** - * This method is used to register a listener which will be notified of - * requests and responses being processed by the Proxy tool. Extensions can - * perform custom analysis or modification of these messages, and control - * in-UI message interception, by registering a proxy listener. - * - * @param listener An object created by the extension that implements the - * IProxyListener interface. - */ - void registerProxyListener(IProxyListener listener); - - /** - * This method is used to retrieve the Proxy listeners that are registered - * by the extension. - * - * @return A list of Proxy listeners that are currently registered by this - * extension. - */ - List getProxyListeners(); - - /** - * This method is used to remove a Proxy listener that has been registered - * by the extension. - * - * @param listener The Proxy listener to be removed. - */ - void removeProxyListener(IProxyListener listener); - - /** - * This method is used to register a listener which will be notified of new - * issues that are reported by the Scanner tool. Extensions can perform - * custom analysis or logging of Scanner issues by registering a Scanner - * listener. - * - * @param listener An object created by the extension that implements the - * IScannerListener interface. - */ - void registerScannerListener(IScannerListener listener); - - /** - * This method is used to retrieve the Scanner listeners that are registered - * by the extension. - * - * @return A list of Scanner listeners that are currently registered by this - * extension. - */ - List getScannerListeners(); - - /** - * This method is used to remove a Scanner listener that has been registered - * by the extension. - * - * @param listener The Scanner listener to be removed. - */ - void removeScannerListener(IScannerListener listener); - - /** - * This method is used to register a listener which will be notified of - * changes to Burp's suite-wide target scope. - * - * @param listener An object created by the extension that implements the - * IScopeChangeListener interface. - */ - void registerScopeChangeListener(IScopeChangeListener listener); - - /** - * This method is used to retrieve the scope change listeners that are - * registered by the extension. - * - * @return A list of scope change listeners that are currently registered by - * this extension. - */ - List getScopeChangeListeners(); - - /** - * This method is used to remove a scope change listener that has been - * registered by the extension. - * - * @param listener The scope change listener to be removed. - */ - void removeScopeChangeListener(IScopeChangeListener listener); - - /** - * This method is used to register a factory for custom context menu items. - * When the user invokes a context menu anywhere within Burp, the factory - * will be passed details of the invocation event, and asked to provide any - * custom context menu items that should be shown. - * - * @param factory An object created by the extension that implements the - * IContextMenuFactory interface. - */ - void registerContextMenuFactory(IContextMenuFactory factory); - - /** - * This method is used to retrieve the context menu factories that are - * registered by the extension. - * - * @return A list of context menu factories that are currently registered by - * this extension. - */ - List getContextMenuFactories(); - - /** - * This method is used to remove a context menu factory that has been - * registered by the extension. - * - * @param factory The context menu factory to be removed. - */ - void removeContextMenuFactory(IContextMenuFactory factory); - - /** - * This method is used to register a factory for custom message editor tabs. - * For each message editor that already exists, or is subsequently created, - * within Burp, the factory will be asked to provide a new instance of an - * IMessageEditorTab object, which can provide custom rendering - * or editing of HTTP messages. - * - * @param factory An object created by the extension that implements the - * IMessageEditorTabFactory interface. - */ - void registerMessageEditorTabFactory(IMessageEditorTabFactory factory); - - /** - * This method is used to retrieve the message editor tab factories that are - * registered by the extension. - * - * @return A list of message editor tab factories that are currently - * registered by this extension. - */ - List getMessageEditorTabFactories(); - - /** - * This method is used to remove a message editor tab factory that has been - * registered by the extension. - * - * @param factory The message editor tab factory to be removed. - */ - void removeMessageEditorTabFactory(IMessageEditorTabFactory factory); - - /** - * This method is used to register a provider of Scanner insertion points. - * For each base request that is actively scanned, Burp will ask the - * provider to provide any custom scanner insertion points that are - * appropriate for the request. - * - * @param provider An object created by the extension that implements the - * IScannerInsertionPointProvider interface. - */ - void registerScannerInsertionPointProvider( - IScannerInsertionPointProvider provider); - - /** - * This method is used to retrieve the Scanner insertion point providers - * that are registered by the extension. - * - * @return A list of Scanner insertion point providers that are currently - * registered by this extension. - */ - List getScannerInsertionPointProviders(); - - /** - * This method is used to remove a Scanner insertion point provider that has - * been registered by the extension. - * - * @param provider The Scanner insertion point provider to be removed. - */ - void removeScannerInsertionPointProvider( - IScannerInsertionPointProvider provider); - - /** - * This method is used to register a custom Scanner check. When performing - * scanning, Burp will ask the check to perform active or passive scanning - * on the base request, and report any Scanner issues that are identified. - * - * @param check An object created by the extension that implements the - * IScannerCheck interface. - */ - void registerScannerCheck(IScannerCheck check); - - /** - * This method is used to retrieve the Scanner checks that are registered by - * the extension. - * - * @return A list of Scanner checks that are currently registered by this - * extension. - */ - List getScannerChecks(); - - /** - * This method is used to remove a Scanner check that has been registered by - * the extension. - * - * @param check The Scanner check to be removed. - */ - void removeScannerCheck(IScannerCheck check); - - /** - * This method is used to register a factory for Intruder payloads. Each - * registered factory will be available within the Intruder UI for the user - * to select as the payload source for an attack. When this is selected, the - * factory will be asked to provide a new instance of an - * IIntruderPayloadGenerator object, which will be used to - * generate payloads for the attack. - * - * @param factory An object created by the extension that implements the - * IIntruderPayloadGeneratorFactory interface. - */ - void registerIntruderPayloadGeneratorFactory( - IIntruderPayloadGeneratorFactory factory); - - /** - * This method is used to retrieve the Intruder payload generator factories - * that are registered by the extension. - * - * @return A list of Intruder payload generator factories that are currently - * registered by this extension. - */ - List - getIntruderPayloadGeneratorFactories(); - - /** - * This method is used to remove an Intruder payload generator factory that - * has been registered by the extension. - * - * @param factory The Intruder payload generator factory to be removed. - */ - void removeIntruderPayloadGeneratorFactory( - IIntruderPayloadGeneratorFactory factory); - - /** - * This method is used to register a custom Intruder payload processor. Each - * registered processor will be available within the Intruder UI for the - * user to select as the action for a payload processing rule. - * - * @param processor An object created by the extension that implements the - * IIntruderPayloadProcessor interface. - */ - void registerIntruderPayloadProcessor(IIntruderPayloadProcessor processor); - - /** - * This method is used to retrieve the Intruder payload processors that are - * registered by the extension. - * - * @return A list of Intruder payload processors that are currently - * registered by this extension. - */ - List getIntruderPayloadProcessors(); - - /** - * This method is used to remove an Intruder payload processor that has been - * registered by the extension. - * - * @param processor The Intruder payload processor to be removed. - */ - void removeIntruderPayloadProcessor(IIntruderPayloadProcessor processor); - - /** - * This method is used to register a custom session handling action. Each - * registered action will be available within the session handling rule UI - * for the user to select as a rule action. Users can choose to invoke an - * action directly in its own right, or following execution of a macro. - * - * @param action An object created by the extension that implements the - * ISessionHandlingAction interface. - */ - void registerSessionHandlingAction(ISessionHandlingAction action); - - /** - * This method is used to retrieve the session handling actions that are - * registered by the extension. - * - * @return A list of session handling actions that are currently registered - * by this extension. - */ - List getSessionHandlingActions(); - - /** - * This method is used to remove a session handling action that has been - * registered by the extension. - * - * @param action The extension session handling action to be removed. - */ - void removeSessionHandlingAction(ISessionHandlingAction action); - - /** - * This method is used to unload the extension from Burp Suite. - */ - void unloadExtension(); - - /** - * This method is used to add a custom tab to the main Burp Suite window. - * - * @param tab An object created by the extension that implements the - * ITab interface. - */ - void addSuiteTab(ITab tab); - - /** - * This method is used to remove a previously-added tab from the main Burp - * Suite window. - * - * @param tab An object created by the extension that implements the - * ITab interface. - */ - void removeSuiteTab(ITab tab); - - /** - * This method is used to customize UI components in line with Burp's UI - * style, including font size, colors, table line spacing, etc. The action - * is performed recursively on any child components of the passed-in - * component. - * - * @param component The UI component to be customized. - */ - void customizeUiComponent(Component component); - - /** - * This method is used to create a new instance of Burp's HTTP message - * editor, for the extension to use in its own UI. - * - * @param controller An object created by the extension that implements the - * IMessageEditorController interface. This parameter is - * optional and may be null. If it is provided, then the - * message editor will query the controller when required to obtain details - * about the currently displayed message, including the - * IHttpService for the message, and the associated request or - * response message. If a controller is not provided, then the message - * editor will not support context menu actions, such as sending requests to - * other Burp tools. - * @param editable Indicates whether the editor created should be editable, - * or used only for message viewing. - * @return An object that implements the IMessageEditor - * interface, and which the extension can use in its own UI. - */ - IMessageEditor createMessageEditor(IMessageEditorController controller, - boolean editable); - - /** - * This method returns the command line arguments that were passed to Burp - * on startup. - * - * @return The command line arguments that were passed to Burp on startup. - */ - String[] getCommandLineArguments(); - - /** - * This method is used to save configuration settings for the extension in a - * persistent way that survives reloads of the extension and of Burp Suite. - * Saved settings can be retrieved using the method - * loadExtensionSetting(). - * - * @param name The name of the setting. - * @param value The value of the setting. If this value is null - * then any existing setting with the specified name will be removed. - */ - void saveExtensionSetting(String name, String value); - - /** - * This method is used to load configuration settings for the extension that - * were saved using the method saveExtensionSetting(). - * - * @param name The name of the setting. - * @return The value of the setting, or null if no value is - * set. - */ - String loadExtensionSetting(String name); - - /** - * This method is used to create a new instance of Burp's plain text editor, - * for the extension to use in its own UI. - * - * @return An object that implements the ITextEditor interface, - * and which the extension can use in its own UI. - */ - ITextEditor createTextEditor(); - - /** - * This method can be used to send an HTTP request to the Burp Repeater - * tool. The request will be displayed in the user interface, but will not - * be issued until the user initiates this action. - * - * @param host The hostname of the remote HTTP server. - * @param port The port of the remote HTTP server. - * @param useHttps Flags whether the protocol is HTTPS or HTTP. - * @param request The full HTTP request. - * @param tabCaption An optional caption which will appear on the Repeater - * tab containing the request. If this value is null then a - * default tab index will be displayed. - */ - void sendToRepeater( - String host, - int port, - boolean useHttps, - byte[] request, - String tabCaption); - - /** - * This method can be used to send an HTTP request to the Burp Intruder - * tool. The request will be displayed in the user interface, and markers - * for attack payloads will be placed into default locations within the - * request. - * - * @param host The hostname of the remote HTTP server. - * @param port The port of the remote HTTP server. - * @param useHttps Flags whether the protocol is HTTPS or HTTP. - * @param request The full HTTP request. - */ - void sendToIntruder( - String host, - int port, - boolean useHttps, - byte[] request); - - /** - * This method can be used to send an HTTP request to the Burp Intruder - * tool. The request will be displayed in the user interface, and markers - * for attack payloads will be placed into the specified locations within - * the request. - * - * @param host The hostname of the remote HTTP server. - * @param port The port of the remote HTTP server. - * @param useHttps Flags whether the protocol is HTTPS or HTTP. - * @param request The full HTTP request. - * @param payloadPositionOffsets A list of index pairs representing the - * payload positions to be used. Each item in the list must be an int[2] - * array containing the start and end offsets for the payload position. - */ - void sendToIntruder( - String host, - int port, - boolean useHttps, - byte[] request, - List payloadPositionOffsets); - - /** - * This method can be used to send data to the Comparer tool. - * - * @param data The data to be sent to Comparer. - */ - void sendToComparer(byte[] data); - - /** - * This method can be used to send a seed URL to the Burp Spider tool. If - * the URL is not within the current Spider scope, the user will be asked if - * they wish to add the URL to the scope. If the Spider is not currently - * running, it will be started. The seed URL will be requested, and the - * Spider will process the application's response in the normal way. - * - * @param url The new seed URL to begin spidering from. - */ - void sendToSpider( - java.net.URL url); - - /** - * This method can be used to send an HTTP request to the Burp Scanner tool - * to perform an active vulnerability scan. If the request is not within the - * current active scanning scope, the user will be asked if they wish to - * proceed with the scan. - * - * @param host The hostname of the remote HTTP server. - * @param port The port of the remote HTTP server. - * @param useHttps Flags whether the protocol is HTTPS or HTTP. - * @param request The full HTTP request. - * @return The resulting scan queue item. - */ - IScanQueueItem doActiveScan( - String host, - int port, - boolean useHttps, - byte[] request); - - /** - * This method can be used to send an HTTP request to the Burp Scanner tool - * to perform an active vulnerability scan, based on a custom list of - * insertion points that are to be scanned. If the request is not within the - * current active scanning scope, the user will be asked if they wish to - * proceed with the scan. - * - * @param host The hostname of the remote HTTP server. - * @param port The port of the remote HTTP server. - * @param useHttps Flags whether the protocol is HTTPS or HTTP. - * @param request The full HTTP request. - * @param insertionPointOffsets A list of index pairs representing the - * positions of the insertion points that should be scanned. Each item in - * the list must be an int[2] array containing the start and end offsets for - * the insertion point. - * @return The resulting scan queue item. - */ - IScanQueueItem doActiveScan( - String host, - int port, - boolean useHttps, - byte[] request, - List insertionPointOffsets); - - /** - * This method can be used to send an HTTP request to the Burp Scanner tool - * to perform a passive vulnerability scan. - * - * @param host The hostname of the remote HTTP server. - * @param port The port of the remote HTTP server. - * @param useHttps Flags whether the protocol is HTTPS or HTTP. - * @param request The full HTTP request. - * @param response The full HTTP response. - */ - void doPassiveScan( - String host, - int port, - boolean useHttps, - byte[] request, - byte[] response); - - /** - * This method can be used to issue HTTP requests and retrieve their - * responses. - * - * @param httpService The HTTP service to which the request should be sent. - * @param request The full HTTP request. - * @return An object that implements the IHttpRequestResponse - * interface, and which the extension can query to obtain the details of the - * response. - */ - IHttpRequestResponse makeHttpRequest(IHttpService httpService, - byte[] request); - - /** - * This method can be used to issue HTTP requests and retrieve their - * responses. - * - * @param host The hostname of the remote HTTP server. - * @param port The port of the remote HTTP server. - * @param useHttps Flags whether the protocol is HTTPS or HTTP. - * @param request The full HTTP request. - * @return The full response retrieved from the remote server. - */ - byte[] makeHttpRequest( - String host, - int port, - boolean useHttps, - byte[] request); - - /** - * This method can be used to query whether a specified URL is within the - * current Suite-wide scope. - * - * @param url The URL to query. - * @return Returns true if the URL is within the current - * Suite-wide scope. - */ - boolean isInScope(java.net.URL url); - - /** - * This method can be used to include the specified URL in the Suite-wide - * scope. - * - * @param url The URL to include in the Suite-wide scope. - */ - void includeInScope(java.net.URL url); - - /** - * This method can be used to exclude the specified URL from the Suite-wide - * scope. - * - * @param url The URL to exclude from the Suite-wide scope. - */ - void excludeFromScope(java.net.URL url); - - /** - * This method can be used to display a specified message in the Burp Suite - * alerts tab. - * - * @param message The alert message to display. - */ - void issueAlert(String message); - - /** - * This method returns details of all items in the Proxy history. - * - * @return The contents of the Proxy history. - */ - IHttpRequestResponse[] getProxyHistory(); - - /** - * This method returns details of items in the site map. - * - * @param urlPrefix This parameter can be used to specify a URL prefix, in - * order to extract a specific subset of the site map. The method performs a - * simple case-sensitive text match, returning all site map items whose URL - * begins with the specified prefix. If this parameter is null, the entire - * site map is returned. - * - * @return Details of items in the site map. - */ - IHttpRequestResponse[] getSiteMap(String urlPrefix); - - /** - * This method returns all of the current scan issues for URLs matching the - * specified literal prefix. - * - * @param urlPrefix This parameter can be used to specify a URL prefix, in - * order to extract a specific subset of scan issues. The method performs a - * simple case-sensitive text match, returning all scan issues whose URL - * begins with the specified prefix. If this parameter is null, all issues - * are returned. - * @return Details of the scan issues. - */ - IScanIssue[] getScanIssues(String urlPrefix); - - /** - * This method is used to generate a report for the specified Scanner - * issues. The report format can be specified. For all other reporting - * options, the default settings that appear in the reporting UI wizard are - * used. - * - * @param format The format to be used in the report. Accepted values are - * HTML and XML. - * @param issues The Scanner issues to be reported. - * @param file The file to which the report will be saved. - */ - void generateScanReport(String format, IScanIssue[] issues, - java.io.File file); - - /** - * This method is used to retrieve the contents of Burp's session handling - * cookie jar. Extensions that provide an - * ISessionHandlingAction can query and update the cookie jar - * in order to handle unusual session handling mechanisms. - * - * @return A list of ICookie objects representing the contents - * of Burp's session handling cookie jar. - */ - List getCookieJarContents(); - - /** - * This method is used to update the contents of Burp's session handling - * cookie jar. Extensions that provide an - * ISessionHandlingAction can query and update the cookie jar - * in order to handle unusual session handling mechanisms. - * - * @param cookie An ICookie object containing details of the - * cookie to be updated. If the cookie jar already contains a cookie that - * matches the specified domain and name, then that cookie will be updated - * with the new value and expiration, unless the new value is - * null, in which case the cookie will be removed. If the - * cookie jar does not already contain a cookie that matches the specified - * domain and name, then the cookie will be added. - */ - void updateCookieJar(ICookie cookie); - - /** - * This method can be used to add an item to Burp's site map with the - * specified request/response details. This will overwrite the details of - * any existing matching item in the site map. - * - * @param item Details of the item to be added to the site map - */ - void addToSiteMap(IHttpRequestResponse item); - - /** - * This method can be used to restore Burp's state from a specified saved - * state file. This method blocks until the restore operation is completed, - * and must not be called from the event dispatch thread. - * - * @param file The file containing Burp's saved state. - * @deprecated State files have been replaced with Burp project files. - */ - @Deprecated - void restoreState(java.io.File file); - - /** - * This method can be used to save Burp's state to a specified file. This - * method blocks until the save operation is completed, and must not be - * called from the event dispatch thread. - * - * @param file The file to save Burp's state in. - * @deprecated State files have been replaced with Burp project files. - */ - @Deprecated - void saveState(java.io.File file); - - /** - * This method is no longer supported. Please use saveConfigAsJson() instead. - * - * @return A Map of name/value Strings reflecting Burp's current - * configuration. - * @deprecated Use saveConfigAsJson() instead. - */ - @Deprecated - Map saveConfig(); - - /** - * This method is no longer supported. Please use loadConfigFromJson() instead. - * - * @param config A map of name/value Strings to use as Burp's new - * configuration. - * @deprecated Use loadConfigFromJson() instead. - */ - @Deprecated - void loadConfig(Map config); - - /** - * This method causes Burp to save its current project-level configuration - * in JSON format. This is the same format that can be saved and loaded via - * the Burp user interface. To include only certain sections of the - * configuration, you can optionally supply the path to each section that - * should be included, for example: "project_options.connections". If no - * paths are provided, then the entire configuration will be saved. - * - * @param configPaths A list of Strings representing the path to each - * configuration section that should be included. - * @return A String representing the current configuration in JSON format. - */ - String saveConfigAsJson(String... configPaths); - - /** - * This method causes Burp to load a new project-level configuration from - * the JSON String provided. This is the same format that can be saved and - * loaded via the Burp user interface. Partial configurations are - * acceptable, and any settings not specified will be left unmodified. - * - * Any user-level configuration options contained in the input will be - * ignored. - * - * @param config A JSON String containing the new configuration. - */ - void loadConfigFromJson(String config); - - /** - * This method sets the master interception mode for Burp Proxy. - * - * @param enabled Indicates whether interception of Proxy messages should be - * enabled. - */ - void setProxyInterceptionEnabled(boolean enabled); - - /** - * This method retrieves information about the version of Burp in which the - * extension is running. It can be used by extensions to dynamically adjust - * their behavior depending on the functionality and APIs supported by the - * current version. - * - * @return An array of Strings comprised of: the product name (e.g. Burp - * Suite Professional), the major version (e.g. 1.5), the minor version - * (e.g. 03) - */ - String[] getBurpVersion(); - - /** - * This method retrieves the absolute path name of the file from which the - * current extension was loaded. - * - * @return The absolute path name of the file from which the current - * extension was loaded. - */ - String getExtensionFilename(); - - /** - * This method determines whether the current extension was loaded as a BApp - * (a Burp App from the BApp Store). - * - * @return Returns true if the current extension was loaded as a BApp. - */ - boolean isExtensionBapp(); - - /** - * This method can be used to shut down Burp programmatically, with an - * optional prompt to the user. If the method returns, the user canceled the - * shutdown prompt. - * - * @param promptUser Indicates whether to prompt the user to confirm the - * shutdown. - */ - void exitSuite(boolean promptUser); - - /** - * This method is used to create a temporary file on disk containing the - * provided data. Extensions can use temporary files for long-term storage - * of runtime data, avoiding the need to retain that data in memory. - * - * @param buffer The data to be saved to a temporary file. - * @return An object that implements the ITempFile interface. - */ - ITempFile saveToTempFile(byte[] buffer); - - /** - * This method is used to save the request and response of an - * IHttpRequestResponse object to temporary files, so that they - * are no longer held in memory. Extensions can used this method to convert - * IHttpRequestResponse objects into a form suitable for - * long-term storage. - * - * @param httpRequestResponse The IHttpRequestResponse object - * whose request and response messages are to be saved to temporary files. - * @return An object that implements the - * IHttpRequestResponsePersisted interface. - */ - IHttpRequestResponsePersisted saveBuffersToTempFiles( - IHttpRequestResponse httpRequestResponse); - - /** - * This method is used to apply markers to an HTTP request or response, at - * offsets into the message that are relevant for some particular purpose. - * Markers are used in various situations, such as specifying Intruder - * payload positions, Scanner insertion points, and highlights in Scanner - * issues. - * - * @param httpRequestResponse The IHttpRequestResponse object - * to which the markers should be applied. - * @param requestMarkers A list of index pairs representing the offsets of - * markers to be applied to the request message. Each item in the list must - * be an int[2] array containing the start and end offsets for the marker. - * The markers in the list should be in sequence and not overlapping. This - * parameter is optional and may be null if no request markers - * are required. - * @param responseMarkers A list of index pairs representing the offsets of - * markers to be applied to the response message. Each item in the list must - * be an int[2] array containing the start and end offsets for the marker. - * The markers in the list should be in sequence and not overlapping. This - * parameter is optional and may be null if no response markers - * are required. - * @return An object that implements the - * IHttpRequestResponseWithMarkers interface. - */ - IHttpRequestResponseWithMarkers applyMarkers( - IHttpRequestResponse httpRequestResponse, - List requestMarkers, - List responseMarkers); - - /** - * This method is used to obtain the descriptive name for the Burp tool - * identified by the tool flag provided. - * - * @param toolFlag A flag identifying a Burp tool ( TOOL_PROXY, - * TOOL_SCANNER, etc.). Tool flags are defined within this - * interface. - * @return The descriptive name for the specified tool. - */ - String getToolName(int toolFlag); - - /** - * This method is used to register a new Scanner issue. Note: - * Wherever possible, extensions should implement custom Scanner checks - * using IScannerCheck and report issues via those checks, so - * as to integrate with Burp's user-driven workflow, and ensure proper - * consolidation of duplicate reported issues. This method is only designed - * for tasks outside of the normal testing workflow, such as importing - * results from other scanning tools. - * - * @param issue An object created by the extension that implements the - * IScanIssue interface. - */ - void addScanIssue(IScanIssue issue); - - /** - * This method is used to create a new Burp Collaborator client context, - * which can be used to generate Burp Collaborator payloads and poll the - * Collaborator server for any network interactions that result from using - * those payloads. - * - * @return A new instance of IBurpCollaboratorClientContext - * that can be used to generate Collaborator payloads and retrieve - * interactions. - */ - IBurpCollaboratorClientContext createBurpCollaboratorClientContext(); - - /** - * This method parses the specified request and returns details of each - * request parameter. - * - * @param request The request to be parsed. - * @return An array of: String[] { name, value, type } - * containing details of the parameters contained within the request. - * @deprecated Use IExtensionHelpers.analyzeRequest() instead. - */ - @Deprecated - String[][] getParameters(byte[] request); - - /** - * This method parses the specified request and returns details of each HTTP - * header. - * - * @param message The request to be parsed. - * @return An array of HTTP headers. - * @deprecated Use IExtensionHelpers.analyzeRequest() or - * IExtensionHelpers.analyzeResponse() instead. - */ - @Deprecated - String[] getHeaders(byte[] message); - - /** - * This method can be used to register a new menu item which will appear on - * the various context menus that are used throughout Burp Suite to handle - * user-driven actions. - * - * @param menuItemCaption The caption to be displayed on the menu item. - * @param menuItemHandler The handler to be invoked when the user clicks on - * the menu item. - * @deprecated Use registerContextMenuFactory() instead. - */ - @Deprecated - void registerMenuItem( - String menuItemCaption, - IMenuItemHandler menuItemHandler); -} diff --git a/src/burp/IContextMenuFactory.java b/src/burp/IContextMenuFactory.java deleted file mode 100644 index 74d7d82..0000000 --- a/src/burp/IContextMenuFactory.java +++ /dev/null @@ -1,39 +0,0 @@ -package burp; - -/* - * @(#)IContextMenuFactory.java - * - * Copyright PortSwigger Ltd. All rights reserved. - * - * This code may be used to extend the functionality of Burp Suite Community Edition - * and Burp Suite Professional, provided that this usage does not violate the - * license terms for those products. - */ - -import javax.swing.JMenuItem; -import java.util.List; - -/** - * Extensions can implement this interface and then call - * IBurpExtenderCallbacks.registerContextMenuFactory() to register - * a factory for custom context menu items. - */ -public interface IContextMenuFactory -{ - /** - * This method will be called by Burp when the user invokes a context menu - * anywhere within Burp. The factory can then provide any custom context - * menu items that should be displayed in the context menu, based on the - * details of the menu invocation. - * - * @param invocation An object that implements the - * IContextMenuInvocation interface, which the extension can - * query to obtain details of the context menu invocation. - * @return A list of custom menu items (which may include sub-menus, - * checkbox menu items, etc.) that should be displayed. Extensions may - * return - * null from this method, to indicate that no menu items are - * required. - */ - List createMenuItems(IContextMenuInvocation invocation); -} diff --git a/src/burp/IContextMenuInvocation.java b/src/burp/IContextMenuInvocation.java deleted file mode 100644 index a1bbad3..0000000 --- a/src/burp/IContextMenuInvocation.java +++ /dev/null @@ -1,156 +0,0 @@ -package burp; - -/* - * @(#)IContextMenuInvocation.java - * - * Copyright PortSwigger Ltd. All rights reserved. - * - * This code may be used to extend the functionality of Burp Suite Community Edition - * and Burp Suite Professional, provided that this usage does not violate the - * license terms for those products. - */ -import java.awt.event.InputEvent; - -/** - * This interface is used when Burp calls into an extension-provided - * IContextMenuFactory with details of a context menu invocation. - * The custom context menu factory can query this interface to obtain details of - * the invocation event, in order to determine what menu items should be - * displayed. - */ -public interface IContextMenuInvocation -{ - /** - * Used to indicate that the context menu is being invoked in a request - * editor. - */ - static final byte CONTEXT_MESSAGE_EDITOR_REQUEST = 0; - /** - * Used to indicate that the context menu is being invoked in a response - * editor. - */ - static final byte CONTEXT_MESSAGE_EDITOR_RESPONSE = 1; - /** - * Used to indicate that the context menu is being invoked in a non-editable - * request viewer. - */ - static final byte CONTEXT_MESSAGE_VIEWER_REQUEST = 2; - /** - * Used to indicate that the context menu is being invoked in a non-editable - * response viewer. - */ - static final byte CONTEXT_MESSAGE_VIEWER_RESPONSE = 3; - /** - * Used to indicate that the context menu is being invoked in the Target - * site map tree. - */ - static final byte CONTEXT_TARGET_SITE_MAP_TREE = 4; - /** - * Used to indicate that the context menu is being invoked in the Target - * site map table. - */ - static final byte CONTEXT_TARGET_SITE_MAP_TABLE = 5; - /** - * Used to indicate that the context menu is being invoked in the Proxy - * history. - */ - static final byte CONTEXT_PROXY_HISTORY = 6; - /** - * Used to indicate that the context menu is being invoked in the Scanner - * results. - */ - static final byte CONTEXT_SCANNER_RESULTS = 7; - /** - * Used to indicate that the context menu is being invoked in the Intruder - * payload positions editor. - */ - static final byte CONTEXT_INTRUDER_PAYLOAD_POSITIONS = 8; - /** - * Used to indicate that the context menu is being invoked in an Intruder - * attack results. - */ - static final byte CONTEXT_INTRUDER_ATTACK_RESULTS = 9; - /** - * Used to indicate that the context menu is being invoked in a search - * results window. - */ - static final byte CONTEXT_SEARCH_RESULTS = 10; - - /** - * This method can be used to retrieve the native Java input event that was - * the trigger for the context menu invocation. - * - * @return The InputEvent that was the trigger for the context - * menu invocation. - */ - InputEvent getInputEvent(); - - /** - * This method can be used to retrieve the Burp tool within which the - * context menu was invoked. - * - * @return A flag indicating the Burp tool within which the context menu was - * invoked. Burp tool flags are defined in the - * IBurpExtenderCallbacks interface. - */ - int getToolFlag(); - - /** - * This method can be used to retrieve the context within which the menu was - * invoked. - * - * @return An index indicating the context within which the menu was - * invoked. The indices used are defined within this interface. - */ - byte getInvocationContext(); - - /** - * This method can be used to retrieve the bounds of the user's selection - * into the current message, if applicable. - * - * @return An int[2] array containing the start and end offsets of the - * user's selection in the current message. If the user has not made any - * selection in the current message, both offsets indicate the position of - * the caret within the editor. If the menu is not being invoked from a - * message editor, the method returns null. - */ - int[] getSelectionBounds(); - - /** - * This method can be used to retrieve details of the HTTP requests / - * responses that were shown or selected by the user when the context menu - * was invoked. - * - * Note: For performance reasons, the objects returned from this - * method are tied to the originating context of the messages within the - * Burp UI. For example, if a context menu is invoked on the Proxy intercept - * panel, then the - * IHttpRequestResponse returned by this method will reflect - * the current contents of the interception panel, and this will change when - * the current message has been forwarded or dropped. If your extension - * needs to store details of the message for which the context menu has been - * invoked, then you should query those details from the - * IHttpRequestResponse at the time of invocation, or you - * should use - * IBurpExtenderCallbacks.saveBuffersToTempFiles() to create a - * persistent read-only copy of the - * IHttpRequestResponse. - * - * @return An array of IHttpRequestResponse objects - * representing the items that were shown or selected by the user when the - * context menu was invoked. This method returns null if no - * messages are applicable to the invocation. - */ - IHttpRequestResponse[] getSelectedMessages(); - - /** - * This method can be used to retrieve details of the Scanner issues that - * were selected by the user when the context menu was invoked. - * - * @return An array of IScanIssue objects representing the - * issues that were selected by the user when the context menu was invoked. - * This method returns null if no Scanner issues are applicable - * to the invocation. - */ - IScanIssue[] getSelectedIssues(); -} diff --git a/src/burp/ICookie.java b/src/burp/ICookie.java deleted file mode 100644 index 0641cba..0000000 --- a/src/burp/ICookie.java +++ /dev/null @@ -1,61 +0,0 @@ -package burp; - -/* - * @(#)ICookie.java - * - * Copyright PortSwigger Ltd. All rights reserved. - * - * This code may be used to extend the functionality of Burp Suite Community Edition - * and Burp Suite Professional, provided that this usage does not violate the - * license terms for those products. - */ -import java.util.Date; - -/** - * This interface is used to hold details about an HTTP cookie. - */ -public interface ICookie -{ - /** - * This method is used to retrieve the domain for which the cookie is in - * scope. - * - * @return The domain for which the cookie is in scope. Note: For - * cookies that have been analyzed from responses (by calling - * IExtensionHelpers.analyzeResponse() and then - * IResponseInfo.getCookies(), the domain will be - * null if the response did not explicitly set a domain - * attribute for the cookie. - */ - String getDomain(); - - /** - * This method is used to retrieve the path for which the cookie is in - * scope. - * - * @return The path for which the cookie is in scope or null if none is set. - */ - String getPath(); - - /** - * This method is used to retrieve the expiration time for the cookie. - * - * @return The expiration time for the cookie, or - * null if none is set (i.e., for non-persistent session - * cookies). - */ - Date getExpiration(); - - /** - * This method is used to retrieve the name of the cookie. - * - * @return The name of the cookie. - */ - String getName(); - - /** - * This method is used to retrieve the value of the cookie. - * @return The value of the cookie. - */ - String getValue(); -} diff --git a/src/burp/IExtensionHelpers.java b/src/burp/IExtensionHelpers.java deleted file mode 100644 index 0b8f8aa..0000000 --- a/src/burp/IExtensionHelpers.java +++ /dev/null @@ -1,356 +0,0 @@ -package burp; - -/* - * @(#)IExtensionHelpers.java - * - * Copyright PortSwigger Ltd. All rights reserved. - * - * This code may be used to extend the functionality of Burp Suite Community Edition - * and Burp Suite Professional, provided that this usage does not violate the - * license terms for those products. - */ -import java.net.URL; -import java.util.List; - -/** - * This interface contains a number of helper methods, which extensions can use - * to assist with various common tasks that arise for Burp extensions. - * - * Extensions can call IBurpExtenderCallbacks.getHelpers to obtain - * an instance of this interface. - */ -public interface IExtensionHelpers -{ - - /** - * This method can be used to analyze an HTTP request, and obtain various - * key details about it. - * - * @param request An IHttpRequestResponse object containing the - * request to be analyzed. - * @return An IRequestInfo object that can be queried to obtain - * details about the request. - */ - IRequestInfo analyzeRequest(IHttpRequestResponse request); - - /** - * This method can be used to analyze an HTTP request, and obtain various - * key details about it. - * - * @param httpService The HTTP service associated with the request. This is - * optional and may be null, in which case the resulting - * IRequestInfo object will not include the full request URL. - * @param request The request to be analyzed. - * @return An IRequestInfo object that can be queried to obtain - * details about the request. - */ - IRequestInfo analyzeRequest(IHttpService httpService, byte[] request); - - /** - * This method can be used to analyze an HTTP request, and obtain various - * key details about it. The resulting IRequestInfo object will - * not include the full request URL. To obtain the full URL, use one of the - * other overloaded analyzeRequest() methods. - * - * @param request The request to be analyzed. - * @return An IRequestInfo object that can be queried to obtain - * details about the request. - */ - IRequestInfo analyzeRequest(byte[] request); - - /** - * This method can be used to analyze an HTTP response, and obtain various - * key details about it. - * - * @param response The response to be analyzed. - * @return An IResponseInfo object that can be queried to - * obtain details about the response. - */ - IResponseInfo analyzeResponse(byte[] response); - - /** - * This method can be used to retrieve details of a specified parameter - * within an HTTP request. Note: Use analyzeRequest() to - * obtain details of all parameters within the request. - * - * @param request The request to be inspected for the specified parameter. - * @param parameterName The name of the parameter to retrieve. - * @return An IParameter object that can be queried to obtain - * details about the parameter, or null if the parameter was - * not found. - */ - IParameter getRequestParameter(byte[] request, String parameterName); - - /** - * This method can be used to URL-decode the specified data. - * - * @param data The data to be decoded. - * @return The decoded data. - */ - String urlDecode(String data); - - /** - * This method can be used to URL-encode the specified data. Any characters - * that do not need to be encoded within HTTP requests are not encoded. - * - * @param data The data to be encoded. - * @return The encoded data. - */ - String urlEncode(String data); - - /** - * This method can be used to URL-decode the specified data. - * - * @param data The data to be decoded. - * @return The decoded data. - */ - byte[] urlDecode(byte[] data); - - /** - * This method can be used to URL-encode the specified data. Any characters - * that do not need to be encoded within HTTP requests are not encoded. - * - * @param data The data to be encoded. - * @return The encoded data. - */ - byte[] urlEncode(byte[] data); - - /** - * This method can be used to Base64-decode the specified data. - * - * @param data The data to be decoded. - * @return The decoded data. - */ - byte[] base64Decode(String data); - - /** - * This method can be used to Base64-decode the specified data. - * - * @param data The data to be decoded. - * @return The decoded data. - */ - byte[] base64Decode(byte[] data); - - /** - * This method can be used to Base64-encode the specified data. - * - * @param data The data to be encoded. - * @return The encoded data. - */ - String base64Encode(String data); - - /** - * This method can be used to Base64-encode the specified data. - * - * @param data The data to be encoded. - * @return The encoded data. - */ - String base64Encode(byte[] data); - - /** - * This method can be used to convert data from String form into an array of - * bytes. The conversion does not reflect any particular character set, and - * a character with the hex representation 0xWXYZ will always be converted - * into a byte with the representation 0xYZ. It performs the opposite - * conversion to the method bytesToString(), and byte-based - * data that is converted to a String and back again using these two methods - * is guaranteed to retain its integrity (which may not be the case with - * conversions that reflect a given character set). - * - * @param data The data to be converted. - * @return The converted data. - */ - byte[] stringToBytes(String data); - - /** - * This method can be used to convert data from an array of bytes into - * String form. The conversion does not reflect any particular character - * set, and a byte with the representation 0xYZ will always be converted - * into a character with the hex representation 0x00YZ. It performs the - * opposite conversion to the method stringToBytes(), and - * byte-based data that is converted to a String and back again using these - * two methods is guaranteed to retain its integrity (which may not be the - * case with conversions that reflect a given character set). - * - * @param data The data to be converted. - * @return The converted data. - */ - String bytesToString(byte[] data); - - /** - * This method searches a piece of data for the first occurrence of a - * specified pattern. It works on byte-based data in a way that is similar - * to the way the native Java method String.indexOf() works on - * String-based data. - * - * @param data The data to be searched. - * @param pattern The pattern to be searched for. - * @param caseSensitive Flags whether or not the search is case-sensitive. - * @param from The offset within data where the search should - * begin. - * @param to The offset within data where the search should - * end. - * @return The offset of the first occurrence of the pattern within the - * specified bounds, or -1 if no match is found. - */ - int indexOf(byte[] data, - byte[] pattern, - boolean caseSensitive, - int from, - int to); - - /** - * This method builds an HTTP message containing the specified headers and - * message body. If applicable, the Content-Length header will be added or - * updated, based on the length of the body. - * - * @param headers A list of headers to include in the message. - * @param body The body of the message, of null if the message - * has an empty body. - * @return The resulting full HTTP message. - */ - byte[] buildHttpMessage(List headers, byte[] body); - - /** - * This method creates a GET request to the specified URL. The headers used - * in the request are determined by the Request headers settings as - * configured in Burp Spider's options. - * - * @param url The URL to which the request should be made. - * @return A request to the specified URL. - */ - byte[] buildHttpRequest(URL url); - - /** - * This method adds a new parameter to an HTTP request, and if appropriate - * updates the Content-Length header. - * - * @param request The request to which the parameter should be added. - * @param parameter An IParameter object containing details of - * the parameter to be added. Supported parameter types are: - * PARAM_URL, PARAM_BODY and - * PARAM_COOKIE. - * @return A new HTTP request with the new parameter added. - */ - byte[] addParameter(byte[] request, IParameter parameter); - - /** - * This method removes a parameter from an HTTP request, and if appropriate - * updates the Content-Length header. - * - * @param request The request from which the parameter should be removed. - * @param parameter An IParameter object containing details of - * the parameter to be removed. Supported parameter types are: - * PARAM_URL, PARAM_BODY and - * PARAM_COOKIE. - * @return A new HTTP request with the parameter removed. - */ - byte[] removeParameter(byte[] request, IParameter parameter); - - /** - * This method updates the value of a parameter within an HTTP request, and - * if appropriate updates the Content-Length header. Note: This - * method can only be used to update the value of an existing parameter of a - * specified type. If you need to change the type of an existing parameter, - * you should first call removeParameter() to remove the - * parameter with the old type, and then call addParameter() to - * add a parameter with the new type. - * - * @param request The request containing the parameter to be updated. - * @param parameter An IParameter object containing details of - * the parameter to be updated. Supported parameter types are: - * PARAM_URL, PARAM_BODY and - * PARAM_COOKIE. - * @return A new HTTP request with the parameter updated. - */ - byte[] updateParameter(byte[] request, IParameter parameter); - - /** - * This method can be used to toggle a request's method between GET and - * POST. Parameters are relocated between the URL query string and message - * body as required, and the Content-Length header is created or removed as - * applicable. - * - * @param request The HTTP request whose method should be toggled. - * @return A new HTTP request using the toggled method. - */ - byte[] toggleRequestMethod(byte[] request); - - /** - * This method constructs an IHttpService object based on the - * details provided. - * - * @param host The HTTP service host. - * @param port The HTTP service port. - * @param protocol The HTTP service protocol. - * @return An IHttpService object based on the details - * provided. - */ - IHttpService buildHttpService(String host, int port, String protocol); - - /** - * This method constructs an IHttpService object based on the - * details provided. - * - * @param host The HTTP service host. - * @param port The HTTP service port. - * @param useHttps Flags whether the HTTP service protocol is HTTPS or HTTP. - * @return An IHttpService object based on the details - * provided. - */ - IHttpService buildHttpService(String host, int port, boolean useHttps); - - /** - * This method constructs an IParameter object based on the - * details provided. - * - * @param name The parameter name. - * @param value The parameter value. - * @param type The parameter type, as defined in the IParameter - * interface. - * @return An IParameter object based on the details provided. - */ - IParameter buildParameter(String name, String value, byte type); - - /** - * This method constructs an IScannerInsertionPoint object - * based on the details provided. It can be used to quickly create a simple - * insertion point based on a fixed payload location within a base request. - * - * @param insertionPointName The name of the insertion point. - * @param baseRequest The request from which to build scan requests. - * @param from The offset of the start of the payload location. - * @param to The offset of the end of the payload location. - * @return An IScannerInsertionPoint object based on the - * details provided. - */ - IScannerInsertionPoint makeScannerInsertionPoint( - String insertionPointName, - byte[] baseRequest, - int from, - int to); - - /** - * This method analyzes one or more responses to identify variations in a - * number of attributes and returns an IResponseVariations - * object that can be queried to obtain details of the variations. - * - * @param responses The responses to analyze. - * @return An IResponseVariations object representing the - * variations in the responses. - */ - IResponseVariations analyzeResponseVariations(byte[]... responses); - - /** - * This method analyzes one or more responses to identify the number of - * occurrences of the specified keywords and returns an - * IResponseKeywords object that can be queried to obtain - * details of the number of occurrences of each keyword. - * - * @param keywords The keywords to look for. - * @param responses The responses to analyze. - * @return An IResponseKeywords object representing the counts - * of the keywords appearing in the responses. - */ - IResponseKeywords analyzeResponseKeywords(List keywords, byte[]... responses); -} diff --git a/src/burp/IExtensionStateListener.java b/src/burp/IExtensionStateListener.java deleted file mode 100644 index 8817525..0000000 --- a/src/burp/IExtensionStateListener.java +++ /dev/null @@ -1,27 +0,0 @@ -package burp; - -/* - * @(#)IExtensionStateListener.java - * - * Copyright PortSwigger Ltd. All rights reserved. - * - * This code may be used to extend the functionality of Burp Suite Community Edition - * and Burp Suite Professional, provided that this usage does not violate the - * license terms for those products. - */ -/** - * Extensions can implement this interface and then call - * IBurpExtenderCallbacks.registerExtensionStateListener() to - * register an extension state listener. The listener will be notified of - * changes to the extension's state. Note: Any extensions that start - * background threads or open system resources (such as files or database - * connections) should register a listener and terminate threads / close - * resources when the extension is unloaded. - */ -public interface IExtensionStateListener -{ - /** - * This method is called when the extension is unloaded. - */ - void extensionUnloaded(); -} diff --git a/src/burp/IHttpListener.java b/src/burp/IHttpListener.java deleted file mode 100644 index f454d98..0000000 --- a/src/burp/IHttpListener.java +++ /dev/null @@ -1,37 +0,0 @@ -package burp; - -/* - * @(#)IHttpListener.java - * - * Copyright PortSwigger Ltd. All rights reserved. - * - * This code may be used to extend the functionality of Burp Suite Community Edition - * and Burp Suite Professional, provided that this usage does not violate the - * license terms for those products. - */ -/** - * Extensions can implement this interface and then call - * IBurpExtenderCallbacks.registerHttpListener() to register an - * HTTP listener. The listener will be notified of requests and responses made - * by any Burp tool. Extensions can perform custom analysis or modification of - * these messages by registering an HTTP listener. - */ -public interface IHttpListener -{ - /** - * This method is invoked when an HTTP request is about to be issued, and - * when an HTTP response has been received. - * - * @param toolFlag A flag indicating the Burp tool that issued the request. - * Burp tool flags are defined in the - * IBurpExtenderCallbacks interface. - * @param messageIsRequest Flags whether the method is being invoked for a - * request or response. - * @param messageInfo Details of the request / response to be processed. - * Extensions can call the setter methods on this object to update the - * current message and so modify Burp's behavior. - */ - void processHttpMessage(int toolFlag, - boolean messageIsRequest, - IHttpRequestResponse messageInfo); -} diff --git a/src/burp/IHttpRequestResponse.java b/src/burp/IHttpRequestResponse.java deleted file mode 100644 index cc316e9..0000000 --- a/src/burp/IHttpRequestResponse.java +++ /dev/null @@ -1,102 +0,0 @@ -package burp; - -/* - * @(#)IHttpRequestResponse.java - * - * Copyright PortSwigger Ltd. All rights reserved. - * - * This code may be used to extend the functionality of Burp Suite Community Edition - * and Burp Suite Professional, provided that this usage does not violate the - * license terms for those products. - */ -/** - * This interface is used to retrieve and update details about HTTP messages. - * - * Note: The setter methods generally can only be used before the message - * has been processed, and not in read-only contexts. The getter methods - * relating to response details can only be used after the request has been - * issued. - */ -public interface IHttpRequestResponse -{ - /** - * This method is used to retrieve the request message. - * - * @return The request message. - */ - byte[] getRequest(); - - /** - * This method is used to update the request message. - * - * @param message The new request message. - */ - void setRequest(byte[] message); - - /** - * This method is used to retrieve the response message. - * - * @return The response message. - */ - byte[] getResponse(); - - /** - * This method is used to update the response message. - * - * @param message The new response message. - */ - void setResponse(byte[] message); - - /** - * This method is used to retrieve the user-annotated comment for this item, - * if applicable. - * - * @return The user-annotated comment for this item, or null if none is set. - */ - String getComment(); - - /** - * This method is used to update the user-annotated comment for this item. - * - * @param comment The comment to be assigned to this item. - */ - void setComment(String comment); - - /** - * This method is used to retrieve the user-annotated highlight for this - * item, if applicable. - * - * @return The user-annotated highlight for this item, or null if none is - * set. - */ - String getHighlight(); - - /** - * This method is used to update the user-annotated highlight for this item. - * - * @param color The highlight color to be assigned to this item. Accepted - * values are: red, orange, yellow, green, cyan, blue, pink, magenta, gray, - * or a null String to clear any existing highlight. - */ - void setHighlight(String color); - - /** - * This method is used to retrieve the HTTP service for this request / - * response. - * - * @return An - * IHttpService object containing details of the HTTP service. - */ - IHttpService getHttpService(); - - /** - * This method is used to update the HTTP service for this request / - * response. - * - * @param httpService An - * IHttpService object containing details of the new HTTP - * service. - */ - void setHttpService(IHttpService httpService); - -} diff --git a/src/burp/IHttpRequestResponsePersisted.java b/src/burp/IHttpRequestResponsePersisted.java deleted file mode 100644 index 1d75427..0000000 --- a/src/burp/IHttpRequestResponsePersisted.java +++ /dev/null @@ -1,25 +0,0 @@ -package burp; - -/* - * @(#)IHttpRequestResponsePersisted.java - * - * Copyright PortSwigger Ltd. All rights reserved. - * - * This code may be used to extend the functionality of Burp Suite Community Edition - * and Burp Suite Professional, provided that this usage does not violate the - * license terms for those products. - */ -/** - * This interface is used for an - * IHttpRequestResponse object whose request and response messages - * have been saved to temporary files using - * IBurpExtenderCallbacks.saveBuffersToTempFiles(). - */ -public interface IHttpRequestResponsePersisted extends IHttpRequestResponse -{ - /** - * This method is deprecated and no longer performs any action. - */ - @Deprecated - void deleteTempFiles(); -} diff --git a/src/burp/IHttpRequestResponseWithMarkers.java b/src/burp/IHttpRequestResponseWithMarkers.java deleted file mode 100644 index e9f98d8..0000000 --- a/src/burp/IHttpRequestResponseWithMarkers.java +++ /dev/null @@ -1,44 +0,0 @@ -package burp; - -/* - * @(#)IHttpRequestResponseWithMarkers.java - * - * Copyright PortSwigger Ltd. All rights reserved. - * - * This code may be used to extend the functionality of Burp Suite Community Edition - * and Burp Suite Professional, provided that this usage does not violate the - * license terms for those products. - */ -import java.util.List; - -/** - * This interface is used for an - * IHttpRequestResponse object that has had markers applied. - * Extensions can create instances of this interface using - * IBurpExtenderCallbacks.applyMarkers(), or provide their own - * implementation. Markers are used in various situations, such as specifying - * Intruder payload positions, Scanner insertion points, and highlights in - * Scanner issues. - */ -public interface IHttpRequestResponseWithMarkers extends IHttpRequestResponse -{ - /** - * This method returns the details of the request markers. - * - * @return A list of index pairs representing the offsets of markers for the - * request message. Each item in the list is an int[2] array containing the - * start and end offsets for the marker. The method may return - * null if no request markers are defined. - */ - List getRequestMarkers(); - - /** - * This method returns the details of the response markers. - * - * @return A list of index pairs representing the offsets of markers for the - * response message. Each item in the list is an int[2] array containing the - * start and end offsets for the marker. The method may return - * null if no response markers are defined. - */ - List getResponseMarkers(); -} diff --git a/src/burp/IHttpService.java b/src/burp/IHttpService.java deleted file mode 100644 index bb87a8e..0000000 --- a/src/burp/IHttpService.java +++ /dev/null @@ -1,39 +0,0 @@ -package burp; - -/* - * @(#)IHttpService.java - * - * Copyright PortSwigger Ltd. All rights reserved. - * - * This code may be used to extend the functionality of Burp Suite Community Edition - * and Burp Suite Professional, provided that this usage does not violate the - * license terms for those products. - */ -/** - * This interface is used to provide details about an HTTP service, to which - * HTTP requests can be sent. - */ -public interface IHttpService -{ - /** - * This method returns the hostname or IP address for the service. - * - * @return The hostname or IP address for the service. - */ - String getHost(); - - /** - * This method returns the port number for the service. - * - * @return The port number for the service. - */ - int getPort(); - - /** - * This method returns the protocol for the service. - * - * @return The protocol for the service. Expected values are "http" or - * "https". - */ - String getProtocol(); -} diff --git a/src/burp/IInterceptedProxyMessage.java b/src/burp/IInterceptedProxyMessage.java deleted file mode 100644 index a2212ed..0000000 --- a/src/burp/IInterceptedProxyMessage.java +++ /dev/null @@ -1,116 +0,0 @@ -package burp; - -/* - * @(#)IInterceptedProxyMessage.java - * - * Copyright PortSwigger Ltd. All rights reserved. - * - * This code may be used to extend the functionality of Burp Suite Community Edition - * and Burp Suite Professional, provided that this usage does not violate the - * license terms for those products. - */ -import java.net.InetAddress; - -/** - * This interface is used to represent an HTTP message that has been intercepted - * by Burp Proxy. Extensions can register an - * IProxyListener to receive details of proxy messages using this - * interface. * - */ -public interface IInterceptedProxyMessage -{ - /** - * This action causes Burp Proxy to follow the current interception rules to - * determine the appropriate action to take for the message. - */ - static final int ACTION_FOLLOW_RULES = 0; - /** - * This action causes Burp Proxy to present the message to the user for - * manual review or modification. - */ - static final int ACTION_DO_INTERCEPT = 1; - /** - * This action causes Burp Proxy to forward the message to the remote server - * or client, without presenting it to the user. - */ - static final int ACTION_DONT_INTERCEPT = 2; - /** - * This action causes Burp Proxy to drop the message. - */ - static final int ACTION_DROP = 3; - /** - * This action causes Burp Proxy to follow the current interception rules to - * determine the appropriate action to take for the message, and then make a - * second call to processProxyMessage. - */ - static final int ACTION_FOLLOW_RULES_AND_REHOOK = 0x10; - /** - * This action causes Burp Proxy to present the message to the user for - * manual review or modification, and then make a second call to - * processProxyMessage. - */ - static final int ACTION_DO_INTERCEPT_AND_REHOOK = 0x11; - /** - * This action causes Burp Proxy to skip user interception, and then make a - * second call to processProxyMessage. - */ - static final int ACTION_DONT_INTERCEPT_AND_REHOOK = 0x12; - - /** - * This method retrieves a unique reference number for this - * request/response. - * - * @return An identifier that is unique to a single request/response pair. - * Extensions can use this to correlate details of requests and responses - * and perform processing on the response message accordingly. - */ - int getMessageReference(); - - /** - * This method retrieves details of the intercepted message. - * - * @return An IHttpRequestResponse object containing details of - * the intercepted message. - */ - IHttpRequestResponse getMessageInfo(); - - /** - * This method retrieves the currently defined interception action. The - * default action is - * ACTION_FOLLOW_RULES. If multiple proxy listeners are - * registered, then other listeners may already have modified the - * interception action before it reaches the current listener. This method - * can be used to determine whether this has occurred. - * - * @return The currently defined interception action. Possible values are - * defined within this interface. - */ - int getInterceptAction(); - - /** - * This method is used to update the interception action. - * - * @param interceptAction The new interception action. Possible values are - * defined within this interface. - */ - void setInterceptAction(int interceptAction); - - /** - * This method retrieves the name of the Burp Proxy listener that is - * processing the intercepted message. - * - * @return The name of the Burp Proxy listener that is processing the - * intercepted message. The format is the same as that shown in the Proxy - * Listeners UI - for example, "127.0.0.1:8080". - */ - String getListenerInterface(); - - /** - * This method retrieves the client IP address from which the request for - * the intercepted message was received. - * - * @return The client IP address from which the request for the intercepted - * message was received. - */ - InetAddress getClientIpAddress(); -} diff --git a/src/burp/IIntruderAttack.java b/src/burp/IIntruderAttack.java deleted file mode 100644 index b0900ea..0000000 --- a/src/burp/IIntruderAttack.java +++ /dev/null @@ -1,31 +0,0 @@ -package burp; - -/* - * @(#)IIntruderAttack.java - * - * Copyright PortSwigger Ltd. All rights reserved. - * - * This code may be used to extend the functionality of Burp Suite Community Edition - * and Burp Suite Professional, provided that this usage does not violate the - * license terms for those products. - */ -/** - * This interface is used to hold details about an Intruder attack. - */ -public interface IIntruderAttack -{ - /** - * This method is used to retrieve the HTTP service for the attack. - * - * @return The HTTP service for the attack. - */ - IHttpService getHttpService(); - - /** - * This method is used to retrieve the request template for the attack. - * - * @return The request template for the attack. - */ - byte[] getRequestTemplate(); - -} diff --git a/src/burp/IIntruderPayloadGenerator.java b/src/burp/IIntruderPayloadGenerator.java deleted file mode 100644 index 9307c5b..0000000 --- a/src/burp/IIntruderPayloadGenerator.java +++ /dev/null @@ -1,50 +0,0 @@ -package burp; - -/* - * @(#)IIntruderPayloadGenerator.java - * - * Copyright PortSwigger Ltd. All rights reserved. - * - * This code may be used to extend the functionality of Burp Suite Community Edition - * and Burp Suite Professional, provided that this usage does not violate the - * license terms for those products. - */ -/** - * This interface is used for custom Intruder payload generators. Extensions - * that have registered an - * IIntruderPayloadGeneratorFactory must return a new instance of - * this interface when required as part of a new Intruder attack. - */ -public interface IIntruderPayloadGenerator -{ - /** - * This method is used by Burp to determine whether the payload generator is - * able to provide any further payloads. - * - * @return Extensions should return - * false when all the available payloads have been used up, - * otherwise - * true. - */ - boolean hasMorePayloads(); - - /** - * This method is used by Burp to obtain the value of the next payload. - * - * @param baseValue The base value of the current payload position. This - * value may be - * null if the concept of a base value is not applicable (e.g. - * in a battering ram attack). - * @return The next payload to use in the attack. - */ - byte[] getNextPayload(byte[] baseValue); - - /** - * This method is used by Burp to reset the state of the payload generator - * so that the next call to - * getNextPayload() returns the first payload again. This - * method will be invoked when an attack uses the same payload generator for - * more than one payload position, for example in a sniper attack. - */ - void reset(); -} diff --git a/src/burp/IIntruderPayloadGeneratorFactory.java b/src/burp/IIntruderPayloadGeneratorFactory.java deleted file mode 100644 index f765b0a..0000000 --- a/src/burp/IIntruderPayloadGeneratorFactory.java +++ /dev/null @@ -1,40 +0,0 @@ -package burp; - -/* - * @(#)IIntruderPayloadGeneratorFactory.java - * - * Copyright PortSwigger Ltd. All rights reserved. - * - * This code may be used to extend the functionality of Burp Suite Community Edition - * and Burp Suite Professional, provided that this usage does not violate the - * license terms for those products. - */ -/** - * Extensions can implement this interface and then call - * IBurpExtenderCallbacks.registerIntruderPayloadGeneratorFactory() - * to register a factory for custom Intruder payloads. - */ -public interface IIntruderPayloadGeneratorFactory -{ - /** - * This method is used by Burp to obtain the name of the payload generator. - * This will be displayed as an option within the Intruder UI when the user - * selects to use extension-generated payloads. - * - * @return The name of the payload generator. - */ - String getGeneratorName(); - - /** - * This method is used by Burp when the user starts an Intruder attack that - * uses this payload generator. - * - * @param attack An - * IIntruderAttack object that can be queried to obtain details - * about the attack in which the payload generator will be used. - * @return A new instance of - * IIntruderPayloadGenerator that will be used to generate - * payloads for the attack. - */ - IIntruderPayloadGenerator createNewInstance(IIntruderAttack attack); -} diff --git a/src/burp/IIntruderPayloadProcessor.java b/src/burp/IIntruderPayloadProcessor.java deleted file mode 100644 index dc80757..0000000 --- a/src/burp/IIntruderPayloadProcessor.java +++ /dev/null @@ -1,45 +0,0 @@ -package burp; - -/* - * @(#)IIntruderPayloadProcessor.java - * - * Copyright PortSwigger Ltd. All rights reserved. - * - * This code may be used to extend the functionality of Burp Suite Community Edition - * and Burp Suite Professional, provided that this usage does not violate the - * license terms for those products. - */ -/** - * Extensions can implement this interface and then call - * IBurpExtenderCallbacks.registerIntruderPayloadProcessor() to - * register a custom Intruder payload processor. - */ -public interface IIntruderPayloadProcessor -{ - /** - * This method is used by Burp to obtain the name of the payload processor. - * This will be displayed as an option within the Intruder UI when the user - * selects to use an extension-provided payload processor. - * - * @return The name of the payload processor. - */ - String getProcessorName(); - - /** - * This method is invoked by Burp each time the processor should be applied - * to an Intruder payload. - * - * @param currentPayload The value of the payload to be processed. - * @param originalPayload The value of the original payload prior to - * processing by any already-applied processing rules. - * @param baseValue The base value of the payload position, which will be - * replaced with the current payload. - * @return The value of the processed payload. This may be - * null to indicate that the current payload should be skipped, - * and the attack will move directly to the next payload. - */ - byte[] processPayload( - byte[] currentPayload, - byte[] originalPayload, - byte[] baseValue); -} diff --git a/src/burp/IMenuItemHandler.java b/src/burp/IMenuItemHandler.java deleted file mode 100644 index cc1f2da..0000000 --- a/src/burp/IMenuItemHandler.java +++ /dev/null @@ -1,36 +0,0 @@ -package burp; - -/* - * @(#)IMenuItemHandler.java - * - * Copyright PortSwigger Ltd. All rights reserved. - * - * This code may be used to extend the functionality of Burp Suite Community Edition - * and Burp Suite Professional, provided that this usage does not violate the - * license terms for those products. - */ -/** - * Extensions can implement this interface and then call - * IBurpExtenderCallbacks.registerMenuItem() to register a custom - * context menu item. - * - * @deprecated Use - * IContextMenuFactory instead. - */ -@Deprecated -public interface IMenuItemHandler -{ - /** - * This method is invoked by Burp Suite when the user clicks on a custom - * menu item which the extension has registered with Burp. - * - * @param menuItemCaption The caption of the menu item which was clicked. - * This parameter enables extensions to provide a single implementation - * which handles multiple different menu items. - * @param messageInfo Details of the HTTP message(s) for which the context - * menu was displayed. - */ - void menuItemClicked( - String menuItemCaption, - IHttpRequestResponse[] messageInfo); -} diff --git a/src/burp/IMessageEditor.java b/src/burp/IMessageEditor.java deleted file mode 100644 index fd0c740..0000000 --- a/src/burp/IMessageEditor.java +++ /dev/null @@ -1,77 +0,0 @@ -package burp; - -/* - * @(#)IMessageEditor.java - * - * Copyright PortSwigger Ltd. All rights reserved. - * - * This code may be used to extend the functionality of Burp Suite Community Edition - * and Burp Suite Professional, provided that this usage does not violate the - * license terms for those products. - */ -import java.awt.Component; - -/** - * This interface is used to provide extensions with an instance of Burp's HTTP - * message editor, for the extension to use in its own UI. Extensions should - * call IBurpExtenderCallbacks.createMessageEditor() to obtain an - * instance of this interface. - */ -public interface IMessageEditor -{ - - /** - * This method returns the UI component of the editor, for extensions to add - * to their own UI. - * - * @return The UI component of the editor. - */ - Component getComponent(); - - /** - * This method is used to display an HTTP message in the editor. - * - * @param message The HTTP message to be displayed. - * @param isRequest Flags whether the message is an HTTP request or - * response. - */ - void setMessage(byte[] message, boolean isRequest); - - /** - * This method is used to retrieve the currently displayed message, which - * may have been modified by the user. - * - * @return The currently displayed HTTP message. - */ - byte[] getMessage(); - - /** - * This method is used to determine whether the current message has been - * modified by the user. - * - * @return An indication of whether the current message has been modified by - * the user since it was first displayed. - */ - boolean isMessageModified(); - - /** - * This method returns the data that is currently selected by the user. - * - * @return The data that is currently selected by the user, or - * null if no selection is made. - */ - byte[] getSelectedData(); - - /** - * This method can be used to retrieve the bounds of the user's selection - * into the displayed message, if applicable. - * - * @return An int[2] array containing the start and end offsets of the - * user's selection within the displayed message. If the user has not made - * any selection in the current message, both offsets indicate the position - * of the caret within the editor. For some editor views, the concept of - * selection within the message does not apply, in which case this method - * returns null. - */ - int[] getSelectionBounds(); -} diff --git a/src/burp/IMessageEditorController.java b/src/burp/IMessageEditorController.java deleted file mode 100644 index 7fda272..0000000 --- a/src/burp/IMessageEditorController.java +++ /dev/null @@ -1,49 +0,0 @@ -package burp; - -/* - * @(#)IMessageEditorController.java - * - * Copyright PortSwigger Ltd. All rights reserved. - * - * This code may be used to extend the functionality of Burp Suite Community Edition - * and Burp Suite Professional, provided that this usage does not violate the - * license terms for those products. - */ -/** - * This interface is used by an - * IMessageEditor to obtain details about the currently displayed - * message. Extensions that create instances of Burp's HTTP message editor can - * optionally provide an implementation of - * IMessageEditorController, which the editor will invoke when it - * requires further information about the current message (for example, to send - * it to another Burp tool). Extensions that provide custom editor tabs via an - * IMessageEditorTabFactory will receive a reference to an - * IMessageEditorController object for each tab instance they - * generate, which the tab can invoke if it requires further information about - * the current message. - */ -public interface IMessageEditorController -{ - /** - * This method is used to retrieve the HTTP service for the current message. - * - * @return The HTTP service for the current message. - */ - IHttpService getHttpService(); - - /** - * This method is used to retrieve the HTTP request associated with the - * current message (which may itself be a response). - * - * @return The HTTP request associated with the current message. - */ - byte[] getRequest(); - - /** - * This method is used to retrieve the HTTP response associated with the - * current message (which may itself be a request). - * - * @return The HTTP response associated with the current message. - */ - byte[] getResponse(); -} diff --git a/src/burp/IMessageEditorTab.java b/src/burp/IMessageEditorTab.java deleted file mode 100644 index 853c35e..0000000 --- a/src/burp/IMessageEditorTab.java +++ /dev/null @@ -1,103 +0,0 @@ -package burp; - -/* - * @(#)IMessageEditorTab.java - * - * Copyright PortSwigger Ltd. All rights reserved. - * - * This code may be used to extend the functionality of Burp Suite Community Edition - * and Burp Suite Professional, provided that this usage does not violate the - * license terms for those products. - */ -import java.awt.Component; - -/** - * Extensions that register an - * IMessageEditorTabFactory must return instances of this - * interface, which Burp will use to create custom tabs within its HTTP message - * editors. - */ -public interface IMessageEditorTab -{ - /** - * This method returns the caption that should appear on the custom tab when - * it is displayed. Note: Burp invokes this method once when the tab - * is first generated, and the same caption will be used every time the tab - * is displayed. - * - * @return The caption that should appear on the custom tab when it is - * displayed. - */ - String getTabCaption(); - - /** - * This method returns the component that should be used as the contents of - * the custom tab when it is displayed. Note: Burp invokes this - * method once when the tab is first generated, and the same component will - * be used every time the tab is displayed. - * - * @return The component that should be used as the contents of the custom - * tab when it is displayed. - */ - Component getUiComponent(); - - /** - * The hosting editor will invoke this method before it displays a new HTTP - * message, so that the custom tab can indicate whether it should be enabled - * for that message. - * - * @param content The message that is about to be displayed, or a zero-length - * array if the existing message is to be cleared. - * @param isRequest Indicates whether the message is a request or a - * response. - * @return The method should return - * true if the custom tab is able to handle the specified - * message, and so will be displayed within the editor. Otherwise, the tab - * will be hidden while this message is displayed. - */ - boolean isEnabled(byte[] content, boolean isRequest); - - /** - * The hosting editor will invoke this method to display a new message or to - * clear the existing message. This method will only be called with a new - * message if the tab has already returned - * true to a call to - * isEnabled() with the same message details. - * - * @param content The message that is to be displayed, or - * null if the tab should clear its contents and disable any - * editable controls. - * @param isRequest Indicates whether the message is a request or a - * response. - */ - void setMessage(byte[] content, boolean isRequest); - - /** - * This method returns the currently displayed message. - * - * @return The currently displayed message. - */ - byte[] getMessage(); - - /** - * This method is used to determine whether the currently displayed message - * has been modified by the user. The hosting editor will always call - * getMessage() before calling this method, so any pending - * edits should be completed within - * getMessage(). - * - * @return The method should return - * true if the user has modified the current message since it - * was first displayed. - */ - boolean isModified(); - - /** - * This method is used to retrieve the data that is currently selected by - * the user. - * - * @return The data that is currently selected by the user. This may be - * null if no selection is currently made. - */ - byte[] getSelectedData(); -} diff --git a/src/burp/IMessageEditorTabFactory.java b/src/burp/IMessageEditorTabFactory.java deleted file mode 100644 index 85aad73..0000000 --- a/src/burp/IMessageEditorTabFactory.java +++ /dev/null @@ -1,38 +0,0 @@ -package burp; - -/* - * @(#)IMessageEditorTabFactory.java - * - * Copyright PortSwigger Ltd. All rights reserved. - * - * This code may be used to extend the functionality of Burp Suite Community Edition - * and Burp Suite Professional, provided that this usage does not violate the - * license terms for those products. - */ -/** - * Extensions can implement this interface and then call - * IBurpExtenderCallbacks.registerMessageEditorTabFactory() to - * register a factory for custom message editor tabs. This allows extensions to - * provide custom rendering or editing of HTTP messages, within Burp's own HTTP - * editor. - */ -public interface IMessageEditorTabFactory -{ - /** - * Burp will call this method once for each HTTP message editor, and the - * factory should provide a new instance of an - * IMessageEditorTab object. - * - * @param controller An - * IMessageEditorController object, which the new tab can query - * to retrieve details about the currently displayed message. This may be - * null for extension-invoked message editors where the - * extension has not provided an editor controller. - * @param editable Indicates whether the hosting editor is editable or - * read-only. - * @return A new - * IMessageEditorTab object for use within the message editor. - */ - IMessageEditorTab createNewInstance(IMessageEditorController controller, - boolean editable); -} diff --git a/src/burp/IParameter.java b/src/burp/IParameter.java deleted file mode 100644 index 41a0668..0000000 --- a/src/burp/IParameter.java +++ /dev/null @@ -1,104 +0,0 @@ -package burp; - -/* - * @(#)IParameter.java - * - * Copyright PortSwigger Ltd. All rights reserved. - * - * This code may be used to extend the functionality of Burp Suite Community Edition - * and Burp Suite Professional, provided that this usage does not violate the - * license terms for those products. - */ -/** - * This interface is used to hold details about an HTTP request parameter. - */ -public interface IParameter -{ - /** - * Used to indicate a parameter within the URL query string. - */ - static final byte PARAM_URL = 0; - /** - * Used to indicate a parameter within the message body. - */ - static final byte PARAM_BODY = 1; - /** - * Used to indicate an HTTP cookie. - */ - static final byte PARAM_COOKIE = 2; - /** - * Used to indicate an item of data within an XML structure. - */ - static final byte PARAM_XML = 3; - /** - * Used to indicate the value of a tag attribute within an XML structure. - */ - static final byte PARAM_XML_ATTR = 4; - /** - * Used to indicate the value of a parameter attribute within a multi-part - * message body (such as the name of an uploaded file). - */ - static final byte PARAM_MULTIPART_ATTR = 5; - /** - * Used to indicate an item of data within a JSON structure. - */ - static final byte PARAM_JSON = 6; - - /** - * This method is used to retrieve the parameter type. - * - * @return The parameter type. The available types are defined within this - * interface. - */ - byte getType(); - - /** - * This method is used to retrieve the parameter name. - * - * @return The parameter name. - */ - String getName(); - - /** - * This method is used to retrieve the parameter value. - * - * @return The parameter value. - */ - String getValue(); - - /** - * This method is used to retrieve the start offset of the parameter name - * within the HTTP request. - * - * @return The start offset of the parameter name within the HTTP request, - * or -1 if the parameter is not associated with a specific request. - */ - int getNameStart(); - - /** - * This method is used to retrieve the end offset of the parameter name - * within the HTTP request. - * - * @return The end offset of the parameter name within the HTTP request, or - * -1 if the parameter is not associated with a specific request. - */ - int getNameEnd(); - - /** - * This method is used to retrieve the start offset of the parameter value - * within the HTTP request. - * - * @return The start offset of the parameter value within the HTTP request, - * or -1 if the parameter is not associated with a specific request. - */ - int getValueStart(); - - /** - * This method is used to retrieve the end offset of the parameter value - * within the HTTP request. - * - * @return The end offset of the parameter value within the HTTP request, or - * -1 if the parameter is not associated with a specific request. - */ - int getValueEnd(); -} diff --git a/src/burp/IProxyListener.java b/src/burp/IProxyListener.java deleted file mode 100644 index daaf55c..0000000 --- a/src/burp/IProxyListener.java +++ /dev/null @@ -1,37 +0,0 @@ -package burp; - -/* - * @(#)IProxyListener.java - * - * Copyright PortSwigger Ltd. All rights reserved. - * - * This code may be used to extend the functionality of Burp Suite Community Edition - * and Burp Suite Professional, provided that this usage does not violate the - * license terms for those products. - */ -/** - * Extensions can implement this interface and then call - * IBurpExtenderCallbacks.registerProxyListener() to register a - * Proxy listener. The listener will be notified of requests and responses being - * processed by the Proxy tool. Extensions can perform custom analysis or - * modification of these messages, and control in-UI message interception, by - * registering a proxy listener. - */ -public interface IProxyListener -{ - /** - * This method is invoked when an HTTP message is being processed by the - * Proxy. - * - * @param messageIsRequest Indicates whether the HTTP message is a request - * or a response. - * @param message An - * IInterceptedProxyMessage object that extensions can use to - * query and update details of the message, and control whether the message - * should be intercepted and displayed to the user for manual review or - * modification. - */ - void processProxyMessage( - boolean messageIsRequest, - IInterceptedProxyMessage message); -} diff --git a/src/burp/IRequestInfo.java b/src/burp/IRequestInfo.java deleted file mode 100644 index 4acea61..0000000 --- a/src/burp/IRequestInfo.java +++ /dev/null @@ -1,95 +0,0 @@ -package burp; - -/* - * @(#)IRequestInfo.java - * - * Copyright PortSwigger Ltd. All rights reserved. - * - * This code may be used to extend the functionality of Burp Suite Community Edition - * and Burp Suite Professional, provided that this usage does not violate the - * license terms for those products. - */ -import java.net.URL; -import java.util.List; - -/** - * This interface is used to retrieve key details about an HTTP request. - * Extensions can obtain an - * IRequestInfo object for a given request by calling - * IExtensionHelpers.analyzeRequest(). - */ -public interface IRequestInfo -{ - /** - * Used to indicate that there is no content. - */ - static final byte CONTENT_TYPE_NONE = 0; - /** - * Used to indicate URL-encoded content. - */ - static final byte CONTENT_TYPE_URL_ENCODED = 1; - /** - * Used to indicate multi-part content. - */ - static final byte CONTENT_TYPE_MULTIPART = 2; - /** - * Used to indicate XML content. - */ - static final byte CONTENT_TYPE_XML = 3; - /** - * Used to indicate JSON content. - */ - static final byte CONTENT_TYPE_JSON = 4; - /** - * Used to indicate AMF content. - */ - static final byte CONTENT_TYPE_AMF = 5; - /** - * Used to indicate unknown content. - */ - static final byte CONTENT_TYPE_UNKNOWN = -1; - - /** - * This method is used to obtain the HTTP method used in the request. - * - * @return The HTTP method used in the request. - */ - String getMethod(); - - /** - * This method is used to obtain the URL in the request. - * - * @return The URL in the request. - */ - URL getUrl(); - - /** - * This method is used to obtain the HTTP headers contained in the request. - * - * @return The HTTP headers contained in the request. - */ - List getHeaders(); - - /** - * This method is used to obtain the parameters contained in the request. - * - * @return The parameters contained in the request. - */ - List getParameters(); - - /** - * This method is used to obtain the offset within the request where the - * message body begins. - * - * @return The offset within the request where the message body begins. - */ - int getBodyOffset(); - - /** - * This method is used to obtain the content type of the message body. - * - * @return An indication of the content type of the message body. Available - * types are defined within this interface. - */ - byte getContentType(); -} diff --git a/src/burp/IResponseInfo.java b/src/burp/IResponseInfo.java deleted file mode 100644 index 9152a20..0000000 --- a/src/burp/IResponseInfo.java +++ /dev/null @@ -1,73 +0,0 @@ -package burp; - -/* - * @(#)IResponseInfo.java - * - * Copyright PortSwigger Ltd. All rights reserved. - * - * This code may be used to extend the functionality of Burp Suite Community Edition - * and Burp Suite Professional, provided that this usage does not violate the - * license terms for those products. - */ -import java.util.List; - -/** - * This interface is used to retrieve key details about an HTTP response. - * Extensions can obtain an - * IResponseInfo object for a given response by calling - * IExtensionHelpers.analyzeResponse(). - */ -public interface IResponseInfo -{ - /** - * This method is used to obtain the HTTP headers contained in the response. - * - * @return The HTTP headers contained in the response. - */ - List getHeaders(); - - /** - * This method is used to obtain the offset within the response where the - * message body begins. - * - * @return The offset within the response where the message body begins. - */ - int getBodyOffset(); - - /** - * This method is used to obtain the HTTP status code contained in the - * response. - * - * @return The HTTP status code contained in the response. - */ - short getStatusCode(); - - /** - * This method is used to obtain details of the HTTP cookies set in the - * response. - * - * @return A list of ICookie objects representing the cookies - * set in the response, if any. - */ - List getCookies(); - - /** - * This method is used to obtain the MIME type of the response, as stated in - * the HTTP headers. - * - * @return A textual label for the stated MIME type, or an empty String if - * this is not known or recognized. The possible labels are the same as - * those used in the main Burp UI. - */ - String getStatedMimeType(); - - /** - * This method is used to obtain the MIME type of the response, as inferred - * from the contents of the HTTP message body. - * - * @return A textual label for the inferred MIME type, or an empty String if - * this is not known or recognized. The possible labels are the same as - * those used in the main Burp UI. - */ - String getInferredMimeType(); -} diff --git a/src/burp/IResponseKeywords.java b/src/burp/IResponseKeywords.java deleted file mode 100644 index adbcfd0..0000000 --- a/src/burp/IResponseKeywords.java +++ /dev/null @@ -1,58 +0,0 @@ -package burp; - -/* - * @(#)IResponseKeywords.java - * - * Copyright PortSwigger Ltd. All rights reserved. - * - * This code may be used to extend the functionality of Burp Suite Community Edition - * and Burp Suite Professional, provided that this usage does not violate the - * license terms for those products. - */ -import java.util.List; - -/** - * This interface is used to represent the counts of keywords appearing in a - * number of HTTP responses. - */ -public interface IResponseKeywords -{ - - /** - * This method is used to obtain the list of keywords whose counts vary - * between the analyzed responses. - * - * @return The keywords whose counts vary between the analyzed responses. - */ - List getVariantKeywords(); - - /** - * This method is used to obtain the list of keywords whose counts do not - * vary between the analyzed responses. - * - * @return The keywords whose counts do not vary between the analyzed - * responses. - */ - List getInvariantKeywords(); - - /** - * This method is used to obtain the number of occurrences of an individual - * keyword in a response. - * - * @param keyword The keyword whose count will be retrieved. - * @param responseIndex The index of the response. Note responses are - * indexed from zero in the order they were originally supplied to the - * IExtensionHelpers.analyzeResponseKeywords() and - * IResponseKeywords.updateWith() methods. - * @return The number of occurrences of the specified keyword for the - * specified response. - */ - int getKeywordCount(String keyword, int responseIndex); - - /** - * This method is used to update the analysis based on additional responses. - * - * @param responses The new responses to include in the analysis. - */ - void updateWith(byte[]... responses); -} diff --git a/src/burp/IResponseVariations.java b/src/burp/IResponseVariations.java deleted file mode 100644 index 8ca65ef..0000000 --- a/src/burp/IResponseVariations.java +++ /dev/null @@ -1,62 +0,0 @@ -package burp; - -/* - * @(#)IResponseVariations.java - * - * Copyright PortSwigger Ltd. All rights reserved. - * - * This code may be used to extend the functionality of Burp Suite Community Edition - * and Burp Suite Professional, provided that this usage does not violate the - * license terms for those products. - */ -import java.util.List; - -/** - * This interface is used to represent variations between a number HTTP - * responses, according to various attributes. - */ -public interface IResponseVariations -{ - - /** - * This method is used to obtain the list of attributes that vary between - * the analyzed responses. - * - * @return The attributes that vary between the analyzed responses. - */ - List getVariantAttributes(); - - /** - * This method is used to obtain the list of attributes that do not vary - * between the analyzed responses. - * - * @return The attributes that do not vary between the analyzed responses. - */ - List getInvariantAttributes(); - - /** - * This method is used to obtain the value of an individual attribute in a - * response. Note that the values of some attributes are intrinsically - * meaningful (e.g. a word count) while the values of others are less so - * (e.g. a checksum of the HTML tag names). - * - * @param attributeName The name of the attribute whose value will be - * retrieved. Extension authors can obtain the list of supported attributes - * by generating an IResponseVariations object for a single - * response and calling - * IResponseVariations.getInvariantAttributes(). - * @param responseIndex The index of the response. Note that responses are - * indexed from zero in the order they were originally supplied to the - * IExtensionHelpers.analyzeResponseVariations() and - * IResponseVariations.updateWith() methods. - * @return The value of the specified attribute for the specified response. - */ - int getAttributeValue(String attributeName, int responseIndex); - - /** - * This method is used to update the analysis based on additional responses. - * - * @param responses The new responses to include in the analysis. - */ - void updateWith(byte[]... responses); -} diff --git a/src/burp/IScanIssue.java b/src/burp/IScanIssue.java deleted file mode 100644 index f18a1bd..0000000 --- a/src/burp/IScanIssue.java +++ /dev/null @@ -1,123 +0,0 @@ -package burp; - -/* - * @(#)IScanIssue.java - * - * Copyright PortSwigger Ltd. All rights reserved. - * - * This code may be used to extend the functionality of Burp Suite Community Edition - * and Burp Suite Professional, provided that this usage does not violate the - * license terms for those products. - */ -/** - * This interface is used to retrieve details of Scanner issues. Extensions can - * obtain details of issues by registering an IScannerListener or - * by calling IBurpExtenderCallbacks.getScanIssues(). Extensions - * can also add custom Scanner issues by registering an - * IScannerCheck or calling - * IBurpExtenderCallbacks.addScanIssue(), and providing their own - * implementations of this interface. Note that issue descriptions and other - * text generated by extensions are subject to an HTML whitelist that allows - * only formatting tags and simple hyperlinks. - */ -public interface IScanIssue -{ - - /** - * This method returns the URL for which the issue was generated. - * - * @return The URL for which the issue was generated. - */ - java.net.URL getUrl(); - - /** - * This method returns the name of the issue type. - * - * @return The name of the issue type (e.g. "SQL injection"). - */ - String getIssueName(); - - /** - * This method returns a numeric identifier of the issue type. See the Burp - * Scanner documentation for a listing of all the issue types. - * - * @return A numeric identifier of the issue type. - */ - int getIssueType(); - - /** - * This method returns the issue severity level. - * - * @return The issue severity level. Expected values are "High", "Medium", - * "Low", "Information" or "False positive". - * - */ - String getSeverity(); - - /** - * This method returns the issue confidence level. - * - * @return The issue confidence level. Expected values are "Certain", "Firm" - * or "Tentative". - */ - String getConfidence(); - - /** - * This method returns a background description for this type of issue. - * - * @return A background description for this type of issue, or - * null if none applies. A limited set of HTML tags may be - * used. - */ - String getIssueBackground(); - - /** - * This method returns a background description of the remediation for this - * type of issue. - * - * @return A background description of the remediation for this type of - * issue, or null if none applies. A limited set of HTML tags - * may be used. - */ - String getRemediationBackground(); - - /** - * This method returns detailed information about this specific instance of - * the issue. - * - * @return Detailed information about this specific instance of the issue, - * or null if none applies. A limited set of HTML tags may be - * used. - */ - String getIssueDetail(); - - /** - * This method returns detailed information about the remediation for this - * specific instance of the issue. - * - * @return Detailed information about the remediation for this specific - * instance of the issue, or null if none applies. A limited - * set of HTML tags may be used. - */ - String getRemediationDetail(); - - /** - * This method returns the HTTP messages on the basis of which the issue was - * generated. - * - * @return The HTTP messages on the basis of which the issue was generated. - * Note: The items in this array should be instances of - * IHttpRequestResponseWithMarkers if applicable, so that - * details of the relevant portions of the request and response messages are - * available. - */ - IHttpRequestResponse[] getHttpMessages(); - - /** - * This method returns the HTTP service for which the issue was generated. - * - * @return The HTTP service for which the issue was generated. - */ - IHttpService getHttpService(); - -} diff --git a/src/burp/IScanQueueItem.java b/src/burp/IScanQueueItem.java deleted file mode 100644 index 5c9e1c2..0000000 --- a/src/burp/IScanQueueItem.java +++ /dev/null @@ -1,81 +0,0 @@ -package burp; - -/* - * @(#)IScanQueueItem.java - * - * Copyright PortSwigger Ltd. All rights reserved. - * - * This code may be used to extend the functionality of Burp Suite Community Edition - * and Burp Suite Professional, provided that this usage does not violate the - * license terms for those products. - */ -/** - * This interface is used to retrieve details of items in the Burp Scanner - * active scan queue. Extensions can obtain references to scan queue items by - * calling - * IBurpExtenderCallbacks.doActiveScan(). - */ -public interface IScanQueueItem -{ - /** - * This method returns a description of the status of the scan queue item. - * - * @return A description of the status of the scan queue item. - */ - String getStatus(); - - /** - * This method returns an indication of the percentage completed for the - * scan queue item. - * - * @return An indication of the percentage completed for the scan queue - * item. - */ - @Deprecated - byte getPercentageComplete(); - - /** - * This method returns the number of requests that have been made for the - * scan queue item. - * - * @return The number of requests that have been made for the scan queue - * item. - */ - int getNumRequests(); - - /** - * This method returns the number of network errors that have occurred for - * the scan queue item. - * - * @return The number of network errors that have occurred for the scan - * queue item. - */ - int getNumErrors(); - - /** - * This method returns the number of attack insertion points being used for - * the scan queue item. - * - * @return The number of attack insertion points being used for the scan - * queue item. - */ - int getNumInsertionPoints(); - - /** - * This method allows the scan queue item to be canceled. - */ - void cancel(); - - /** - * This method returns details of the issues generated for the scan queue - * item. Note: different items within the scan queue may contain - * duplicated versions of the same issues - for example, if the same request - * has been scanned multiple times. Duplicated issues are consolidated in - * the main view of scan results. Extensions can register an - * IScannerListener to get details only of unique, newly - * discovered Scanner issues post-consolidation. - * - * @return Details of the issues generated for the scan queue item. - */ - IScanIssue[] getIssues(); -} diff --git a/src/burp/IScannerCheck.java b/src/burp/IScannerCheck.java deleted file mode 100644 index 5445b0f..0000000 --- a/src/burp/IScannerCheck.java +++ /dev/null @@ -1,83 +0,0 @@ -package burp; - -/* - * @(#)IScannerCheck.java - * - * Copyright PortSwigger Ltd. All rights reserved. - * - * This code may be used to extend the functionality of Burp Suite Community Edition - * and Burp Suite Professional, provided that this usage does not violate the - * license terms for those products. - */ -import java.util.List; - -/** - * Extensions can implement this interface and then call - * IBurpExtenderCallbacks.registerScannerCheck() to register a - * custom Scanner check. When performing scanning, Burp will ask the check to - * perform active or passive scanning on the base request, and report any - * Scanner issues that are identified. - */ -public interface IScannerCheck -{ - - /** - * The Scanner invokes this method for each base request / response that is - * passively scanned. Note: Extensions should only analyze the - * HTTP messages provided during passive scanning, and should not make any - * new HTTP requests of their own. - * - * @param baseRequestResponse The base HTTP request / response that should - * be passively scanned. - * @return A list of IScanIssue objects, or null - * if no issues are identified. - */ - List doPassiveScan(IHttpRequestResponse baseRequestResponse); - - /** - * The Scanner invokes this method for each insertion point that is actively - * scanned. Extensions may issue HTTP requests as required to carry out - * active scanning, and should use the - * IScannerInsertionPoint object provided to build scan - * requests for particular payloads. - * Note: - * Scan checks should submit raw non-encoded payloads to insertion points, - * and the insertion point has responsibility for performing any data - * encoding that is necessary given the nature and location of the insertion - * point. - * - * @param baseRequestResponse The base HTTP request / response that should - * be actively scanned. - * @param insertionPoint An IScannerInsertionPoint object that - * can be queried to obtain details of the insertion point being tested, and - * can be used to build scan requests for particular payloads. - * @return A list of IScanIssue objects, or null - * if no issues are identified. - */ - List doActiveScan( - IHttpRequestResponse baseRequestResponse, - IScannerInsertionPoint insertionPoint); - - /** - * The Scanner invokes this method when the custom Scanner check has - * reported multiple issues for the same URL path. This can arise either - * because there are multiple distinct vulnerabilities, or because the same - * (or a similar) request has been scanned more than once. The custom check - * should determine whether the issues are duplicates. In most cases, where - * a check uses distinct issue names or descriptions for distinct issues, - * the consolidation process will simply be a matter of comparing these - * features for the two issues. - * - * @param existingIssue An issue that was previously reported by this - * Scanner check. - * @param newIssue An issue at the same URL path that has been newly - * reported by this Scanner check. - * @return An indication of which issue(s) should be reported in the main - * Scanner results. The method should return -1 to report the - * existing issue only, 0 to report both issues, and - * 1 to report the new issue only. - */ - int consolidateDuplicateIssues( - IScanIssue existingIssue, - IScanIssue newIssue); -} diff --git a/src/burp/IScannerInsertionPoint.java b/src/burp/IScannerInsertionPoint.java deleted file mode 100644 index 7839440..0000000 --- a/src/burp/IScannerInsertionPoint.java +++ /dev/null @@ -1,174 +0,0 @@ -package burp; - -/* - * @(#)IScannerInsertionPoint.java - * - * Copyright PortSwigger Ltd. All rights reserved. - * - * This code may be used to extend the functionality of Burp Suite Community Edition - * and Burp Suite Professional, provided that this usage does not violate the - * license terms for those products. - */ -/** - * This interface is used to define an insertion point for use by active Scanner - * checks. Extensions can obtain instances of this interface by registering an - * IScannerCheck, or can create instances for use by Burp's own - * scan checks by registering an - * IScannerInsertionPointProvider. - */ -public interface IScannerInsertionPoint -{ - - /** - * Used to indicate where the payload is inserted into the value of a URL - * parameter. - */ - static final byte INS_PARAM_URL = 0x00; - /** - * Used to indicate where the payload is inserted into the value of a body - * parameter. - */ - static final byte INS_PARAM_BODY = 0x01; - /** - * Used to indicate where the payload is inserted into the value of an HTTP - * cookie. - */ - static final byte INS_PARAM_COOKIE = 0x02; - /** - * Used to indicate where the payload is inserted into the value of an item - * of data within an XML data structure. - */ - static final byte INS_PARAM_XML = 0x03; - /** - * Used to indicate where the payload is inserted into the value of a tag - * attribute within an XML structure. - */ - static final byte INS_PARAM_XML_ATTR = 0x04; - /** - * Used to indicate where the payload is inserted into the value of a - * parameter attribute within a multi-part message body (such as the name of - * an uploaded file). - */ - static final byte INS_PARAM_MULTIPART_ATTR = 0x05; - /** - * Used to indicate where the payload is inserted into the value of an item - * of data within a JSON structure. - */ - static final byte INS_PARAM_JSON = 0x06; - /** - * Used to indicate where the payload is inserted into the value of an AMF - * parameter. - */ - static final byte INS_PARAM_AMF = 0x07; - /** - * Used to indicate where the payload is inserted into the value of an HTTP - * request header. - */ - static final byte INS_HEADER = 0x20; - /** - * Used to indicate where the payload is inserted into a URL path folder. - */ - static final byte INS_URL_PATH_FOLDER = 0x21; - /** - * Used to indicate where the payload is inserted into a URL path folder. - * This is now deprecated; use INS_URL_PATH_FOLDER instead. - */ - @Deprecated - static final byte INS_URL_PATH_REST = INS_URL_PATH_FOLDER; - /** - * Used to indicate where the payload is inserted into the name of an added - * URL parameter. - */ - static final byte INS_PARAM_NAME_URL = 0x22; - /** - * Used to indicate where the payload is inserted into the name of an added - * body parameter. - */ - static final byte INS_PARAM_NAME_BODY = 0x23; - /** - * Used to indicate where the payload is inserted into the body of the HTTP - * request. - */ - static final byte INS_ENTIRE_BODY = 0x24; - /** - * Used to indicate where the payload is inserted into the URL path - * filename. - */ - static final byte INS_URL_PATH_FILENAME = 0x25; - /** - * Used to indicate where the payload is inserted at a location manually - * configured by the user. - */ - static final byte INS_USER_PROVIDED = 0x40; - /** - * Used to indicate where the insertion point is provided by an - * extension-registered - * IScannerInsertionPointProvider. - */ - static final byte INS_EXTENSION_PROVIDED = 0x41; - /** - * Used to indicate where the payload is inserted at an unknown location - * within the request. - */ - static final byte INS_UNKNOWN = 0x7f; - - /** - * This method returns the name of the insertion point. - * - * @return The name of the insertion point (for example, a description of a - * particular request parameter). - */ - String getInsertionPointName(); - - /** - * This method returns the base value for this insertion point. - * - * @return the base value that appears in this insertion point in the base - * request being scanned, or null if there is no value in the - * base request that corresponds to this insertion point. - */ - String getBaseValue(); - - /** - * This method is used to build a request with the specified payload placed - * into the insertion point. There is no requirement for extension-provided - * insertion points to adjust the Content-Length header in requests if the - * body length has changed, although Burp-provided insertion points will - * always do this and will return a request with a valid Content-Length - * header. - * Note: - * Scan checks should submit raw non-encoded payloads to insertion points, - * and the insertion point has responsibility for performing any data - * encoding that is necessary given the nature and location of the insertion - * point. - * - * @param payload The payload that should be placed into the insertion - * point. - * @return The resulting request. - */ - byte[] buildRequest(byte[] payload); - - /** - * This method is used to determine the offsets of the payload value within - * the request, when it is placed into the insertion point. Scan checks may - * invoke this method when reporting issues, so as to highlight the relevant - * part of the request within the UI. - * - * @param payload The payload that should be placed into the insertion - * point. - * @return An int[2] array containing the start and end offsets of the - * payload within the request, or null if this is not applicable (for - * example, where the insertion point places a payload into a serialized - * data structure, the raw payload may not literally appear anywhere within - * the resulting request). - */ - int[] getPayloadOffsets(byte[] payload); - - /** - * This method returns the type of the insertion point. - * - * @return The type of the insertion point. Available types are defined in - * this interface. - */ - byte getInsertionPointType(); -} diff --git a/src/burp/IScannerInsertionPointProvider.java b/src/burp/IScannerInsertionPointProvider.java deleted file mode 100644 index 4365ccf..0000000 --- a/src/burp/IScannerInsertionPointProvider.java +++ /dev/null @@ -1,38 +0,0 @@ -package burp; - -/* - * @(#)IScannerInsertionPointProvider.java - * - * Copyright PortSwigger Ltd. All rights reserved. - * - * This code may be used to extend the functionality of Burp Suite Community Edition - * and Burp Suite Professional, provided that this usage does not violate the - * license terms for those products. - */ -import java.util.List; - -/** - * Extensions can implement this interface and then call - * IBurpExtenderCallbacks.registerScannerInsertionPointProvider() - * to register a factory for custom Scanner insertion points. - */ -public interface IScannerInsertionPointProvider -{ - /** - * When a request is actively scanned, the Scanner will invoke this method, - * and the provider should provide a list of custom insertion points that - * will be used in the scan. Note: these insertion points are used in - * addition to those that are derived from Burp Scanner's configuration, and - * those provided by any other Burp extensions. - * - * @param baseRequestResponse The base request that will be actively - * scanned. - * @return A list of - * IScannerInsertionPoint objects that should be used in the - * scanning, or - * null if no custom insertion points are applicable for this - * request. - */ - List getInsertionPoints( - IHttpRequestResponse baseRequestResponse); -} diff --git a/src/burp/IScannerListener.java b/src/burp/IScannerListener.java deleted file mode 100644 index 21c0f4e..0000000 --- a/src/burp/IScannerListener.java +++ /dev/null @@ -1,30 +0,0 @@ -package burp; - -/* - * @(#)IScannerListener.java - * - * Copyright PortSwigger Ltd. All rights reserved. - * - * This code may be used to extend the functionality of Burp Suite Community Edition - * and Burp Suite Professional, provided that this usage does not violate the - * license terms for those products. - */ -/** - * Extensions can implement this interface and then call - * IBurpExtenderCallbacks.registerScannerListener() to register a - * Scanner listener. The listener will be notified of new issues that are - * reported by the Scanner tool. Extensions can perform custom analysis or - * logging of Scanner issues by registering a Scanner listener. - */ -public interface IScannerListener -{ - /** - * This method is invoked when a new issue is added to Burp Scanner's - * results. - * - * @param issue An - * IScanIssue object that the extension can query to obtain - * details about the new issue. - */ - void newScanIssue(IScanIssue issue); -} diff --git a/src/burp/IScopeChangeListener.java b/src/burp/IScopeChangeListener.java deleted file mode 100644 index 30b7918..0000000 --- a/src/burp/IScopeChangeListener.java +++ /dev/null @@ -1,25 +0,0 @@ -package burp; - -/* - * @(#)IScopeChangeListener.java - * - * Copyright PortSwigger Ltd. All rights reserved. - * - * This code may be used to extend the functionality of Burp Suite Community Edition - * and Burp Suite Professional, provided that this usage does not violate the - * license terms for those products. - */ -/** - * Extensions can implement this interface and then call - * IBurpExtenderCallbacks.registerScopeChangeListener() to register - * a scope change listener. The listener will be notified whenever a change - * occurs to Burp's suite-wide target scope. - */ -public interface IScopeChangeListener -{ - /** - * This method is invoked whenever a change occurs to Burp's suite-wide - * target scope. - */ - void scopeChanged(); -} diff --git a/src/burp/ISessionHandlingAction.java b/src/burp/ISessionHandlingAction.java deleted file mode 100644 index 1a147d4..0000000 --- a/src/burp/ISessionHandlingAction.java +++ /dev/null @@ -1,51 +0,0 @@ -package burp; - -/* - * @(#)ISessionHandlingAction.java - * - * Copyright PortSwigger Ltd. All rights reserved. - * - * This code may be used to extend the functionality of Burp Suite Community Edition - * and Burp Suite Professional, provided that this usage does not violate the - * license terms for those products. - */ -/** - * Extensions can implement this interface and then call - * IBurpExtenderCallbacks.registerSessionHandlingAction() to - * register a custom session handling action. Each registered action will be - * available within the session handling rule UI for the user to select as a - * rule action. Users can choose to invoke an action directly in its own right, - * or following execution of a macro. - */ -public interface ISessionHandlingAction -{ - /** - * This method is used by Burp to obtain the name of the session handling - * action. This will be displayed as an option within the session handling - * rule editor when the user selects to execute an extension-provided - * action. - * - * @return The name of the action. - */ - String getActionName(); - - /** - * This method is invoked when the session handling action should be - * executed. This may happen as an action in its own right, or as a - * sub-action following execution of a macro. - * - * @param currentRequest The base request that is currently being processed. - * The action can query this object to obtain details about the base - * request. It can issue additional requests of its own if necessary, and - * can use the setter methods on this object to update the base request. - * @param macroItems If the action is invoked following execution of a - * macro, this parameter contains the result of executing the macro. - * Otherwise, it is - * null. Actions can use the details of the macro items to - * perform custom analysis of the macro to derive values of non-standard - * session handling tokens, etc. - */ - void performAction( - IHttpRequestResponse currentRequest, - IHttpRequestResponse[] macroItems); -} diff --git a/src/burp/ITab.java b/src/burp/ITab.java deleted file mode 100644 index f547993..0000000 --- a/src/burp/ITab.java +++ /dev/null @@ -1,38 +0,0 @@ -package burp; - -/* - * @(#)ITab.java - * - * Copyright PortSwigger Ltd. All rights reserved. - * - * This code may be used to extend the functionality of Burp Suite Community Edition - * and Burp Suite Professional, provided that this usage does not violate the - * license terms for those products. - */ -import java.awt.Component; - -/** - * This interface is used to provide Burp with details of a custom tab that will - * be added to Burp's UI, using a method such as - * IBurpExtenderCallbacks.addSuiteTab(). - */ -public interface ITab -{ - /** - * Burp uses this method to obtain the caption that should appear on the - * custom tab when it is displayed. - * - * @return The caption that should appear on the custom tab when it is - * displayed. - */ - String getTabCaption(); - - /** - * Burp uses this method to obtain the component that should be used as the - * contents of the custom tab when it is displayed. - * - * @return The component that should be used as the contents of the custom - * tab when it is displayed. - */ - Component getUiComponent(); -} diff --git a/src/burp/ITempFile.java b/src/burp/ITempFile.java deleted file mode 100644 index c9247ef..0000000 --- a/src/burp/ITempFile.java +++ /dev/null @@ -1,33 +0,0 @@ -package burp; - -/* - * @(#)ITempFile.java - * - * Copyright PortSwigger Ltd. All rights reserved. - * - * This code may be used to extend the functionality of Burp Suite Community Edition - * and Burp Suite Professional, provided that this usage does not violate the - * license terms for those products. - */ -/** - * This interface is used to hold details of a temporary file that has been - * created via a call to - * IBurpExtenderCallbacks.saveToTempFile(). - * - */ -public interface ITempFile -{ - /** - * This method is used to retrieve the contents of the buffer that was saved - * in the temporary file. - * - * @return The contents of the buffer that was saved in the temporary file. - */ - byte[] getBuffer(); - - /** - * This method is deprecated and no longer performs any action. - */ - @Deprecated - void delete(); -} diff --git a/src/burp/ITextEditor.java b/src/burp/ITextEditor.java deleted file mode 100644 index ca2526a..0000000 --- a/src/burp/ITextEditor.java +++ /dev/null @@ -1,90 +0,0 @@ -package burp; - -/* - * @(#)ITextEditor.java - * - * Copyright PortSwigger Ltd. All rights reserved. - * - * This code may be used to extend the functionality of Burp Suite Community Edition - * and Burp Suite Professional, provided that this usage does not violate the - * license terms for those products. - */ -import java.awt.Component; - -/** - * This interface is used to provide extensions with an instance of Burp's raw - * text editor, for the extension to use in its own UI. Extensions should call - * IBurpExtenderCallbacks.createTextEditor() to obtain an instance - * of this interface. - */ -public interface ITextEditor -{ - /** - * This method returns the UI component of the editor, for extensions to add - * to their own UI. - * - * @return The UI component of the editor. - */ - Component getComponent(); - - /** - * This method is used to control whether the editor is currently editable. - * This status can be toggled on and off as required. - * - * @param editable Indicates whether the editor should be currently - * editable. - */ - void setEditable(boolean editable); - - /** - * This method is used to update the currently displayed text in the editor. - * - * @param text The text to be displayed. - */ - void setText(byte[] text); - - /** - * This method is used to retrieve the currently displayed text. - * - * @return The currently displayed text. - */ - byte[] getText(); - - /** - * This method is used to determine whether the user has modified the - * contents of the editor. - * - * @return An indication of whether the user has modified the contents of - * the editor since the last call to - * setText(). - */ - boolean isTextModified(); - - /** - * This method is used to obtain the currently selected text. - * - * @return The currently selected text, or - * null if the user has not made any selection. - */ - byte[] getSelectedText(); - - /** - * This method can be used to retrieve the bounds of the user's selection - * into the displayed text, if applicable. - * - * @return An int[2] array containing the start and end offsets of the - * user's selection within the displayed text. If the user has not made any - * selection in the current message, both offsets indicate the position of - * the caret within the editor. - */ - int[] getSelectionBounds(); - - /** - * This method is used to update the search expression that is shown in the - * search bar below the editor. The editor will automatically highlight any - * regions of the displayed text that match the search expression. - * - * @param expression The search expression. - */ - void setSearchExpression(String expression); -}