Skip to content
KitploitKITPLOIT
StrumentiBlog
Log in
Invia
StrumentiBlog
Invia

Strumenti di Hacking, PenTest e Cybersecurity per il tuo Arsenale di Sicurezza!

Kitploit è una directory di strumenti di hacking, cybersecurity e pentesting. Scopri gli ultimi aggiornamenti dei progetti per trovare vulnerabilità, analizzare sistemi, automatizzare i test e rafforzare la tua sicurezza.

··Feed·Contatto·Privacy·© 2026 Kitploit

Directory degli strumenti

Categorie

Vedi tutte le categorie
Loading categories
POC-CVE-2026-65971 — Prova di concetto e analisi tecnica per CVE-2026-65971 — SQL injection tramite la proprietà Livewire sortDirection in power-components/livewire-powergrid (< 6.10.4) | Kitploit
Strumenti/GitHubGitHub/biitts/poc-cve-2026-65971
Analisi delle VulnerabilitàExploitSfruttamento di Applicazioni WebPenetration TestingPaper e RicercaApprendimento e Formazione
GitHubbiitts/poc-cve-2026-65971

POC-CVE-2026-65971

Prova di concetto e analisi tecnica per CVE-2026-65971 — SQL injection tramite la proprietà Livewire sortDirection in power-components/livewire-powergrid (< 6.10.4)

Vedi Repository
192 mesi faNon ancora revisionato

Più Popolari

Vedi tutti →

Scopri gli strumenti più utilizzati dalla nostra community.

Esplora tutti gli strumenti

Sfoglia la nostra collezione di strumenti

Vedi tutti gli strumenti →
Condividi

CVE-2026-65971 — Iniezione SQL in Livewire PowerGrid tramite sortDirection

Prova di concetto e descrizione tecnica completa per CVE-2026-65971 / GHSA-7fgc-3h6c-698r, un'iniezione SQL in power-components/livewire-powergrid raggiungibile tramite la proprietà pubblica di Livewire sortDirection.

CVECVE-2026-65971
GHSAGHSA-7fgc-3h6c-698r
Pacchettopower-components/livewire-powergrid (Composer / Packagist)
Versioni interessate>= 6.0.0, < 6.10.4
Versione corretta6.10.4
DebolezzaCWE-89 — Neutralizzazione impropria di elementi speciali usati in un comando SQL
Gravità7.6 Alta — CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:L/A:L
Segnalata daCaio Fabrício (@BiiTts)
DivulgazioneCoordinata, tramite advisory di sicurezza privato su 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
---

## 🧠 Riepilogo

PowerGrid è un componente datatable per Laravel + Livewire (~2k stelle, ampiamente utilizzato nei
pannelli di amministrazione Laravel). Il suo stato di ordinamento risiede in due **proprietà Livewire pubbliche**:```php
public string $sortField = 'id';
public string $sortDirection = 'asc';

In Livewire, una proprietà pubblica fa parte del formato wire del componente — qualsiasi client che possa raggiungere il componente può impostarla tramite POST /livewire/update. Questo è voluto; il confine di sicurezza è ciò che il server fa con il valore.

La funzionalità naturalSort() di PowerGrid costruisce un'espressione ORDER BY grezza contenente il segnaposto letterale {sortDirection}, e una pipeline sostituisce quel segnaposto con il valore della proprietà grezzo, non validato prima di passare la stringa a orderByRaw(). La parola chiave della direzione finisce quindi letteralmente dentro SQL.

Il orderBy() di Laravel stesso rifiuta qualsiasi cosa che non sia asc/desc, ed è quella validazione a rendere sicuro il normale percorso di ordinamento. Il bug è che esiste un secondo percorso non validato verso la stessa clausola — e un attaccante può raggiungerlo saltando del tutto quello validante (vedi The bypass).

Risultato: SQL arbitrario nella clausola ORDER BY, sfruttabile come oracolo cieco booleano/temporale per leggere qualsiasi dato che l'utente del database può leggere.


🔥 Impatto

Chiunque possa raggiungere una tabella PowerGrid che usa naturalSort può leggere dati arbitrari dal database — altre tabelle, hash di password, token di sessione, chiavi API, record cross-tenant — usando un oracolo temporale / booleano.

  • Riservatezza: Alta. Lettura completa di qualsiasi cosa l'utente del DB possa SELECT.
  • Integrità: Bassa. Le query impilate sono bloccate dalla configurazione predefinita di PDO MySQL, quindi ; UPDATE ... non viene eseguito. L'impatto in scrittura è limitato a ciò che una sottoquery può attivare.
  • Disponibilità: Bassa. La stessa primitiva dà a un attaccante SLEEP() e sottoquery pesanti — facilmente abusabili per bloccare i thread del database.
  • Il posizionamento tipico è il fattore aggravante. Le tabelle PowerGrid si trovano in pannelli di amministrazione e back-office multi-tenant — esattamente dove si trovano i dati interessanti. Un utente tenant con privilegi bassi che raggiunge una di queste tabelle può esfiltrare l'intero database.

Privilegi richiesti: PR:L perché una datatable si trova normalmente dietro l'autenticazione dell'applicazione. Se la tabella interessata viene renderizzata su una pagina non autenticata, si ricalcola con PR:N → 8.2 Alto.


🧩 Causa principale — la catena di taint completa

Tre file, tre stadi. Tutti i riferimenti sono alla tag vulnerabile v6.10.3.

Stadio 1 — Sorgente: una proprietà pubblica controllata dall'attaccante

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

Nessuna delle due proprietà ha una whitelist, una regola di validazione o un setter di normalizzazione. `sortDirection` viene solo assegnato o invertito:```php
public function reverseSort(): string    // line 37
{
    return $this->sortDirection === 'asc' ? 'desc' : 'asc';
}

updatedSortDirection() (riga 103) esiste — il punto naturale per la validazione — ma in v6.10.3 gestisce solo la contabilità del lazy loading. Non ispeziona mai il valore.

Poiché Livewire idrata le proprietà pubbliche direttamente dalla richiesta, sortDirection è completamente controllabile dall'attaccante, come stringa arbitraria, a questo punto.

Fase 2 — La clausola grezza: naturalSort() inserisce un segnaposto

src/Providers/Macros.php, righe 102–116 — la macro per colonne 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()` si risolve in un'espressione per driver costruita da
`getSortSqlByDriver()` in `src/DataSource/Support/Sql.php` (righe 60–100). Ogni variante driver
termina con lo stesso segnaposto letterale:```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

La vulnerabilità è indipendente dal driver — ogni ramo interpola {sortDirection}.

Fase 3 — Sink: il placeholder viene risolto con il valore grezzo della proprietà

`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);

}

e l'esecuzione, riga 52:```php
$query->{$method}($resolvedSql, $resolvedBindings);   // $method === 'orderByRaw'

data_get($this->component, 'sortDirection') restituisce la stringa dell'attaccante, preg_replace_callback la inserisce nel testo SQL e orderByRaw() — che per contratto non esegue l'escape del suo argomento — la passa al database.

Scarica lo strumento