Skip to content
KitploitKITPLOIT
ИнструментыЭксплойтыБлог
Log in
Отправить
ИнструментыЭксплойтыБлог
Отправить

Инструменты для хакинга, пентеста и кибербезопасности — ваш арсенал защиты!

Kitploit — это каталог инструментов для хакинга, кибербезопасности и пентестинга. Находите последние обновления проектов для поиска уязвимостей, анализа систем, автоматизации тестирования и усиления вашей безопасности.

ЛентыКонтактыКонфиденциальность© 2026 Kitploit

Каталог инструментов

Категории

Все категории
Loading categories
cakephp-window-sqli — CakePHP 5.4.2 — высокий уровень — удалённо — SQLi — смещения диапазона/фрейма WindowExpression вставляются в SQL | Kitploit
Инструменты/GitHubGitHub/abraxas/cakephp-window-sqli
Сканеры уязвимостейАнализ уязвимостейАнализ КодаЭксплуатацияЭксплуатация веб-приложенийВеб-безопасностьБезопасность Баз Данных
GitHubabraxas/cakephp-window-sqli

cakephp-window-sqli

CakePHP 5.4.2 — высокий уровень — удалённо — SQLi — смещения диапазона/фрейма WindowExpression вставляются в SQL

Репозиторий
4 дней назадЕщё не проверено

Популярное

Смотреть все →

Откройте для себя самые используемые инструменты нашего сообщества.

Изучить все инструменты

Просмотрите нашу коллекцию инструментов

Смотреть все инструменты →
Поделиться

Abraxas Labs - cakephp-window-sqli

abraxaslabs.tech  ·  github.com/abraxas  ·  @abraxas_null  ·  [email protected]  ·  cakephp-window-sqli

cakephp-window-sqli

Класс: SQLi Доступ: Удалённый

CakePHP 5.4.2 (887b641) - Cake Software Foundation

CVE-2026-79752 закрыл FunctionsBuilder cast / extract / dateAdd с помощью ensureSimpleString(). WindowExpression::range() и frame() не вошли в это исправление. rows() и groups() принимают ?int. range() по-прежнему принимает строку. buildOffsetSql конкатенирует смещение, тип фрейма и PRECEDING / FOLLOWING в OVER. Биндер не используется, если смещение уже не является ExpressionInterface.

Приложение, которое передаёт данные запроса в func()->count('*')->over()->range($start, $end), помещает строку вызывающего в RANGE BETWEEN без привязки и без кавычек.

IDCVE пока нет
КлассSQLi
ДоступУдалённый (приложение, передающее данные запроса в range() / frame())
CWECWE-89
CVSSВысокий: 8.1 CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:N
ПродуктCakePHP (cakephp/database)
Затронуто5.4.2 (887b641de9f7aba06071f98f17edcbc573cbcf63)
Аутентификацияприложение, передающее данные query/form в ->over()->range($start, $end) / frame()
ЛицензияGNU Affero GPL v3.0
Лабораториятолько 127.0.0.1

Что может сделать атакующий

Пользователь, который может задать границу окна, передаваемую приложением (аналитика «последние N дней», конструктор отчётов), превращает клаузу OVER в дополнительный SQL.

ПривилегияМетод / точка входаТипДоказано в лаборатории или выведено
Внедрить SQL-фрагмент в OVER (RANGE BETWEEN ...)GET /?mode=range&start= в AggregateExpression::range($start, $end) / WindowExpression::frame()Целостность скомпилированного SQLДоказано в лаборатории. Скомпилированный SQL: RANGE BETWEEN 1) /* CAKEPHP-WINDOW-SQLI-WITNESS */ -- PRECEDING с пустым биндером
Читать или изменять строки от имени пользователя БД приложенияТот же запрос, выполненныйЦелостность / разведка БДВыведено из внедрения. Эта лаборатория только компилирует
Изменить тип или направление фрейма тем же способомframe($type, $offset, $direction, ...) также конкатенирует эти строкиЦелостность скомпилированного SQLВыведено из sql() / buildOffsetSql(). В лаборатории использовался range()
Сломать rows() / groups() тем же способомТипизированы как ?intЗакрытоДоказано в лаборатории как закрытое. rows(3) даёт ROWS BETWEEN 3 PRECEDING, без кавычек, без привязки

Закрыто на этом коммите: FunctionsBuilder cast / extract / dateAdd / jsonValue (CVE-2026-79752 / CVE-2026-77635); Query::limit / offset (типизированы как int). Стандартный cakephp/app не вызывает range() с данными из строки запроса. Остаётся документированный window API. Это не неаутентифицированный RCE на скелетном приложении. Это не шелл.

Остатки на том же коммите: collate SQLi, attachment CRLF, cache unserialize.

Как я это нашёл

Я зафиксировал cakephp/cakephp 5.4.2 после SQLi GHSA в FunctionsBuilder 2026 года. Десять поисков на этом теге. CSRF / FormProtection, View LFI, BodyParser XXE, mass assignment, helper XSS и clientIp() без trustProxy в этой планке ничего не дали. WindowExpressionTest::testRange по-прежнему утверждает:

$w = (new WindowExpression())->range("'1 day'", "'10 days'");

buildOffsetSql никогда не привязывает строковое смещение:

protected function buildOffsetSql(
    ValueBinder $binder,
    ExpressionInterface|string|int|null $offset,
    string $direction,
): string {
    if ($offset === 0) {
        return 'CURRENT ROW';
    }
    if ($offset instanceof ExpressionInterface) {
        $offset = $offset->sql($binder);
    }
    return sprintf('%s %s', $offset ?? 'UNBOUNDED', $direction);
}

$binder не используется, если смещение уже не является ExpressionInterface.

Уже зафиксированные ошибочные пути: считать rows() дырой (он типизирован как int); утверждать, что стандартный cakephp/app раскрывает это через публичную форму; выполнять внедрённый SQL в SQLite как оракул (POC-READY только компилирует); обратный шелл. Театр.

Лаборатория

python3 cakephp-window-sqli-Abraxas-Labs.py

или

cd lab
./run.sh

Цель только http://127.0.0.1:19440. Крошечное PHP-приложение, cakephp/database 5.4.2, SQLite :memory:. GET /?mode=range&start= передаётся как строка в range(). GET /?mode=rows&n=3 — это int-контроль.

SUCCESS cakephp-window-sqli pin=5.4.2 range-raw=yes rows-numeric=yes bound=no quoted=no CAKEPHP-WINDOW-SQLI-WITNESS

IOC скомпилированного SQL:

SELECT (COUNT(*) OVER (RANGE BETWEEN 1) /* CAKEPHP-WINDOW-SQLI-WITNESS */ -- PRECEDING AND CURRENT ROW)) AS n FROM sqlite_master

Контроль:

SELECT (COUNT(*) OVER (ROWS BETWEEN 3 PRECEDING AND CURRENT ROW)) AS n FROM sqlite_master

Исправление

Привязывайте числовые смещения. Используйте allowlist для типа фрейма (RANGE / ROWS / GROUPS) и направления (PRECEDING / FOLLOWING). Для интервальных строк заключайте их в кавычки или требуйте ExpressionInterface. Добавьте тест, что не-int смещение range() становится плейсхолдером или строковым литералом в кавычках, а не сырым SQL.

Ссылки

  • github.com/cakephp/cakephp тег 5.4.2 (887b641de9f7aba06071f98f17edcbc573cbcf63)
  • WindowExpression.php · AggregateExpression.php
  • Рядом исправлено: CVE-2026-79752 · CVE-2026-77635
  • Тот же коммит: cakephp-collate-sqli · cakephp-attachment-crlf · cakephp-cache-unserialize
  • CWE-89

Лицензия

GNU Affero GPL v3.0. См. LICENSE. Только loopback-лаборатория. Без гарантий.

Скачать инструмент