Семантический API-фаззинг
Updated Jul 2026
За пределами случайных байтов
Традиционный API-фаззинг отправляет случайные байты и мутированные данные. Это находит падения, но редко находит логические баги. Семантический фаззинг использует ИИ для генерации данных, которые структурно валидны, но тестируют граничные условия бизнес-логики.
Разница в намерении. Случайный фаззинг спрашивает: «что произойдёт, если отправить мусор?» Семантический фаззинг спрашивает: «что произойдёт, если отправить нечто валидное по структуре, но эксплуатирующее конкретный класс уязвимостей?»
Сравнение техник фаззинга
| Техника | Пример данных | Что находит |
|---|---|---|
| Случайный фаззинг | { "name": "x\x00\xff\xfe" } |
Переполнения буфера, ошибки кодировки |
| Фаззинг с учётом схемы | { "name": "", "price": -0.01 } |
Обходы валидации |
| Семантический фаззинг (ИИ) | { "name": "'; DROP TABLE products;--", "price": 0.001, "category": "electronics\nclothing" } |
Инъекции, логические ошибки, краевые случаи |
| Контекстный фаззинг (ИИ) | { "name": "Test Product", "price": 99999999.99, "quantity": 2147483647 } |
Переполнение целых чисел, ошибки точности |
Категории ИИ-фаззинга
Категория 1: SQL-инъекции
ИИ генерирует строки инъекций, адаптированные к контексту поля:
[
{"name": "'; SELECT * FROM users; --", "price": 10},
{"name": "1 OR 1=1", "price": 10},
{"name": "admin'--", "price": 10},
{"name": "1; DROP TABLE products", "price": 10},
{"name": "' UNION SELECT password FROM users WHERE '1'='1", "price": 10}
]
Категория 2: XSS
[
{"name": "<script>alert('xss')</script>", "price": 10},
{"name": "<img src=x onerror=alert(1)>", "price": 10},
{"name": "javascript:alert(1)", "price": 10},
{"name": "{{7*7}}", "price": 10},
{"name": "${7*7}", "price": 10}
]
Категория 3: Граничные значения
[
{"name": "", "price": 0},
{"name": "A", "price": 0.01},
{"name": "A".repeat(200), "price": 99999999.99},
{"name": "A".repeat(201), "price": -0.01},
{"name": "A".repeat(10000), "price": 1e308}
]
Категория 4: Путаница типов
[
{"name": 12345, "price": "not a number"},
{"name": true, "price": false},
{"name": null, "price": null},
{"name": ["array"], "price": {"object": true}},
{"name": "", "price": ""}
]
Категория 5: Краевые случаи Unicode
[
{"name": "Test\u200BProduct", "price": 10},
{"name": "Test\u202EProduct", "price": 10},
{"name": "Test\u0000Product", "price": 10},
{"name": "\uD800\uDC00", "price": 10},
{"name": "Test\u200B\u200B\u200B", "price": 10}
]
\u200B= пробел нулевой ширины (невидимый символ при отображении)\u202E= переопределение направления справа налево (может развернуть отображение текста)\u0000= нулевой байт (может обрезать строки в системах на C)
Категория 6: Бизнес-логика
[
{"name": "Widget", "price": 0.001, "quantity": -1},
{"name": "Widget", "price": 0, "discount_percent": 101},
{"name": "Widget", "price": 10, "quantity": 2147483647},
{"name": "Widget", "price": 10, "ship_date": "1970-01-01"},
{"name": "Widget", "price": 10, "ship_date": "9999-12-31"}
]
Категория 7: Обход авторизации (IDOR)
[
{"product_id": "other-users-product-id"},
{"user_id": "admin-user-id"},
{"order_id": "../../../etc/passwd"},
{"id": "0"},
{"id": "-1"}
]
Обнаружение аномалий
После отправки фаззинг-данных необходимо определить, какие ответы указывают на уязвимости:
def detect_anomaly(response, payload_info) -> str | None:
"""Detect if the response indicates a potential vulnerability."""
# 500 errors on any input = server-side failure (unhandled exception)
if response.status_code >= 500:
return f"Server error ({response.status_code}) on {payload_info['category']} payload"
# Reflection of injected content in response (XSS indicator)
if payload_info["category"] == "XSS":
if "<script>" in response.text or "onerror=" in response.text:
return "XSS reflection detected in response"
# SQL error messages in response (information disclosure)
sql_indicators = ["syntax error", "mysql", "postgresql", "sqlite",
"ORA-", "unterminated", "unexpected end"]
if any(indicator in response.text.lower() for indicator in sql_indicators):
return "Possible SQL error disclosure in response"
# Stack traces in response (information disclosure)
if "Traceback" in response.text or "at Object." in response.text:
return "Stack trace leaked in response body"
# Unexpected success on malicious input
if response.status_code == 200 and payload_info["category"] == "SQL_INJECTION":
return "SQL injection payload accepted without error -- verify data integrity"
# Sensitive data in error response
sensitive_patterns = ["password", "secret", "api_key", "token", "credentials"]
if any(p in response.text.lower() for p in sensitive_patterns):
return "Potentially sensitive data in error response"
return None
Результаты фаззинг-кампании
{
"campaign_id": "fuzz-2026-02-09-001",
"endpoint": "POST /api/v2/products",
"total_payloads": 50,
"anomalies_found": 3,
"findings": [
{
"severity": "HIGH",
"category": "SQL_INJECTION",
"payload": {"name": "'; SELECT * FROM users; --", "price": 10},
"response_status": 500,
"anomaly": "Server error on SQL_INJECTION payload -- possible unparameterized query"
},
{
"severity": "MEDIUM",
"category": "BOUNDARY",
"payload": {"name": "A", "price": 99999999999.99},
"response_status": 200,
"anomaly": "Price stored as 100000000000.0 -- precision loss on extreme values"
},
{
"severity": "LOW",
"category": "UNICODE",
"payload": {"name": "Test\u200BProduct", "price": 10},
"response_status": 200,
"anomaly": "Zero-width space accepted in product name -- may cause display issues"
}
]
}
Классификация критичности
| Критичность | Критерии | Пример |
|---|---|---|
| CRITICAL | Удалённое выполнение кода, утечка данных | Успешная инъекция команд |
| HIGH | SQL-инъекция, обход авторизации, повреждение данных | Ошибка 500 на SQL-данных |
| MEDIUM | Раскрытие информации, потеря точности | Стек-трейс в ответе |
| LOW | Проблемы отображения, незначительный обход валидации | Unicode принят в имени |
| INFO | Наблюдение за поведением, нет прямого воздействия | Rate limit не применяется |
Ключевой вывод
Семантический фаззинг сочетает понимание ИИ паттернов уязвимостей с систематическим тестированием конечных точек. В отличие от случайного фаззинга, он генерирует данные, которые структурно правдоподобны, но разработаны для срабатывания конкретных классов уязвимостей. Уровень обнаружения аномалий автоматически помечает ответы, указывающие на потенциальные проблемы, снижая нагрузку ручного триажа.