
XSS-сканер на Rust с контекстно-зависимым подбором полезных нагрузок, обнаружением и обходом WAF, сканированием, колбэками слепого XSS и статическим анализом DOM-стоков.
Продвинутый инструмент обнаружения XSS, написанный на Rust, сочетающий контекстно-зависимый интеллект полезных нагрузок с широтой инъекций.
Этот инструмент был вдохновлён XSStrike и XSSER. Полезные нагрузки были собраны из разных источников:
Спасибо, ребята, вы классные ❤️
Предупреждение: Используйте только против систем, которыми вы владеете или на тестирование которых у вас есть явное письменное разрешение.
<title>, <textarea> и т. д.), и выбирает наиболее подходящие полезные нагрузки для этого контекста, а не слепо запускает всё подрядReferer, User-Agent, X-Forwarded-For, X-Real-IP и другие заголовки, а также значения cookieinnerHTML, eval, document.write, location.href, jQuery .html() и других опасных стоков с обнаружением источниковgit clone https://github.com/fabian-affolter/xssearch
cd xssearch
nix-shell --run "cargo build --release"
# binary: target/release/xssearch
Релизная сборка с LTO и удалёнными символами:
nix-shell --argstr release true --run "$BUILD"
Требуется Rust 1.75+.
cargo build --release
Для пользователей Nix или NixOS доступен пакет. Учтите, что последние релизы могут
присутствовать только в канале unstable.
nix-env -iA nixos.xssearch
xssearch [OPTIONS] <--url <URL> | --file <URLS_FILE>>
| Флаг | Описание |
|---|---|
-u, --url <URL> | Целевой URL. Используйте FUZZ для отметки пользовательной точки инъекции |
-f, --file <FILE> | Файл с одним URL на строку |
-d, --data <DATA> | Тело POST. Используйте FUZZ для отметки точки инъекции |
-H, --header <H> | Дополнительный заголовок запроса, можно повторять |
--cookie <COOKIE> | Строка cookie |
--proxy <URL> | HTTP/HTTPS прокси |
--timeout <N> | Таймаут запроса в секундах (по умолчанию: 10) |
--user-agent <UA> | Пользовательский User-Agent |
--follow-redirects | Следовать HTTP-редиректам |
--threads <N> | Параллельные запросы (по умолчанию: 2) |
--delay <MS> | Задержка между запросами в миллисекундах |
--crawl | Обход цели для поиска ссылок и форм |
--crawl-depth <N> | Глубина обхода (по умолчанию: 3) |
--headers-inject | Тестировать распространённые HTTP-заголовки как точки инъекции |
--cookie-inject | Тестировать значения cookie как точки инъекции |
--blind <URL> | URL callback для Blind XSS |
--dom | Статический анализ стоков DOM XSS |
--fuzz | Запускать все полезные нагрузки независимо от контекста отражения |
--payload-set <SET> | all | html | js | attr | poly | dom | mxss | waf (по умолчанию: all) |
--payloads-file <FILE> | Пользовательский файл полезных нагрузок, по одной на строку |
--encode <LIST> | Кодирования через запятую: url,html,unicode,double,base64 |
--prefix <STR> | Добавить строку в начало каждой полезной нагрузки |
--suffix <STR> | Добавить строку в конец каждой полезной нагрузки |
--waf-detect | Определить WAF перед сканированием |
--waf-bypass | Применить преобразования обхода WAF к полезным нагрузкам |
--output-json <FILE> | Записать находки в JSON-файл |
--output-md <FILE> | Записать находки в Markdown-файл |
-v, --verbose | Подробный вывод (показывать контекст, все проверки) |
-V, --version | Вывести версию и выйти |
xssearch -u "https://example.com/search?q=test"
xssearch -u "https://example.com/login" -d "user=admin&pass=FUZZ"
xssearch -u "https://example.com/" --crawl --waf-detect --headers-inject -v
xssearch -u "https://example.com/?q=FUZZ" --waf-detect --waf-bypass --encode url,html
xssearch -u "https://example.com/contact" -d "msg=FUZZ" \
--blind "https://abc123.oast.fun/xssearch"
xssearch -u "https://example.com/app" --dom --no-banner
xssearch -u "https://example.com/?q=test" --output-json results.json
xssearch -u "https://example.com/?q=test" --output-md report.md
xssearch -f targets.txt --crawl --waf-detect --output-json results.json --output-md report.md
xssearch -u "https://example.com/?q=test" --proxy http://127.0.0.1:8080 -v
Самый быстрый способ проверить инструмент — запустить локально намеренно уязвимый Python-сервер:
python3 - <<'EOF'
import http.server, urllib.parse
class H(http.server.BaseHTTPRequestHandler):
def log_message(self, *a): pass
def do_GET(self):
p = urllib.parse.urlparse(self.path)
q = urllib.parse.parse_qs(p.query)
val = q.get('q', [''])[0]
body = f'<html><body><p>Search: {val}</p></body></html>'.encode()
self.send_response(200)
self.send_header('Content-Type', 'text/html')
self.end_headers()
self.wfile.write(body)
http.server.HTTPServer(('127.0.0.1', 9999), H).serve_forever()
EOF
Затем просканируйте его:
xssearch -u "http://127.0.0.1:9999/?q=test" -v
Ожидаемый вывод: [Vuln] XSS in 'q' с полезной нагрузкой для HTML-контекста.
Эти образы специально созданы для тестирования инструментов безопасности и не содержат реальных пользовательских данных.
docker run -d -p 8080:80 vulnerables/web-dvwa
# Set security level to Low in the UI first
xssearch -u "http://localhost:8080/vulnerabilities/xss_r/?name=test" \
--cookie "PHPSESSID=<your-session>; security=low"
docker run -d -p 8081:8080 webgoat/goat-and-wolf
xssearch -u "http://localhost:8081/WebGoat/" --crawl --crawl-depth 2 -v
docker run -d -p 3000:3000 bkimminich/juice-shop
xssearch -u "http://localhost:3000/" --crawl --dom -v