-
Notifications
You must be signed in to change notification settings - Fork 15
Expand file tree
/
Copy pathBurpExtender.java
More file actions
134 lines (110 loc) · 3.92 KB
/
BurpExtender.java
File metadata and controls
134 lines (110 loc) · 3.92 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
package burp;
import java.awt.Component;
public class BurpExtender implements IBurpExtender, IMessageEditorTabFactory
{
private IBurpExtenderCallbacks callbacks;
private IExtensionHelpers helpers;
//
// implement IBurpExtender
//
@Override
public void registerExtenderCallbacks(IBurpExtenderCallbacks callbacks)
{
// keep a reference to our callbacks object
this.callbacks = callbacks;
// obtain an extension helpers object
helpers = callbacks.getHelpers();
// set our extension name
callbacks.setExtensionName("Serialized input editor");
// register ourselves as a message editor tab factory
callbacks.registerMessageEditorTabFactory(this);
}
//
// implement IMessageEditorTabFactory
//
@Override
public IMessageEditorTab createNewInstance(IMessageEditorController controller, boolean editable)
{
// create a new instance of our custom editor tab
return new Base64InputTab(controller, editable);
}
//
// class implementing IMessageEditorTab
//
class Base64InputTab implements IMessageEditorTab
{
private boolean editable;
private ITextEditor txtInput;
private byte[] currentMessage;
public Base64InputTab(IMessageEditorController controller, boolean editable)
{
this.editable = editable;
// create an instance of Burp's text editor, to display our deserialized data
txtInput = callbacks.createTextEditor();
txtInput.setEditable(editable);
}
//
// implement IMessageEditorTab
//
@Override
public String getTabCaption()
{
return "Serialized input";
}
@Override
public Component getUiComponent()
{
return txtInput.getComponent();
}
@Override
public boolean isEnabled(byte[] content, boolean isRequest)
{
// enable this tab for requests containing a data parameter
return isRequest && null != helpers.getRequestParameter(content, "data");
}
@Override
public void setMessage(byte[] content, boolean isRequest)
{
if (content == null)
{
// clear our display
txtInput.setText(null);
txtInput.setEditable(false);
}
else
{
// retrieve the data parameter
IParameter parameter = helpers.getRequestParameter(content, "data");
// deserialize the parameter value
txtInput.setText(helpers.base64Decode(helpers.urlDecode(parameter.getValue())));
txtInput.setEditable(editable);
}
// remember the displayed content
currentMessage = content;
}
@Override
public byte[] getMessage()
{
// determine whether the user modified the deserialized data
if (txtInput.isTextModified())
{
// reserialize the data
byte[] text = txtInput.getText();
String input = helpers.urlEncode(helpers.base64Encode(text));
// update the request with the new parameter value
return helpers.updateParameter(currentMessage, helpers.buildParameter("data", input, IParameter.PARAM_BODY));
}
else return currentMessage;
}
@Override
public boolean isModified()
{
return txtInput.isTextModified();
}
@Override
public byte[] getSelectedData()
{
return txtInput.getSelectedText();
}
}
}