Skip to content
KitploitKITPLOIT
FerramentasExploitsBlog
Log in
Enviar
FerramentasExploitsBlog
Enviar

Ferramentas de Hacking, PenTest e Cibersegurança para o seu Arsenal de Segurança!

Kitploit é um diretório de ferramentas de hacking, cibersegurança e pentesting. Descubra as últimas atualizações de projetos para encontrar vulnerabilidades, analisar sistemas, automatizar testes e fortalecer sua segurança.

FeedsContatoPrivacidade© 2026 Kitploit

Diretório de Ferramentas

Categorias

Ver todas as categorias
Loading categories
cakephp-window-sqli — CakePHP 5.4.2 - Alta - Remota - SQLi - Deslocamentos de intervalo/frame do WindowExpression inseridos no SQL | Kitploit
Ferramentas/GitHubGitHub/abraxas/cakephp-window-sqli
Scanners de VulnerabilidadesAnálise de VulnerabilidadesAnálise de CódigoExploraçãoExploração de Aplicações WebSegurança WebSegurança de Banco de Dados
GitHubabraxas/cakephp-window-sqli

cakephp-window-sqli

CakePHP 5.4.2 - Alta - Remota - SQLi - Deslocamentos de intervalo/frame do WindowExpression inseridos no SQL

Ver Repositório
há 4 diasAinda não revisado

Mais Populares

Ver todos →

Descubra as ferramentas mais usadas pela nossa comunidade.

Explore todas as ferramentas

Navegue pela nossa coleção de ferramentas

Ver todas as ferramentas →
Compartilhar

Abraxas Labs - cakephp-window-sqli

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

cakephp-window-sqli

Classe: SQLi Alcance: Remoto

CakePHP 5.4.2 (887b641) - Cake Software Foundation

CVE-2026-79752 fechou FunctionsBuilder cast / extract / dateAdd com ensureSimpleString(). WindowExpression::range() e frame() não estavam nessa correção. rows() e groups() aceitam ?int. range() ainda aceita uma string. buildOffsetSql concatena o offset, o tipo de frame e PRECEDING / FOLLOWING no OVER. O binder não é usado a menos que o offset já seja um ExpressionInterface.

Uma aplicação que encaminha dados da requisição para func()->count('*')->over()->range($start, $end) coloca a string do chamador em RANGE BETWEEN sem binding e sem aspas.

IDainda sem CVE
ClasseSQLi
AlcanceRemoto (aplicação que encaminha dados da requisição para 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
ProdutoCakePHP (cakephp/database)
Afetado5.4.2 (887b641de9f7aba06071f98f17edcbc573cbcf63)
Autenticaçãoaplicação que encaminha dados de query/form para ->over()->range($start, $end) / frame()
LicençaGNU Affero GPL v3.0
Labapenas 127.0.0.1

O que um atacante pode fazer

Um usuário que consegue definir o limite de janela que a aplicação encaminha (analytics "últimos N dias", um construtor de relatórios) transforma a cláusula OVER em SQL adicional.

PrivilégioMétodo / sinkTipoComprovado em lab ou inferido
Inserir um fragmento SQL em OVER (RANGE BETWEEN ...)GET /?mode=range&start= para AggregateExpression::range($start, $end) / WindowExpression::frame()Integridade do SQL compiladoComprovado em lab. O SQL compilado é RANGE BETWEEN 1) /* CAKEPHP-WINDOW-SQLI-WITNESS */ -- PRECEDING com um binder vazio
Ler ou modificar linhas como o usuário de BD da aplicaçãoMesma query, executadaIntegridade / reconhecimento do BDInferido a partir da inserção. Este lab é apenas de compilação
Alterar o tipo de frame ou a direção da mesma formaframe($type, $offset, $direction, ...) também concatena essas stringsIntegridade do SQL compiladoInferido a partir de sql() / buildOffsetSql(). O lab usou range()
Quebrar rows() / groups() da mesma formaTipados como ?intFechadoComprovado em lab como fechado. rows(3) é ROWS BETWEEN 3 PRECEDING, sem aspas, sem binding

Fechado neste pin: FunctionsBuilder cast / extract / dateAdd / jsonValue (CVE-2026-79752 / CVE-2026-77635); Query::limit / offset (tipados como int). O cakephp/app padrão não chama range() com dados de query-string. O que resta é a API de janela documentada. Não é RCE não autenticado em uma aplicação esqueleto. Não é um shell.

Outros resquícios do mesmo pin: collate SQLi, attachment CRLF, cache unserialize.

Como eu encontrei

Eu fixei cakephp/cakephp 5.4.2 após os GHSAs de SQLi do FunctionsBuilder de 2026. Dez buscas nessa tag. CSRF / FormProtection, View LFI, BodyParser XXE, mass assignment, helper XSS e clientIp() sem trustProxy voltaram vazios nesse critério. WindowExpressionTest::testRange ainda afirma:

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

buildOffsetSql nunca faz binding de um offset string:

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 não é usado a menos que o offset já seja um ExpressionInterface.

Caminhos errados já registrados: tratar rows() como a falha (ele é tipado como int); afirmar que o cakephp/app padrão expõe isso em um formulário público; executar o SQL injetado no SQLite como oráculo (POC-READY é apenas de compilação); um reverse shell. Teatro.

Lab

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

ou

cd lab
./run.sh

Alvo apenas http://127.0.0.1:19440. Aplicação PHP pequena, cakephp/database 5.4.2, SQLite :memory:. GET /?mode=range&start= é passado como string para range(). GET /?mode=rows&n=3 é o controle int.

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

IOC do SQL compilado:

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

Controle:

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

A correção

Faça binding de offsets numéricos. Use allowlist para o tipo de frame (RANGE / ROWS / GROUPS) e a direção (PRECEDING / FOLLOWING). Para strings de intervalo, coloque-as entre aspas ou exija ExpressionInterface. Adicione um teste que garanta que um offset não-int de range() se torne um placeholder ou um literal entre aspas, e não SQL bruto.

Referências

  • github.com/cakephp/cakephp tag 5.4.2 (887b641de9f7aba06071f98f17edcbc573cbcf63)
  • WindowExpression.php · AggregateExpression.php
  • Corrigidos próximos: CVE-2026-79752 · CVE-2026-77635
  • Mesmo pin: cakephp-collate-sqli · cakephp-attachment-crlf · cakephp-cache-unserialize
  • CWE-89

Licença

GNU Affero GPL v3.0. Veja LICENSE. Apenas lab em loopback. Sem garantia.

Baixar ferramenta