|
// Revision 1 - originally developed by chatGPT for @irsdl |
|
// Revision 2 - improved by ChatGPT to be more efficient using Burp APIs! |
|
// Automatically updates the Cookie header in Burp Repeater requests using Set-Cookie values from responses. This Bambda CustomAction preserves all existing cookies and only updates or adds values when necessary — ensuring session continuity without overwriting unrelated cookies. |
|
|
|
// 1. Grab the request & response |
|
var request = requestResponse.request(); |
|
var response = requestResponse.response(); |
|
|
|
// 2. Pull any Set-Cookie cookies from the response |
|
var responseCookies = response.cookies(); |
|
if (responseCookies.isEmpty()) { |
|
logging.logToOutput("No Set-Cookie headers found; nothing to sync."); |
|
return; |
|
} |
|
|
|
// 3. Extract existing COOKIE parameters |
|
var oldParams = request.parameters().stream() |
|
.filter(p -> p.type() == HttpParameterType.COOKIE) |
|
.collect(Collectors.toList()); |
|
|
|
// 4. Merge into a LinkedHashMap<String,String> (preserving insertion order) |
|
var merged = new LinkedHashMap<String,String>(); |
|
for (var p : oldParams) { |
|
merged.put(p.name(), p.value()); |
|
} |
|
|
|
boolean changed = false; |
|
for (var c : responseCookies) { |
|
String oldVal = merged.get(c.name()); |
|
if (!c.value().equals(oldVal)) { |
|
merged.put(c.name(), c.value()); |
|
changed = true; |
|
} |
|
} |
|
if (!changed) { |
|
logging.logToOutput("✅ Cookies already up to date."); |
|
return; |
|
} |
|
|
|
// 5. Build new HttpParameter[] for the merged cookies |
|
var newParamsList = new java.util.ArrayList<burp.api.montoya.http.message.params.HttpParameter>(); |
|
for (var entry : merged.entrySet()) { |
|
newParamsList.add( |
|
burp.api.montoya.http.message.params.HttpParameter |
|
.cookieParameter(entry.getKey(), entry.getValue()) |
|
); |
|
} |
|
var newParamsArray = newParamsList.toArray( |
|
new burp.api.montoya.http.message.params.HttpParameter[0] |
|
); |
|
|
|
// 6. Remove old COOKIE params and add the new ones |
|
var withoutOld = request.withRemovedParameters( |
|
oldParams.toArray(new burp.api.montoya.http.message.params.HttpParameter[0]) |
|
); |
|
var newRequest = withoutOld.withAddedParameters(newParamsArray); |
|
|
|
// 7. Push the updated request into the editor pane |
|
httpEditor.requestPane().set(newRequest); |
|
|
|
// 8. Log the new Cookie header |
|
var headerValue = merged.entrySet().stream() |
|
.map(e -> e.getKey() + "=" + e.getValue()) |
|
.collect(Collectors.joining("; ")); |
|
logging.logToOutput("✅ Synchronized cookies: " + headerValue); |