Bueno underc0de tengo rato sin postear este lo hice en mi blog pero lo posteare aqui tambien espero que les guste un saludo
¿Que es?Lfi significa local file include y lo que hacemos en este tipo de vulnerabilidad es pedir un archivo local por medio de la url, esto se causa por que muchos programadores no filtran sus codigos, un ejemplo comun puede llegar a ser:
<?php
$pagina=$_GET['pagina'];
include($pagina);
?>
Este codigo lo que hace es mostrar la pagina que incluyamos por ejemplo: menu.php index.php etc...
Sabiendo eso podemos formar un dork, por ejemplo:
inurl: index.php?pagina=menu.phpinurl significa buscar en url lo siguiente ...
puedes usar google como bing o diferentes buscadores muchos arrojan diferentes resultados....
Ahora sabemos que la LFI es causada por no filtrar bien las funciones
include() require() require_once() include_once()Como explotarlaentonces como ejemplo tenemos algo asi:
Los enlaces son solo para miembros. Registrate o iniciá sesióncon esto muchas veces podemos saber que
la variable pagina es vulnerable debido a que esta incluyendo un archivo sin filtrarlo .... que pasa si ponemos lo siguiente:
Los enlaces son solo para miembros. Registrate o iniciá sesióncomo no es encontrada el archivo requerido arroja un error, muchas veces no lo arroja esto es por que muchos tienen
desactivado error reporting pero igual es probable poder inyectar este tipo de vulnerabilidad
bueno siguiendo con el ejemplo anterior nos arrojaria algo asi:

como vemos tenemos dos directorios antes del archivo index.php es decir
/homes-www/mercadier si recuerdas en linux puedes hacer
cd .. y recorres un directorio atras... pues es lo que haremos escalar directorios para atras....
digamos quiero coger el archivo
/etc/passwd de esa web seria:
../../etc/passwd es decir me recorro las dos carpetas despues de index y luego entro a /etc/passwd querdaria asi:
Los enlaces son solo para miembros. Registrate o iniciá sesiónesto me mostraria el archivo
passwd que contiene los
usuarios,ids,grupo,terminales,contraseña
muchas veces la contraseña lo tapa con
x entonces para ello sabemos que se encuntran en un archivo llamado
shadow que se encuentra en el mismo directorio
/etc/shadow muchas veces ese archivo no se puede acceder a el por que es necesario privilegios de usuario como root por ejemplo....

tambien podemos escalar cosas diferentes como son...
/proc/cpuinfo que nos ofrece informacion del cpu o los
logs de apache para eso hay que ver los directorios puede haber muchos dependiendo del servidor como este instalado por ejemplo en mi caso tengo xampp en localhost seria de esta manera:
Los enlaces son solo para miembros. Registrate o iniciá sesión
Ahora como ves no se encuentra muchas cosas pero estos los son los accesos a las webs, imaginate que en los logs se muestre algo como la cabecera
user-agent es decir el
navegador entonces podriamos inyectar con un
sniffer de http como live https headers o tamper data e infectar los logs por ejemplo,
modificar esa cabecera user-agent y poner un codigo php para mostrar un phpinfo() y veriamos en los logs la informacion del php esto seria infectar los logs.... tambien se pueden infectar logs por /proc/self/environ pero muchas veces no se muestra... veremos como infectar logs para darnos RCE (remote code execution

)
Infectando logs por medio de /proc/self/fdBueno este es un nuevo agregado a este tutorial que es infectar logs por medio de /proc/self/fd y asi obtener RCE (remote command execution)

Para empezar utilizare
Los enlaces son solo para miembros. Registrate o iniciá sesión por que simplemente me carga mas rapido que el firefox que como son archivos largos puede llegar a colgarse.... empecemos haciendo una peticion del archivo /proc/self/environ a una web vulnerable a LFI...

bueno entonces intentemos con algo como /proc/self/cmdline o /proc/self/stat o /proc/self/status
con
cmdline devuelve la linea de comandos si hago una poc(proof of concept) en mi pc sale
bash y si hago una poc(proff of concept) en la web sale
php con esto sabemos que su cmdline en este caso es el proceso php
stat y
status nos devuelve el estado con su pid en el primer caso y en el segundo con size y mas informacion adicional


Ahora el
/proc/self/fd = Este es un subdirectorio que contiene una entrada para cada archivo que tiene abierto el proceso, nombrada con el descriptor de fichero, y que es un enlace simbólico al archivo real. Por lo tanto, 0 es la entrada estándar, salida estándar 1, 2 error estándar, etc
para mas informacion sobre
Los enlaces son solo para miembros. Registrate o iniciá sesiónbueno en este caso queremos encontrar la entrada del archivo del proceso abierto y como no sabemos usaremos
bruteforce intentando hasta encontrar el archivo correcto....
Les dejo una
wordlist aunque ustedes pueden crear una para esto o para cualquier cosa como blindsqli, bruteforce http etc burp es una gran suite

/proc/self/fd/0
/proc/self/fd/1
/proc/self/fd/2
/proc/self/fd/3
/proc/self/fd/4
/proc/self/fd/5
/proc/self/fd/6
/proc/self/fd/7
/proc/self/fd/8
/proc/self/fd/9
/proc/self/fd/10
/proc/self/fd/11
/proc/self/fd/12
/proc/self/fd/13
/proc/self/fd/14
/proc/self/fd/15
/proc/self/fd/16
/proc/self/fd/17
/proc/self/fd/18
/proc/self/fd/19
/proc/self/fd/20
/proc/self/fd/21
/proc/self/fd/22
/proc/self/fd/23
/proc/self/fd/24
/proc/self/fd/25
/proc/self/fd/26
/proc/self/fd/27
/proc/self/fd/28
/proc/self/fd/29
/proc/self/fd/30
/proc/self/fd/31
/proc/self/fd/32
/proc/self/fd/33
/proc/self/fd/34
/proc/self/fd/35
no enseñare como configurar el burp suite ya que solo es una proxy y la puedes configurar desde el navegador para atrapar la web pero si explicare como hacer para atacar con el wordlist

tenemos nuestro Host a vulnerable a LFI y lo mandamos a intruder seria algo asi:
Click derecho o action > Send to intruderen intruder seleccionamos positions y damos un
clear$ que seria limpiar y luego agregamos (
add$) la ruta a escalar, ejemplo:

luego configuramos el
payload agregamos el archivo
wordlist desde
load... y lo seleccionamos lo tienen arriba solo lo guardan como
txt xD, despues de eso en el menu de arriba clickeamos
intruder>start attack
buscamos una entrada relacionada con la web que estamos y dice que tenemos un error al pedir el archivo favicon.ico
entonces en repeater hago una peticion a
/favicon.ico y pongo una cabecera
referer inyectando el codigo malicioso por ejemplo
<?php system('ls'); ?>

por ultimo hacemos de nuevo una peticion al archivo donde encontramos esos registros....
/proc/self/fd/numeroqueobtuvistes
Nuestro amigo
Psymera comenta algo de un
codigo con un path que seria asi:
<?php
$pagina=$_GET['pagina'];
include("upload/$pagina");
?>
donde upload seria nuestra carpeta aunque seria lo mismo nos saldria un error con lo cual tendriamos que escalar las carpetas del servidor incluyendo tambien la carpeta upload.... un ejemplo de este error seria:

por lo que solo seria escalar dos carpetas mas despues del FPD (Full path disclousure) que seria:
../../../../../../etc/passwd y entonces:

Este tipo de webs lo tome de un exploit de un cms que encontro Daniel Godoy...
tambien podriamos con Los enlaces son solo para miembros.
Registrate o
iniciá sesión hacer un enlace para obtener un recurso por ejemplo obtener el index de una web por medio de un LFI, por ejemplo:
pagina.com/index.php?pagina=Los enlaces son solo para miembros.
Registrate o
iniciá sesióntambien podriamos con
Los enlaces son solo para miembros. Registrate o iniciá sesión hacer un enlace para obtener un recurso por ejemplo obtener el index de una web por medio de un LFI, por ejemplo:
Los enlaces son solo para miembros. Registrate o iniciá sesión
esto nos mostraria
el codigo del archivo index.php convertido a base64 con lo cual solo lo decodificariamos....
y con seguir buscando dentro del codigo podiamos
encontrar un require() include() o un SQLI u otras vulnerabilidades, en este caso fue la base de datos


Otro ejemplo es usar
data:// para obtener datos por medio de cabeceras de
content-type por ejemplo seria hacer esto:
Los enlaces son solo para miembros. Registrate o iniciá sesión
ese base64 es un archivo php con una funcion system() pidiendo todo lo que se inque con cmd
por ultimo tambien puedes usar
Los enlaces son solo para miembros. Registrate o iniciá sesión para ingresar una shell en los datos por post pidiendo asi comandos

esa herramienta de arriba es la hackbar puedes descargar un manual en este mismo
foroIncluso por
Los enlaces son solo para miembros. Registrate o iniciá sesión puedes obtener un lfi:
Evasion de WAF'sMuchas veces los
WAF (Web Application Firewall) detectan una ataque LFI respondiendo con otro tipo de codigo de estado que el normal -->200 OK como puede ser 403 Forbidden,501 No implementado,etc
Para ello usamos
NULL BYTES que seria algo vacio
%00 esta encodeado en urlencode, en este caso no tengo casos de ejemplo pero puedo mostrar como se conformaria este tipo de urls:
Los enlaces son solo para miembros. Registrate o iniciá sesiónOtra manera seria encodear la barra (
/) que seria
%2FLos enlaces son solo para miembros. Registrate o iniciá sesiónbueno estas solo son dos si saben mas avisen y agrego, para estos casos es solo imaginar como evadir el firewall de una aplicacion web
Como evitar un ataque LFI podriamos usar condicionales en el codigo.... en este caso un switch dependiendo del numero de pagina incluidas y por defecto incluir una pagina si se pide otra cosa....
<?php
$pagina=$_GET['pagina'];
switch ($pagina) {
case 'about.php':
include('about.php');
break;
default:
include('index.php');
break;
?>
CorrecionesBueno antes que nada me he equivocado en algunas partes y quiero compartilas y agradecer a
Dedalo, Psymera ,Q3rv0 si alguien encuentra otro error en el tuto diganme y le hago un edit o
si se saben otro metodo aparte de este tambien diganlo y le agregamos ....
Correcion 1: En el codigo de solucion tenia un include todavia en ves del switch <-- corregido
Correcion 2: Para el Wrapper Los enlaces son solo para miembros.
Registrate o
iniciá sesión es necesario tener activado allow_url_include = On esto se puede modificar desde php.ini o .htaccess
Correcion 3: Para el Wrapper data:// es necesario tener activado allow_url_include y allow_url_fopen por lo que no serviria en este caso de LFI sino seria para RFI
Correcion 4: El codigo que comenta Psymera que es para RFI pero tambien viene en muchos LFI por lo que solamente incluire un pequeño ejemplo de lo que el comenta en el tuto

Bueno he terminado espero que les haya gustado he mostrado algunos metodos con los que pudiesen obtener datos importantes o obtener incluso una shell... salu2