Skip to content
KitploitKITPLOIT
ToolsExploitsBlog
Log in
Einreichen
ToolsExploitsBlog
Einreichen

Hacking-, PenTest- und Cybersicherheits-Tools für Ihr Sicherheitsarsenal!

Kitploit ist ein Verzeichnis von Hacking-, Cybersicherheits- und Pentesting-Tools. Entdecken Sie die neuesten Projekt-Updates, um Schwachstellen zu finden, Systeme zu analysieren, Tests zu automatisieren und Ihre Sicherheit zu stärken.

FeedsKontaktDatenschutz© 2026 Kitploit

Tool-Verzeichnis

Kategorien

Alle Kategorien anzeigen
Loading categories
POC-CVE-2026-65971 — Proof-of-Concept und technische Beschreibung für CVE-2026-65971 — SQL-Injection über die sortDirection Livewire-Eigenschaft in power-components/livewire-powergrid (< 6.10.4) | Kitploit
Tools/GitHubGitHub/biitts/poc-cve-2026-65971
SchwachstellenanalyseExploitationWebanwendungs-ExploitationPenetrationstestsPapers & ForschungLernen & Bildung
GitHubbiitts/poc-cve-2026-65971

POC-CVE-2026-65971

Proof-of-Concept und technische Beschreibung für CVE-2026-65971 — SQL-Injection über die sortDirection Livewire-Eigenschaft in power-components/livewire-powergrid (< 6.10.4)

Repository anzeigen
19vor 2 MonatenNoch nicht geprüft

Beliebteste

Alle anzeigen →

Entdecken Sie die meistgenutzten Tools unserer Community.

Alle Tools erkunden

Durchsuchen Sie unsere Tool-Sammlung

Alle Tools anzeigen →
Teilen

CVE-2026-65971 — SQL-Injection in Livewire PowerGrid über sortDirection

Proof-of-Concept und vollständige technische Beschreibung für CVE-2026-65971 / GHSA-7fgc-3h6c-698r, eine SQL-Injection in power-components/livewire-powergrid, die über die öffentliche Livewire-Eigenschaft sortDirection erreichbar ist.

CVECVE-2026-65971
GHSAGHSA-7fgc-3h6c-698r
Paketpower-components/livewire-powergrid (Composer / Packagist)
Betroffen>= 6.0.0, < 6.10.4
Behoben6.10.4
SchwachstelleCWE-89 — Unzureichende Neutralisierung spezieller Elemente in einem SQL-Befehl
Schweregrad7.6 Hoch — CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:L/A:L
Gemeldet vonCaio Fabrício (@BiiTts)
OffenlegungKoordiniert, über privates GitHub-Sicherheitsadvisory
├── 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
---

## 🧠 Zusammenfassung

PowerGrid ist eine Datatable-Komponente für Laravel + Livewire (~2k Sterne, weit verbreitet in
Laravel-Admin-Panels). Sein Sortierzustand lebt in zwei **öffentlichen Livewire-Eigenschaften**:```php
public string $sortField = 'id';
public string $sortDirection = 'asc';

In Livewire ist eine öffentliche Eigenschaft Teil des Wire-Formats der Komponente – jeder Client, der die Komponente erreichen kann, kann sie über POST /livewire/update setzen. Das ist beabsichtigt; die Sicherheitsgrenze liegt darin, was der Server mit dem Wert tut.

PowerGrids naturalSort()-Funktion erstellt einen rohen ORDER BY-Ausdruck, der den Platzhalter {sortDirection} enthält, und eine Pipeline ersetzt diesen Platzhalter mit dem rohen, unvalidierten Eigenschaftswert, bevor die Zeichenkette an orderByRaw() übergeben wird. Das Richtungsschlüsselwort landet daher wörtlich in SQL.

Laravels eigene orderBy()-Methode lehnt alles ab, was nicht asc/desc ist, und diese Validierung macht den normalen Sortierpfad sicher. Der Fehler besteht darin, dass ein zweiter, unvalidierter Pfad zur selben Klausel existiert – und ein Angreifer ihn erreichen kann, während er den validierenden vollständig umgeht (siehe The bypass).

Ergebnis: Beliebiges SQL in der ORDER BY-Klausel, ausnutzbar als blindes boolesches/zeitbasiertes Orakel, um alle Daten zu lesen, die der Datenbankbenutzer lesen kann.


🔥 Auswirkungen

Jeder, der eine PowerGrid-Tabelle erreichen kann, die naturalSort verwendet, kann beliebige Daten aus der Datenbank lesen – andere Tabellen, Passwort-Hashes, Sitzungstoken, API-Schlüssel, mandantenübergreifende Datensätze – mithilfe eines zeit-/booleschen Orakels.

  • Vertraulichkeit: Hoch. Vollständiges Lesen von allem, was der DB-Benutzer SELECT kann.
  • Integrität: Niedrig. Gestapelte Abfragen werden durch die Standardkonfiguration von PDO MySQL blockiert, sodass ; UPDATE ... nicht ausgeführt wird. Schreibauswirkungen sind auf das beschränkt, was eine Unterabfrage auslösen kann.
  • Verfügbarkeit: Niedrig. Das gleiche Primitiv gibt einem Angreifer SLEEP() und schwere Unterabfragen – trivial missbrauchbar, um Datenbank-Threads zu blockieren.
  • Die typische Platzierung ist der erschwerende Faktor. PowerGrid-Tabellen befinden sich in Admin-Panels und Multi-Tenant-Back-Offices – genau dort, wo die interessanten Daten liegen. Ein niedrig privilegierter Mandantenbenutzer, der eine solche Tabelle erreicht, kann die gesamte Datenbank exfiltrieren.

Erforderliche Berechtigungen sind PR:L, da eine Datentabelle normalerweise hinter der Anwendungsauthentifizierung sitzt. Wenn die betroffene Tabelle auf einer nicht authentifizierten Seite gerendert wird, neu berechnen mit PR:N → 8.2 Hoch.


🧩 Grundursache – die vollständige Taint Chain

Drei Dateien, drei Stufen. Alle Referenzen beziehen sich auf den anfälligen Tag v6.10.3.

Stufe 1 – Quelle: eine vom Angreifer kontrollierte öffentliche Eigenschaft

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

Keine der Eigenschaften hat eine Whitelist, eine Validierungsregel oder einen normalisierenden Setter. `sortDirection` wird nur zugewiesen oder umgeschaltet:```php
public function reverseSort(): string    // line 37
{
    return $this->sortDirection === 'asc' ? 'desc' : 'asc';
}

updatedSortDirection() (Zeile 103) existiert — der natürliche Ort für Validierung —, aber in v6.10.3 verarbeitet es nur Lazy-Loading-Buchhaltung. Es überprüft den Wert nie.

Da Livewire öffentliche Eigenschaften direkt aus der Anfrage füllt, ist sortDirection an dieser Stelle vollständig angreiferkontrolliert, als beliebiger String.

Stufe 2 — Die rohe Klausel: naturalSort() setzt einen Platzhalter

src/Providers/Macros.php, Zeilen 102–116 — das naturalSort-Spalten-Makro:```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()` ergibt einen treiberspezifischen Ausdruck, der von
`getSortSqlByDriver()` in `src/DataSource/Support/Sql.php` (Zeilen 60–100) erstellt wird. Jede Treibervariante
endet mit dem gleichen Literal-Platzhalter:```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

Die Schwachstelle ist treiberunabhängig — jeder Zweig interpoliert {sortDirection}.

Stufe 3 — Sink: der Platzhalter wird mit dem rohen Eigenschaftswert aufgelöst

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

}

und die Ausführung, Zeile 52:```php
$query->{$method}($resolvedSql, $resolvedBindings);   // $method === 'orderByRaw'

data_get($this->component, 'sortDirection') gibt den String des Angreifers zurück, preg_replace_callback fügt es in den SQL-Text ein, und orderByRaw() — das vertragsgemäß sein Argument nicht escaped — übergibt es an die Datenbank.

Tool herunterladen