package burp.zn; import burp.*; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.codehaus.jackson.JsonNode; import org.codehaus.jackson.map.ObjectMapper; import java.util.Arrays; public class TokenHandler implements IHttpListener { private static final Logger log = LogManager.getLogger(TokenHandler.class.getName()); private static final String TOKEN = "TOKEN"; private final byte[] tokenBytesPattern; private final IExtensionHelpers helpers; private final IBurpExtenderCallbacks callbacks; public TokenHandler(IBurpExtenderCallbacks callbacks) { this.callbacks = callbacks; this.helpers = callbacks.getHelpers(); this.tokenBytesPattern = helpers.stringToBytes(TOKEN); } @Override public void processHttpMessage(int toolFlag, boolean messageIsRequest, IHttpRequestResponse messageInfo) { if (messageIsRequest || (toolFlag != IBurpExtenderCallbacks.TOOL_REPEATER) && (toolFlag != IBurpExtenderCallbacks.TOOL_SCANNER)) { return; } /** * Response Bytes */ byte[] responseBytes = messageInfo.getResponse(); /** * Check Response String contains TOKEN parameter */ String responseString = helpers.bytesToString(responseBytes); if (!responseString.contains(TOKEN)) { return; } /** * If you want to improve speed, better to use @IExtentionHelpers.indexOf * BTW it's a wrapped native java.lang.String.indexOf */ // if (helpers.indexOf(responseBytes, tokenBytesPattern, true, 0, responseBytes.length) == -1) { // return; // } /** * IResponseInfo */ IResponseInfo responseInfo = helpers.analyzeResponse(responseBytes); /** * String Response body */ String responseBody = helpers.bytesToString(Arrays.copyOfRange( responseBytes, responseInfo.getBodyOffset(), responseBytes.length)); /** * Extract Jackson JSON node info and string CSRF token */ String token = readNode(responseBody); if (token.equals("")) { return; } /** * Add new request parameter to the existing request */ byte[] newRequest = helpers.addParameter( messageInfo.getRequest(), helpers.buildParameter("token", token, IParameter.PARAM_BODY)); newRequest = helpers.toggleRequestMethod(newRequest); // Changes a request method GET to POST /** * Send request with added token parameter */ IHttpRequestResponse newResponse = callbacks.makeHttpRequest( messageInfo.getHttpService(), newRequest); /** * Finally talks burp that new response is */ messageInfo.setResponse(newResponse.getResponse()); } /** * Read JSON with Jackson ObjectMapper * @param stringNode JSON string body * @return JSON node */ private String readNode(String stringNode) { ObjectMapper mapper = new ObjectMapper(); try { JsonNode node = mapper.readTree(stringNode); return node.get(TOKEN) .getTextValue(); } catch (Exception e) { log.error("Error while reading json: " + e.getMessage()); return ""; } } }