Repository navigation
Expand file tree
/
Copy pathCookieManager.java
More file actions
executable file
·113 lines (100 loc) · 4.22 KB
/
Copy pathCookieManager.java
File metadata and controls
executable file
·113 lines (100 loc) · 4.22 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
/*
* Decompiled with CFR 0.153-SNAPSHOT (d6f6758-dirty).
*/
package burp;
import burp.BurpExtender;
import burp.IExtensionHelpers;
import burp.IHttpListener;
import burp.IHttpRequestResponse;
import burp.IRequestInfo;
import java.net.URL;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
public class CookieManager
implements IHttpListener {
private final HashMap<String, HashMap<String, String>> cookies = new HashMap();
public static byte[] getRequest(IHttpRequestResponse baseRequestResponse, byte[] newRequest) {
IExtensionHelpers helpers = BurpExtender.getHelpers();
IRequestInfo newRequestInfo = helpers.analyzeRequest(newRequest);
IRequestInfo baseRequestInfo = helpers.analyzeRequest(baseRequestResponse.getRequest());
List<String> baseHeaders = baseRequestInfo.getHeaders();
baseHeaders.set(0, newRequestInfo.getHeaders().get(0));
byte[] request = helpers.buildHttpMessage(baseHeaders, Arrays.copyOfRange(newRequest, newRequestInfo.getBodyOffset(), newRequest.length));
return request;
}
public static IHttpRequestResponse makeHttpRequest(IHttpRequestResponse baseRequestResponse, byte[] request) {
byte[] newRequest = CookieManager.getRequest(baseRequestResponse, request);
return BurpExtender.getCallbacks().makeHttpRequest(baseRequestResponse.getHttpService(), newRequest);
}
private String urlToOrigin(URL url) {
int port = url.getPort();
if (port == -1) {
port = "http".equals(url.getProtocol()) ? 80 : 443;
}
return url.getProtocol() + "://" + url.getHost() + ":" + port;
}
private HashMap<String, String> parseCookie(String cookie) {
String[] keyValuePairs;
HashMap<String, String> result = new HashMap<String, String>();
for (String keyValuePair : keyValuePairs = cookie.split(";")) {
String[] keyValue = (keyValuePair = keyValuePair.trim()).split("=", 2);
if ("".equals(keyValue[0])) continue;
if (keyValue.length == 2) {
result.put(keyValue[0], keyValue[1]);
continue;
}
result.put(keyValue[0], "");
}
return result;
}
private String joinCookieKeyValue(HashMap<String, String> cookie) {
StringBuilder builder = new StringBuilder();
for (Map.Entry<String, String> entry : cookie.entrySet()) {
String key = entry.getKey();
String value = entry.getValue();
builder.append(key);
builder.append("=");
builder.append((Object) value);
builder.append("; ");
}
return builder.toString();
}
private String getCookieValue(Object obj) {
if (obj == null) {
return null;
}
return String.valueOf(obj);
}
@Override
public void processHttpMessage(int toolFlag, boolean messageIsRequest, IHttpRequestResponse messageInfo) {
if (messageIsRequest) {
IRequestInfo requestInfo = BurpExtender.getHelpers().analyzeRequest(messageInfo);
String origin = this.urlToOrigin(requestInfo.getUrl());
List<String> headers = requestInfo.getHeaders();
List<String> cookies = headers.subList(1, headers.size()).stream()
.filter(header -> "cookie".equalsIgnoreCase(header.split(":", 2)[0]))
.collect(Collectors.toList());
for (String cookieHeader : cookies) {
String[] temp = cookieHeader.split(":", 2);
if (temp.length != 2) continue;
HashMap<String, String> cookie = this.parseCookie(temp[1]);
if (this.cookies.get(origin) == null) {
this.cookies.put(origin, cookie);
continue;
}
this.cookies.get(origin).putAll(cookie);
}
}
}
public String getCookieHeader(URL url) {
String origin = this.urlToOrigin(url);
HashMap<String, String> cookie = this.cookies.get(origin);
if (cookie != null) {
return "Cookie: " + this.joinCookieKeyValue(cookie);
}
return null;
}
}