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

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

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

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

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

Категории

Все категории
Loading categories
POC-CVE-2026-65971 — Доказательство концепции и техническое описание для CVE-2026-65971 — SQL-инъекция через свойство sortDirection Livewire в power-components/livewire-powergrid (< 6.10.4) | Kitploit
Инструменты/GitHubGitHub/biitts/poc-cve-2026-65971
Анализ уязвимостейЭксплуатацияЭксплуатация веб-приложенийТестирование на ПроникновениеСтатьи и ИсследованияОбучение и Образование
GitHubbiitts/poc-cve-2026-65971

POC-CVE-2026-65971

Доказательство концепции и техническое описание для CVE-2026-65971 — SQL-инъекция через свойство sortDirection Livewire в power-components/livewire-powergrid (< 6.10.4)

Репозиторий
192 месяцев назадЕщё не проверено

Популярное

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

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

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

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

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

CVE-2026-65971 — SQL-инъекция в Livewire PowerGrid через sortDirection

Концептуальное доказательство и полное техническое описание для CVE-2026-65971 / GHSA-7fgc-3h6c-698r, SQL-инъекция в power-components/livewire-powergrid доступная через публичное свойство Livewire sortDirection.

CVECVE-2026-65971
GHSAGHSA-7fgc-3h6c-698r
Пакетpower-components/livewire-powergrid (Composer / Packagist)
Затронутые версии>= 6.0.0, < 6.10.4
Исправлено6.10.4
УязвимостьCWE-89 — Неправильная нейтрализация специальных элементов, используемых в SQL-команде
Серьёзность7.6 Высокая — CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:L/A:L
СообщилCaio Fabrício (@BiiTts)
РаскрытиеКоординированное, через частное уведомление о безопасности GitHub
├── poc/exploit_powergrid_sqli.py working exploit — confirm + blind extraction
├── lab/ build the vulnerable app to reproduce it yourself
├── evidence/EVIDENCE.txt raw lab notes from confirmation
├── patch/security-fix-v6.10.4.diff the security-relevant portion of the official fix
└── detection/ Sigma rules + Nuclei template for defenders
---

## 🧠 Краткое описание

PowerGrid — это компонент таблицы данных (datatable) для Laravel + Livewire (~2k звезд, широко используется в административных панелях Laravel). Его состояние сортировки хранится в двух **public свойствах Livewire**:```php
public string $sortField = 'id';
public string $sortDirection = 'asc';

В Livewire публичное свойство является частью wire-формата компонента — любой клиент, который может добраться до компонента, может установить его через POST /livewire/update. Это сделано намеренно; граница безопасности заключается в том, что сервер делает с этим значением.

Функция naturalSort() PowerGrid строит сырое выражение ORDER BY, содержащее литеральный заполнитель {sortDirection}, и конвейер заменяет этот заполнитель на сырое, непроверенное значение свойства перед передачей строки в orderByRaw(). Таким образом, ключевое слово направления попадает в SQL дословно.

Собственный orderBy() Laravel отклоняет всё, что не является asc/desc, и эта проверка делает обычный путь сортировки безопасным. Ошибка в том, что существует второй, непроверенный путь к тому же предложению — и злоумышленник может добраться до него, полностью минуя проверяющий путь (см. Обход).

Результат: произвольный SQL в предложении ORDER BY, эксплуатируемый как слепой булевый/временной оракул для чтения любых данных, которые может прочитать пользователь базы данных.


🔥 Воздействие

Любой, кто может получить доступ к таблице PowerGrid, использующей naturalSort, может прочитать произвольные данные из базы данных — другие таблицы, хеши паролей, токены сессий, ключи API, записи других арендаторов — с помощью временного/булевого оракула.

  • Конфиденциальность: Высокая. Полное чтение всего, что пользователь БД может SELECT.
  • Целостность: Низкая. Стековые запросы блокируются конфигурацией PDO MySQL по умолчанию, поэтому ; UPDATE ... не выполняется. Влияние на запись ограничено тем, что может вызвать подзапрос.
  • Доступность: Низкая. Та же примитивная возможность даёт атакующему SLEEP() и тяжелые подзапросы — тривиально злоупотребляемые для блокировки потоков базы данных.
  • Типичное размещение является отягчающим фактором. Таблицы PowerGrid находятся в панелях администраторов и многопользовательских бэк-офисах — именно там, где находятся интересные данные. Пользователь-арендатор с низкими привилегиями, получив доступ к такой таблице, может выгрузить всю базу данных.

Требуемые привилегии — PR:L, потому что таблица данных обычно находится за аутентификацией приложения. Если затронутая таблица отображается на неаутентифицированной странице, пересчитайте с PR:N → 8.2 Высокий.


🧩 Первопричина — полная цепочка заражения

Три файла, три стадии. Все ссылки относятся к уязвимому тегу v6.10.3.

Стадия 1 — Источник: контролируемое злоумышленником публичное свойство

`src/Concerns/Sorting.php````php public string $sortField = 'id'; // line 11 public string $sortDirection = 'asc'; // line 13

Ни одно из свойств не имеет белого списка, правила проверки или нормализующего сеттера. `sortDirection` только присваивается или переворачивается:```php
public function reverseSort(): string    // line 37
{
    return $this->sortDirection === 'asc' ? 'desc' : 'asc';
}

updatedSortDirection() (строка 103) существует — естественное место для проверки, — но в v6.10.3 он обрабатывает только бухгалтерию ленивой загрузки. Он никогда не проверяет значение.

Поскольку Livewire гидратирует публичные свойства напрямую из запроса, sortDirection на этом этапе полностью контролируется атакующим как произвольная строка.

Этап 2 — Сырое условие: naturalSort() помещает заполнитель

src/Providers/Macros.php, строки 102–116 — макрос столбца naturalSort:```php Column::macro('naturalSort', function (bool $when = false, ?string $tableName = null): Column { $this->enableSort();

if ($when) {
    $this->rawQueries[] = [
        'method'   => 'orderByRaw',                          // <-- raw sink
        'sql'      => Sql::sortStringAsNumber($this->dataField),
        'bindings' => [],
    ];
}

return $this;

});

`Sql::sortStringAsNumber()` разрешается в выражение, зависящее от драйвера, создаваемое с помощью `getSortSqlByDriver()` в `src/DataSource/Support/Sql.php` (строки 60–100). Все варианты драйверов заканчиваются одним и тем же буквальным заполнителем:```php
$default = "$sortField+0 {sortDirection}";                                                          // line 76
'8.0.4'  => "CAST(NULLIF(REGEXP_REPLACE($sortField, '[[:alpha:]]+', ''), '') AS SIGNED INTEGER) {sortDirection}",  // MySQL, line 81
'0'      => "CAST($sortField AS INTEGER) {sortDirection}",                                          // SQLite, line 84
'0'      => "CAST(NULLIF(REGEXP_REPLACE($sortField, '\D', '', 'g'), '') AS INTEGER) {sortDirection}", // PgSQL, line 87
'0'      => "CAST(SUBSTRING(...) AS INT) {sortDirection}",                                          // SQL Server, line 90

Уязвимость является независимой от драйвера — каждая ветвь интерполирует {sortDirection}.

Этап 3 — Сток: плейсхолдер разрешается с использованием необработанного значения свойства

`src/DataSource/Processors/Database/Pipelines/ColumnRawQueries.php````php private function resolvePlaceholders(?string $sql): ?string // line 56 { if (is_null($sql)) { return null; }

return preg_replace_callback('/\{(\w+)\}/', function ($matches) {
    $property = trim($matches[1]);

    return data_get($this->component, $property, '');   // line 65 — raw property, no escaping
}, $sql);

}

и выполнение, line 52:```php
$query->{$method}($resolvedSql, $resolvedBindings);   // $method === 'orderByRaw'

data_get($this->component, 'sortDirection') возвращает строку атакующего, preg_replace_callback вставляет её в SQL-текст, а orderByRaw() — который по контракту не экранирует свой аргумент — передаёт её базе данных.

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