elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Guía actualizada para evitar que un ransomware ataque tu empresa


+  Foro de elhacker.net
|-+  Seguridad Informática
| |-+  Seguridad (Moderador: r32)
| | |-+  [LFI] ¿Podemos saltar este filtro para poder leer otro tipo de archivo?
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: [LFI] ¿Podemos saltar este filtro para poder leer otro tipo de archivo?  (Leído 2,676 veces)
GGZ

Desconectado Desconectado

Mensajes: 144



Ver Perfil
[LFI] ¿Podemos saltar este filtro para poder leer otro tipo de archivo?
« en: 9 Agosto 2017, 04:17 am »

Hola.

Quiero ver si consigo explotar un LFI en bibtexbrowser.

Directorio a explotar: /bibtexbrowser.php?frameset&bib=file.fib

Me puse a mirar el código de bibtexbrowser ( https://github.com/monperrus/bibtexbrowser/blob/master/bibtexbrowser.php ), y me encontré con esto:

Código
  1.  foreach(explode(MULTIPLE_BIB_SEPARATOR, $bibtex_filenames) as $bib) {
  2.    // get file extension to only allow .bib files
  3.    $ext = pathinfo($bib, PATHINFO_EXTENSION);
  4.    // this is a security protection
  5.    if (BIBTEXBROWSER_LOCAL_BIB_ONLY && (!file_exists($bib) || strcasecmp($ext, 'bib') != 0)) {
  6.      // to automate dectection of faulty links with tools such as webcheck
  7.      header('HTTP/1.1 404 Not found');
  8.      // escape $bib to prevent XSS
  9.      $escapedBib = htmlEntities($bib, ENT_QUOTES);
  10.      die('<b>the bib file '.$escapedBib.' does not exist !</b>');
  11.    }
  12.  } // end for each

Este código está un poco más actualizado que el que estoy explotando en otra página, porque la versión que esta cargada en la página donde estoy explotando la vulnerabilidad es vulnerable a XSS, cuando esta versión de bibtexbrowser no es vulnerable, se puede ver que no es vulnerable por esta línea:
Código
  1.      // escape $bib to prevent XSS
  2.      $escapedBib = htmlEntities($bib, ENT_QUOTES);

Ahora volviendo al caso de LFI:

Baja la extensión del archivo así:
Código
  1. $ext = pathinfo($bib, PATHINFO_EXTENSION);

Buscando por Google, leí que se podía hacer un bypass de la función pathinfo utilizando null byte ( http://www.madirish.net/202 ).

Entonces para cargarme el index.php intenté algo como esto: index.php%00.bib , pero no parece funcionar.

¿Qué otras cosas podría intentar? o alguna explicación de porqué esto no funciona.

Saludos



« Última modificación: 9 Agosto 2017, 10:55 am por GGZ » En línea

LET'S DO STUFF!!
#!drvy


Desconectado Desconectado

Mensajes: 5.850



Ver Perfil WWW
Re: [LFI] ¿Podemos saltar este filtro para poder leer otro tipo de archivo?
« Respuesta #1 en: 9 Agosto 2017, 18:06 pm »

El nullbyte no funciona porque a file_exists no le afectan nullbytes. Veras, en versiones anteriores de PHP, el nullbyte afectaba en string, lo que se traducía a que todas las funciones que trataban con ello, eran vulnerables. A partir de 5.3.4 si no me equivoco, eso cambió y ya no les afecta dado que nno admiten strings con nullbyte.

Sencilla demostración.

test.php
Código
  1. <?php
  2. if(isset($_GET['file'])){
  3.  
  4.    $ext = pathinfo($_GET['file'], PATHINFO_EXTENSION);
  5.    $compare = (strcasecmp($ext, 'bib') != 0 ? false : true);
  6.    $exists = file_exists($_GET['file']);
  7.  
  8.    echo '<strong>El archivo elegido es: </strong> ', var_dump($_GET['file']), '<br>';
  9.    echo '<strong>La extension del archivo es: </strong> ', var_dump($ext), '<br>';
  10.    echo '<strong>Segun strcasecmp, la extension es un bib ?:</strong> ', var_dump($compare), '<br>';
  11.    echo '<strong>El archivo elegido existe ?: </strong> ', var_dump((bool) $exists);
  12.  
  13. }



Si hago la esta consulta (y tengo creado el archivo .bib):
http://domain/test.php?file=hola.bib

Me devolvería:

Código:
El archivo elegido es: string(8) "hola.bib"
La extension del archivo es: string(3) "bib"
Segun strcasecmp, la extension es un bib ?: bool(true)
El archivo elegido existe ?: bool(true)



Pero si hago esto
http://domain/test.php?file=test.php%00.bib

Me devuelve:
Código:
El archivo elegido es: string(13) "test.php.bib"
La extension del archivo es: string(3) "bib"
Segun strcasecmp, la extension es un bib ?: bool(true)
El archivo elegido existe ?: bool(false)



Si te fijas, la función strcasecmp si es vulnerable porque compara vía binaria pero el file_exists no lo es (dice que el archivo no existe, a pesar de que existe) porque no procesa strings con NullBytes.

Puedes ver más info en el changelog de PHP para esa version.
http://php.net/releases/5_3_4.php

Citar
Paths with NULL in them (foo\0bar.txt) are now considered as invalid (CVE-2006-7243).

Eso se aplica para todas la funciones que tratan con archivos (file_exists, file_get_contents, include, require etc..)

Saludos


En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines