miércoles, 26 de marzo de 2014

[Parte 3] Seguridad en PHP

Bases de datos y SQL

PHP soporta actualmente varias bases de datos las cuales podemos observar desde: http://www.php.net/manual/es/refs.database.php
Entre las mas usadas las cuales son:

* DB2                            *ODBC         *SQLite
* InterBase       *Oracle       *Sybase
* MySQL           *PostgreSQL      *DBM

Credenciales de acceso expuestas

Hay muchos programadores que exponen datos importantes de la base de de datos y pueden ser visto por todo el publico, ya que agregan archivos .inc donde viene un tipo de archivo con sus credenciales de acceso, o simplemente hacen respaldos de su base de datos dentro del directorio publico.


Puedes usar algunos dorks de http://www.exploit-db.com/google-dorks/ para encontrar ese tipo de informacion usando google.

Una buena manera de evitar este tipo de errores, seria almacenar nuestro .inc fuera de la carpeta publica /www, Esto es muy comun tambien en bases de datos SQLite ya que como se crean archivos .sql deberiamos de mantener todas ellas fuera de la carpeta /www a un nivel mas arriba... otra solucion seria denegar el acceso a todos los archivos .inc

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

Inyeccion SQL

Las Inyecciones SQL son de las mas comunes en aplicaciones web, la podemos encontrar en la lista del OWASP https://www.owasp.org/index.php/Top_10_2013-Top_10


La inyeccion SQL requiere un poco de conjeturas por parte del atacante, ya que como no tiene el codigo fuente es lo que debe de hacer. Hagamos un ejemplo basico, tenemos un formulario de inicio de sesion como el siguiente:








Como puedes ver este login ademas de ser vulnerable, tiene sus contraseñas encriptadas con md5, lo cual ya no es nada seguro ingresando a alguna pagina como: http://www.md5decrypter.co.uk/ el cual tiene una base de datos de hashes para desencriptar...

La mejor solucion a esto es usar un salto para la contraseña, utilizando una cadena que es unica para la aplicacion :)


Para realizar este ataque no es necesario que el atacante adivine completamente la consulta, sino que empieze intentado por producir un error por ejemplo, inyectando una comilla simple, ya que muchos programadores utilizan la funcion mysql_error() cada vez que se produzca un error en la consulta.


Si bien esto es bastante util durante el desarrollo, cuando lo implementamos ya a nivel web esto puede ser de utilidad para un atacante, y nuestra consulta del login se convertiria algo como lo siguiente si usamos la comilla simple:


Si la consulta se envia a MySQL y no esta filtrada nos mostraria un error como el siguiente:


You have an error in your SQL syntax. Check the manual that
corresponds to your
MySQL server version for the right syntax to use near 'WHERE username
= ''' AND
password = 'e2a318c0755089



Para empezar ya tenemos los nombres de dos columnas, y manipulando la consulta WHERE podriamos obtener mas datos...
Desde el punto de vista de un atacante tiene muchas opciones y la mas facil seria poner algo como:

miusuario' or 1 -- -

El -- es un comentario en MySQL y se le agrega un espacio para que funcione, en este caso nos daria un login correcto, no estamos especificando un usuario en comun, pero si tuviesemos el nombre del usuario podriamos atacarlo e ingresar a su perfil, de la siguiente manera:

arthusu' or 1 -- -

La consulta se convertiria en lo siguiente:



Como mencionamos en la parte numero 1, siempre debemos filtrar la entrada  y escapar la salida.


Generalmente para escapar los datos se requiere una sola unica funcion, en el caso de mysql es mysql_real_escape_string():




Es recomendable utilizar una funcion nativa para escapar los datos, si es que la tiene, sino podemos usar en cualquier caso como una alternativa addslashes()

O simplemente podemos utilizar una libreria, tal como pueden ser PEAR::DB, PDO, etc. Pueden consultar un articulo de PDO en este mismo blog: http://arthusu.blogspot.mx/2013/08/tutorial-pdo-mysql.html

Exposicion de datos



Una de las preocupaciones de cualquier programador deberia ser la exposicion de datos, ya que si alguien llega a encontrar los datos que tienes en tu base de datos, ya sea por que ingresaron por tus credenciales o por que te hicieron inyeccion sql, estos datos pueden ser demasiados sensibles, tales como tarjetas de credito, numeros de seguridad social, etcetera... Para ello debemos cifrar nuestros datos de manera que si llegasen a obtener nuestra base de datos, nuestros datos esten tan encriptados que no puedan ser crackeados y finalmente la informacion no llegaria... Esto lo veremos en una parte mas avanzada. :D

Referencias:

* Essential PHP Security
* PHP.net
* Exploit-DB
 


Hasta aqui la tercera parte, espero que les haya gustado, dejen sus comentarios para cualquier sugerencia :D

No hay comentarios:

Publicar un comentario en la entrada