Skip to content
KitploitKITPLOIT
StrumentiExploitsBlog
Log in
Invia
StrumentiExploitsBlog
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.

FeedContattoPrivacy© 2026 Kitploit

Directory degli strumenti

Categorie

Vedi tutte le categorie
Loading categories
cakephp-window-sqli — CakePHP 5.4.2 - Alto - Remoto - SQLi - Offset di intervallo/frame di WindowExpression inseriti in SQL | Kitploit
Strumenti/GitHubGitHub/abraxas/cakephp-window-sqli
Scanner di VulnerabilitàAnalisi delle VulnerabilitàAnalisi del CodiceExploitSfruttamento di Applicazioni WebSicurezza WebSicurezza dei Database
GitHubabraxas/cakephp-window-sqli

cakephp-window-sqli

CakePHP 5.4.2 - Alto - Remoto - SQLi - Offset di intervallo/frame di WindowExpression inseriti in SQL

Vedi Repository
178 giorni 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

Abraxas Labs - cakephp-window-sqli

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

Write-up: https://abraxaslabs.tech/research/cakephp-window-sqli

cakephp-window-sqli

Classe: SQLi Raggiungibilità: Remota

CakePHP 5.4.2 (887b641) - Cake Software Foundation

CVE-2026-79752 ha chiuso cast / extract / dateAdd di FunctionsBuilder con ensureSimpleString(). WindowExpression::range() e frame() non erano inclusi in quella correzione. rows() e groups() accettano ?int. range() accetta ancora una stringa. buildOffsetSql concatena l'offset, il tipo di frame e PRECEDING / FOLLOWING in OVER. Il binder non viene utilizzato a meno che l'offset non sia già un ExpressionInterface.

Un'app che inoltra dati della richiesta in func()->count('*')->over()->range($start, $end) inserisce la stringa del chiamante in RANGE BETWEEN senza binding e senza quoting.

IDnessuna CVE al momento
ClasseSQLi
RaggiungibilitàRemota (app che inoltra dati della richiesta in range() / frame())
CWECWE-89
CVSSAlto: 8.1 CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:N
ProdottoCakePHP (cakephp/database)
Affetto5.4.2 (887b641de9f7aba06071f98f17edcbc573cbcf63)
Authapplicazione che inoltra dati di query/form in ->over()->range($start, $end) / frame()
LicenzaGNU Affero GPL v3.0
Labsolo 127.0.0.1

Cosa può fare un attaccante

Un utente che può impostare il limite della finestra che l'app inoltra (analytics "ultimi N giorni", un generatore di report) trasforma la clausola OVER in SQL aggiuntivo.

PrivilegioMetodo / sinkTipoDimostrato in lab o dedotto
Inserire un frammento SQL in OVER (RANGE BETWEEN ...)GET /?mode=range&start= in AggregateExpression::range($start, $end) / WindowExpression::frame()Integrità dell'SQL compilatoDimostrato in lab. L'SQL compilato è RANGE BETWEEN 1) /* CAKEPHP-WINDOW-SQLI-WITNESS */ -- PRECEDING con un binder vuoto
Leggere o modificare righe come l'utente DB dell'appStessa query, eseguitaIntegrità / ricognizione del DBDedotto dall'inserimento. Questo lab è solo di compilazione
Cambiare il tipo di frame o la direzione allo stesso modoframe($type, $offset, $direction, ...) concatena anche quelle stringheIntegrità dell'SQL compilatoDedotto da sql() / buildOffsetSql(). Il lab ha usato range()
Rompere rows() / groups() allo stesso modoTipizzati ?intChiusoDimostrato chiuso in lab. rows(3) è ROWS BETWEEN 3 PRECEDING, senza quoting, senza binding

Chiuso su questo pin: cast / extract / dateAdd / jsonValue di FunctionsBuilder (CVE-2026-79752 / CVE-2026-77635); Query::limit / offset (int tipizzato). Il cakephp/app predefinito non chiama range() con dati della query string. Ciò che resta è l'API window documentata. Non è RCE non autenticato su un'app skeleton. Non è una shell.

Same pin leftovers: collate SQLi, attachment CRLF, cache unserialize.

Come l'ho trovato

Ho fissato cakephp/cakephp 5.4.2 dopo le GHSA del 2026 su SQLi in FunctionsBuilder. Dieci ricerche su quel tag. CSRF / FormProtection, LFI nella View, XXE nel BodyParser, mass assignment, XSS negli helper e clientIp() senza trustProxy sono risultati vuoti in questa barra. WindowExpressionTest::testRange continua ad asserire:

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

buildOffsetSql non associa mai un offset di tipo stringa:

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 non viene utilizzato a meno che l'offset non sia già un ExpressionInterface.

Vicoli ciechi già registrati: trattare rows() come la falla (è tipizzato int); affermare che lo stock cakephp/app lo espone su un form pubblico; eseguire l'SQL iniettato in SQLite come oracolo (POC-READY è solo compilazione); una reverse shell. Teatro.

Lab

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

o

cd lab
./run.sh

Prendi di mira solo http://127.0.0.1:19440. Piccola app PHP, cakephp/database 5.4.2, SQLite :memory:. GET /?mode=range&start= viene passato come stringa in range(). GET /?mode=rows&n=3 è il controllo 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 compilato:

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

Controllo:

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

La correzione

Associare offset numerici. Consentire il tipo di frame (RANGE / ROWS / GROUPS) e la direzione (PRECEDING / FOLLOWING). Per le stringhe di intervallo, racchiuderle tra virgolette o richiedere ExpressionInterface. Aggiungere un test che verifichi che un offset non-int di range() diventi un placeholder o un letterale tra virgolette, non SQL grezzo.

Riferimenti

  • github.com/cakephp/cakephp tag 5.4.2 (887b641de9f7aba06071f98f17edcbc573cbcf63)
  • WindowExpression.php · AggregateExpression.php
  • Correlati corretti: CVE-2026-79752 · CVE-2026-77635
  • Stesso pin: cakephp-collate-sqli · cakephp-attachment-crlf · cakephp-cache-unserialize
  • CWE-89

Licenza

GNU Affero GPL v3.0. Vedi LICENSE. Solo laboratorio loopback. Nessuna garanzia.

Scarica lo strumento