PrestaShop

Reading time: 5 minutes

tip

Apprenez et pratiquez le hacking AWS :HackTricks Training AWS Red Team Expert (ARTE)
Apprenez et pratiquez le hacking GCP : HackTricks Training GCP Red Team Expert (GRTE) Apprenez et pratiquez le hacking Azure : HackTricks Training Azure Red Team Expert (AzRTE)

Soutenir HackTricks

Perl backticks/qx// sinks in Apache mod_perl handlers (reachability and exploitation)

ModĂšle observĂ© en conditions rĂ©elles : du code Perl construit une chaĂźne de commande shell et l'exĂ©cute via des backticks (ou qx//). Dans un mod_perl AccessHandler, des composants de requĂȘte contrĂŽlĂ©s par l'attaquant comme $r->uri() peuvent s'Ă©couler dans cette chaĂźne. Si une branche quelconque concatĂšne une entrĂ©e brute puis l'Ă©value avec un shell, vous obtenez une pre-auth RCE.

Primitives d'exécution Perl risquées (ouvrent un shell lorsqu'on leur fournit une seule chaßne) :

  • Backticks / qx//: my $out = cmd ...;
  • system with a single string: system("/bin/sh -c '...'") implicitly
  • open with a pipe: open my $fh, "cmd |" or "| cmd"
  • IPC::Open3 with a single string

Forme minimale vulnérable observée en conditions réelles:

perl
sub getCASURL {
...
my $exec_cmd = "...";
if ($type eq 'login') {
$exec_cmd .= $uri;        # $uri from $r->uri() → attacker-controlled
my $out = `$exec_cmd`;    # backticks = shell
}
}

Considérations clés d'atteignabilité dans mod_perl :

  • Enregistrement du handler : httpd.conf doit router les requĂȘtes vers votre module Perl, par ex. PerlModule MOD_SEC_EMC::AccessHandler et une configuration qui invoque AccessHandler::handler pour une portĂ©e de chemin.
  • DĂ©clenchement de la branche vulnĂ©rable : forcez le flux de login non authentifiĂ© pour que type == "login" (par ex., omettez le auth cookie attendu).
  • Chemin rĂ©soluble : assurez-vous que votre requĂȘte cible une URI qui se rĂ©sout dans la portĂ©e configurĂ©e. Si Apache ne route jamais la requĂȘte via le handler, le sink n'est pas atteint.

Exploitation workflow

  1. Inspectez httpd.conf pour les scopes PerlModule/MOD_PERL du handler afin de trouver un chemin résoluble traité par le handler.
  2. Envoyez une requĂȘte non authentifiĂ©e pour que le chemin de redirection de login soit pris (type == "login").
  3. Placez des shell metacharacters dans le chemin request-URI pour que $r->uri() transporte votre payload dans la chaĂźne de commande.

Example HTTP PoC (path injection via ';')

http
GET /ui/health;id HTTP/1.1
Host: target
Connection: close

Conseils

  • Essayez des sĂ©parateurs : ;, &&, |, backticks, $(...), et des sauts de ligne encodĂ©s (%0A) selon la façon dont la chaĂźne est citĂ©e.
  • Si des patches antĂ©rieurs mettent entre guillemets d'autres arguments mais pas l'URI dans une branche, les payloads ajoutĂ©s Ă  la fin de la chaĂźne fonctionnent souvent : ;id# or &&/usr/bin/id#

Durcissement (Perl)

  • Ne construisez pas de chaĂźnes pour le shell. PrĂ©fĂ©rez l'exĂ©cution avec vecteur d'arguments : system('/usr/bin/curl', '--silent', '--', $safe_url) — sans shell.
  • Si un shell est inĂ©vitable, Ă©chappez strictement et de maniĂšre cohĂ©rente dans toutes les branches ; considĂ©rez $r->uri() comme hostile. Envisagez URI::Escape pour les chemins/queries et des allowlists strictes.
  • Évitez les backticks/qx// pour l'exĂ©cution de commandes ; capturez la sortie via open3/list si vraiment nĂ©cessaire sans invoquer un shell.
  • Dans les handlers mod_perl, maintenez les chemins de code auth/redirect sans exĂ©cution de commandes ou assurez une sanitisation identique entre les branches pour Ă©viter les rĂ©gressions du type « corrigĂ© partout sauf dans une branche ».

Recherche de vulnérabilités

  • DiffĂ©renciez les patches des modules qui assemblent des commandes shell ; cherchez des guillemets incohĂ©rents entre branches (p.ex., if ($type eq 'login') laissĂ© non Ă©chappĂ©).
  • Cherchez avec grep : backticks, qx//, open\s*(|||, et system\s*(\s* pour trouver des shells basĂ©s sur des chaĂźnes. Construisez un graphe d'appels du sink jusqu'Ă  l'entrĂ©e de la requĂȘte ($r) pour vĂ©rifier l'atteignabilitĂ© prĂ©-auth.

Cas réel : Dell UnityVSA pre-auth RCE (CVE-2025-36604)

  • Injection de commande prĂ©-auth via backticks dans AccessTool.pm:getCASURL lorsque type == "login" concatĂ©nait le $uri brut ($r->uri()).
  • Accessible via MOD_SEC_EMC::AccessHandler → make_return_address($r) → getCASLoginURL(..., type="login") → getCASURL(..., $uri, 'login').
  • Nuance pratique : utilisez un chemin rĂ©soluble pris en charge par le handler ; sinon le module ne s'exĂ©cutera pas et le sink ne sera pas atteint.

Références

tip

Apprenez et pratiquez le hacking AWS :HackTricks Training AWS Red Team Expert (ARTE)
Apprenez et pratiquez le hacking GCP : HackTricks Training GCP Red Team Expert (GRTE) Apprenez et pratiquez le hacking Azure : HackTricks Training Azure Red Team Expert (AzRTE)

Soutenir HackTricks