Sunteți pe pagina 1din 13

TRABAJO PRCTICO

MATERIA: PROG. WEB


TEMA: SEGURIDAD EN CONEXIONES PHP
SEMESTRE: ONCEAVO CURSO: SEXTO.

ALUMNO: HCTOR ESTIGARRIBIA PROF: ING. RUBEN GONZLEZ FACULTAD POLITCNICA UNVES 2010

Fuente: http://www.php.net/manual/es/

Seguridad de Bases de Datos


Hoy en da, las bases de datos son componentes cardinales de cualquier aplicacin basada en la web permitiendo a los sitios web que provean una variedad de contenido dinmico. Esta informacin muy sensible o secreta puede ser almacenada en una base de datos, por lo que debe considerar fuertemente proteger su base de datos. Para devolver o almacenar cualquier informacin usted necesita conectarse a la base de datos, enviar una consulta legtima, devolver el resultado, y cerrar la conexin. Hoy en da, el lenguaje de consultas comunmente utilizado en esta interaccin es el Lenguaje Estructurado de Consultas (SQL, por sus siglas en ingls). Vea como un atacante puede entrometerse con una consulta maliciosa de SQL:

Inyeccin de SQL
Muchos desarrolladores web son desprevendios de cmo las consultas SQL pueden ser manipuladas, y asumen que una consulta SQL es un comando confiable. Esto significa que las consultas SQL estn expuestas a que sean malversadas en controles de acceso, y por lo tanto, sobrepasar las revisiones de autenticacin y autorizacin estndar, y que algunas veces las consultas SQL an podran permitir el acceso de comandos a nivel de sistema operativo del ordenador. Comandos directos de Inyeccin SQL es una tcnica donde un atacante crea o altera comandos SQL existentes para exponer datos ocultos, sobreponerse a los que son importantes, o peor an, ejecutar comandos peligrosos a nivel de sistema en el equipo donde se encuentra la base de datos. Esto se logra a travs de la aplicacin, tomando la entrada del usuario y combinndola con parmetros estticos para elaborar una consuta SQL. Los siguientes ejemplos estn basados en historias reales, desafortunadamente. Debido a la falta de validacin en la entrada de datos y conectndose a la base de datos con privilegios de super usuario o de alguien con privilegios que puede crear usuarios, el atacante podra crear un super usuario en su base de datos. Example #1 Dividiendo el conjunto de resultados en pginas ... y haciendo super usuarios (PostgreSQL)
<?php $offset = $argv[0]; // Cuidado, no hay validacin en la entrada de datos! $query = "SELECT id, name FROM products ORDER BY name LIMIT 20 OFFSET $o ffset;"; $result = pg_query($conn, $query); ?>

Los usuarios normales dan clic en los enlaces 'siguiente' o 'atras' donde $offset est codificado en la URL. El script espera que el $offset entrante sea un nmero dcimal. Sin

Fuente: http://www.php.net/manual/es/

embargo, qu pasa si alguien intenta irrumpir aadiendo una funcin urlencode() al formulario de la siguiente URL
0; insert into pg_shadow(usename,usesysid,usesuper,usecatupd,passwd) select 'crack', usesysid, 't','t','crack' from pg_shadow where usename='postgres'; --

Si esto sucedi, entonces el script podra presentarle un acceso de super usuario al atacante. Ntese que 0; es para proveer un offset vlido a la consulta original y para finalizarla Note: Esta es una tcnica comn para forzar al analizador SQL a que ignore el resto de la consulta escrita por el desarrollador con dos guines: -- los cuales representan un comentario en SQL. Una forma factible de obtener contraseas es burlar las pginas de bsqueda de resultados. Lo nico que el atacante necesita hacer es ver si hay variables que hayan sido enviadas y sean usadas en declaraciones SQL las cuales no sean manejadas apropiadamente. Esos filtros pueden ser puestos comunmente en un formulario anterior para personalizar las clusulas WHERE, ORDER BY, LIMIT y OFFSET en las declaraciones SELECT. Si su base de datos soporta el constructor UNION, el atacante podra intentar aadir una consulta enetera a la consulta original para listar contraseas de una tabla arbitraria. Utilizar campos de contrasea encriptadoslds es fuertemente recomendado. Example #2 Listando nuestros artculos ... y algunas contraseas (de cualquier servidor de base de datos)
<?php $query = "SELECT id, name, inserted, size FROM products WHERE size = '$size' ORDER BY $order LIMIT $limit, $offset;"; $result = odbc_exec($conn, $query); ?>

La parte esttica de la consulta puede ser combinada con otra declaracin SELECT la cual revela todas las contraseas:
' union select '1', concat(uname||'-'||passwd) as name, '1971-01-01', '0' from usertable; --

Si esta consulta (ejecutndose con ' y --) fuera asignada a una de las variables utilizadas en $query, la consulta reaccionar bestialmente.

Fuente: http://www.php.net/manual/es/

Las consultas de actualizacin de SQL, tambin son susceptibles a ataques. Estas consultas tambin son amenazadas por acortamiento y adicin en una consulta completamente nueva a esta. Sin embargo el atacante podra manipularla con la clusula SET. En este caso, algunos esquemas de informacin deben ser procesados para manipular la consulta exitosamente. Este puede adquirirse examinando la forma de nombres de las variables, o simplemente forzarlo con un ataque de fuerza bruta. No hay muchas convenciones de nombres para campos que almacenan contraseas o nombres de usuarios. Example #3 Desde re-establecer una contrasea ... hasta ganar ms privilegios (en cualquier servidor de bases de datos)
<?php $query = "UPDATE usertable SET pwd='$pwd' WHERE uid='$uid';"; ?>

Pero un usuario malicioso podra enviar el valor con ' or uid like'%admin%'; -- hacia $uid para cambiar la contrasea del administrador, o simplemente cambiar $pwd a "hehehe', admin='yes', trusted=100 " (con un espacio al final) para ganar ms privilegios. Entonces la consulta ser cambiada as:
<?php // $uid == ' or uid like'%admin%'; -$query = "UPDATE usertable SET pwd='...' WHERE uid='' or uid like '%admin %'; --"; // $pwd == "hehehe', admin='yes', trusted=100 " $query = "UPDATE usertable SET pwd='hehehe', admin='yes', trusted=100 WHE RE ...;"; ?>

Un ejemplo horrible de cmo pueden ser accedidos los comandos a nivel de sistema operativo en algunos hospedadores de bases de datos. Example #4 Atacando el sistema operativo que hospeda la base de datos (Servidor MSSQL)
<?php $query = "SELECT * FROM products WHERE id LIKE '%$prod%'"; $result = mssql_query($query); ?>

Si un atacante enva el valor a%' exec master..xp_cmdshell 'net user test testpass /ADD' -- hacia $prod, la consulta $query ser:

Fuente: http://www.php.net/manual/es/

<?php $query = "SELECT * FROM products WHERE id LIKE '%a%' exec master..xp_cmdshell 'net user test testpass /ADD

'--"; $result = mssql_query($query); ?>

El servidor MSSQL ejecuta la sentencia SQL en el lote que incluye un comando para aadir un usuario nuevo a la base de datos de cuentas locales. Si esta aplicacin estuviera ejecutndose como sa, y el servicio MSSQLSERVER se est ejecutando con los privilegios suficientes, el atacante ahora podra tener una cuenta con la cual tendra acceso a esta mquina.

Note: Algunos de los ejemplos de citados arriba estan vinculados a un servidor de base de datos especfico. Esto no significa que un ataque similar sea imposible en contra de otros productos. Su servidor de base de datos podra ser vulnerable de forma similar en otra manera.
Tcnicas de evacin

Podra decir que el atacante debe poseer una procin de informacin sobre el esquema de la base de datos en la mayora de los ejemplos. Tienes razn, pero nunca sabe cuando y cmo esto pueda ser tomado, y si sucede, su base de datos podra ser expuesta. Si est usando una base de datos de fuente abierta, o un paquete disponible publicamente, el cual podra pertenecer a un sistema de manejo de contenido o un foro, los intrusos reproducen facilmente una copia de una porcin de su cdigo lo cual podra ser un riesgo de seguridad si esta est pobremente diseada. Esos ataques estn principalmente basados en explotar el cdigo que no ha sido escrito teniendo en mente la seguridad. Nunca confes en ningn tipo de entrada, especialmente la que viene del lado del cliente, an cuando esta venga de una caja de seleccin, un campo oculto o una cookie. El primer ejemplo muestra que una inofensiva consulta puede causar desastres.

Nunca se conecte como super usuario o como el propietario de la base de datos. Siempre utilice usuarios personalizados con privilegios muy limitados. Revise si la entrada proporcionada tiene el tipo de datos que se espera. PHP tiene un rango amplio de funciones para validar la entrada de datos, desde las ms simples encontradas en Funciones de variable y en Funciones de tipo Caracter (Ej. is_numeric(), ctype_digit() respectivamente) y siguiendo el apoyo con las Expresiones regulares compatibles con Perl.

Fuente: http://www.php.net/manual/es/

Si la expresin espera una entrada numrica, considere verificar los datos con la funcin is_numeric(), o silenciosamente cambie su tipo utilizando settype(), o use su representacin numrica por medio de sprintf(). Example #5 Una forma ms segura de redactar una consulta para paginacin
<?php settype($offset, 'integer'); $query = "SELECT id, name FROM products ORDER BY name LIMIT 20 OFFS ET $offset;"; // Fjese en %d en el formato de cadena, utilizar %s podra no tene r un resultado significativo $query = sprintf("SELECT id, name FROM products ORDER BY name LIMIT 20 OFFSET %d;", $offset); ?>

Encierre entre comillas cada valor no-numrico provisto por el usuario que sea pasado a la base de datos filtrado con la funcin de cadena especfica de la base de datos (Ej. mysql_real_escape_string(), sqlite_escape_string(), etc.). Si una funcin de escape (o de filtrado) de cadena especfica de la base de datos, o un mecanismo similar no est disponible, las funciones addslashes() y str_replace() podran ser tiles (dependiendo del tipo de la base de datos). Vea el primer ejemplo. Como lo muestra el ejemplo, agregar comillas a la parte esttica de la consulta no es suficiente, lo que hace que esta consulta sea facilmente vulnerada. No muestre ninguna informacin especfica de la base de datos, especialmente sobre el esquema, por su correcto significado es como jugar sucio contra usted mismo. Vea tambin Reporte de errores y Manejo de errores y funciones de registro. Podra utilizar procedimientos almacenados y previamente cursores definidos, para abstraer el acceso a datos para que los usuarios no tengan acceso directo a las tablas o vistas, para que esta solucin tenga otros impactos.

Junto a esto, usted se beneficia de tener un registro de las consultas ya sea dentro de su script o de la base de datos en si misma, si es que esta soporta el registro. Obviamente, llevar un registro no le previene cualquier intento de dao, pero ste puede ser til para hacer una retro revisin de cual aplicacin ha sido intervenida. El registro no es til por s mismo, pero lo es debido a la informacin que contiene. Ms detalles generalmente es mejor que los pocos.

Fuente: http://www.php.net/manual/es/

Como puede suponer, PHP no protege su base de datos por s mismo. Las siguientes secciones piensan ser una introduccin a lo ms bsico de cmo acceder y manipular base de datos dentro de scripts de PHP. Tenga en mente esta simple regla: Proteccin en profundidad. En la mayora de sitios tome la accin de incrementar la proteccin de su base de datos, para una menor probabilidad de que un atacante tenga xito en exponer o abusar de cualquier informacin que tenga almacenada. El buen diseo del esquema de la base de datos y de la aplicacin se ocupar de sus mayores temores.

Diseando la base de datos


El primer paso es siempre crear una base de datos, a menos que quiera utilizar una de terceras personas. Cuando una base de datos es creada, sta es asignada a un propietario, el que ha ejecutado la sentencia de creacin. Usualmente, slo el propietario (o un superusuario) puede hacer cualquier cosa con los objetos en esa base de datos, y para permitir a otros usuarios que puedan utilizarla, debe concederles privilegios. Las aplicaciones nunca deberan conectarse a la base de datos como su propietario o como superusuario, porque estos usuarios pueden ejecutar cualquier consulta a su antojo, por ejemplo, modificar el esquema (Ej., eliminar tablas) o borrar su contenido entero. Puede crear distintos usuarios de la base de datos para cada aspecto de su aplicacin con permisos muy limitados a los objetos. La mayora de privilegios que son requeridos deberan ser solamente otorgados, y as evitar que el mismo usuario pueda interactuar con la base de datos en diferentes casos y usos. Esto significa que si los intrusos ganan acceso a su base de datos utilizando las credenciales de la aplicacin, solamente afecta a los cambios que su aplicacin permita. Usted est encarecido a no implementar toda la lgica del negocio en la aplicacin web (Ej., sus scripts), en su lugar hgalo en el esquema de la base de datos utilizando vistas, disparadores o reglas. Si el sistema evoluciona, se pensar en abrir nuevos puertos a la base de datos, y usted tendr que re-implementar la lgica en cada base de datos del cliente por separado. Al respecto de lo antes citado, los disparadores pueden ser utilizados para manerjar campos transparentes y automticamente, lo cual a menudo provee un vistazo al interior cuando hay problemas de depuracin con su programa o con el sistema de seguimientos de transacciones de su aplicacin.

Conectndose a la base de datos


Puede ser que quiera establecer las conecciones sobre SSL para encriptar la comunicacin cliente/servidor para incrementar la seguridad, o tambin puede usar ssh para encriptar la conexin de red entre los clientes y el servidor de base de datos. Si alguno de stos es utilizado, el monitoreo de su trfico y la obtencin de informacin sobre su base de datos ser difcil para un posible atacante.

Fuente: http://www.php.net/manual/es/

Modelo de almacenamiento encriptado


SSL/SSH proteje los datos que viajan desde el cliente al servidor, SSL/SSH no proteje los datos persistentes almacenados en una base de datos. SSL es un protocolo para proteger los datos mientras viajan en el cable. Una vez un atacante gana acceso directamente a su base de datos (sobre pasando el servidor web), los datos sencibles podran ser divulgados o mal utilizados, a menos que la informacin est protegida en la base de datos por s misma. Encriptando los datos es una buena forma de mitigar esta amenaza, pero muy pocas bases de datos ofrecen este tipo de encripcin de datos. La forma ms fcil para trabajar en este problema, es crear primero su propio paquete de encripcin, y utilizarlo desde de sus scripts de PHP. PHP puede guiarle en esto con muchas extensiones, tales como Mcrypt y Mhash, cubriendo as, una amplia variedad de algoritmos de encripcin. El script encripta los datos antes de insertarlos dentro de la base de datos, y los desencripta cuando los devuelve. Vea las referencias para ejemplos adicionales de como funciona la encripcin. En caso de datos verdaderamente ocultos, si su flujo de representacin no es necesaria (p. ej. que no sea mostrada), el hashing podra ser tomado en consideracin. El ejemplo bien conocido para el hashing, es almacenando el hash MD5 de una contrasea en una base de datos, en lugar de almacenar la contrasea en s misma. Vea tambin las funciones crypt() y md5(). Example #1 Utilizando campos de contrasea con hash
<?php // Almacenando la contrasea con hash $query = sprintf("INSERT INTO users(name,pwd) VALUES('%s','%s');", pg_escape_string($username), md5($password)); $result = pg_query($connection, $query); // Consultando si el usuario envi la contrasea correcta $query = sprintf("SELECT 1 FROM users WHERE name='%s' AND pwd='%s';", pg_escape_string($username), md5($password)); $result = pg_query($connection, $query); if (pg_num_rows($result) > 0) { echo 'Bienvenido/a, $username!'; } else { echo 'La autenticacin ha fallado para $username.'; } ?>

Fuente: http://www.php.net/manual/es/

crypt
(PHP 4, PHP 5) crypt Hashing de una sola va de un string

Descripcin string crypt ( string $str [, string $salt ] )

crypt() devolver el hash de un string utilizando el algoritmo basado en DES estndar de Unix o algoritmos alternativos que puedan estar disponibles en el sistema. Algunos sistemas operativos soportan ms de un tipo de hash. De hecho, a veces el algoritmo estndar DES es sustitudo por un algoritmo basado en MD5. El tipo de hash se dispara mediante el argumento salt. Antes de 5.3, PHP determinara los algoritmos disponibles en el momento de la instalacin, basado en el crypt() del sistema. Si no se proporciona salt, PHP intentar auto-generar ya sea un salt estndar de dos caracteres (DES) o uno de doce caracteres (MD5), dependiendo de la disponibilidad del crypt() de MD5. PHP establece una constante llamada CRYPT_SALT_LENGTH la cual indica la mayor longitud vlida de salt permitida por los hash disponibles. El crypt() estndar basado en DES devuelve el salt como los primeros dos caracteres de la salida. Tambin utiliza solamente los primeros ocho caracteres de str, as que strings ms largos que inicien con los mismos ocho caracteres, generarn el mismo resultado (cuando se utiliza el mismo salt). En sistemas donde la funcin crypt() soporta mltiples tipos de hash, las siguientes contantes se establecen en 0 1 dependiendo de que si el tipo dado est disponible:
CRYPT_STD_DES - Hash estndar basado en DES con un salt de dos caracteres del

alfabeto "./0-9A-Za-z". Utilizar caracteres no vlidos en el salt causar que crypt() falle. CRYPT_EXT_DES - Hash extendido basado en DES. El "salt" es un string de 9 caracteres que consiste en un guin bajo seguido de 4 bytes del conteo de iteraciones y 4 bytes del salt. Estos estn codificados como caracteres imprimibles, 6 bits por caracter, por lo menos, el carcter significativo primero. Los valores del 0 al 63 son codificados como "./09A-Za-z". Utilizar caracteres no vlidos en el salt causar que crypt() falle. CRYPT_MD5 - Hash MD5 con un salt de doce caracteres comenzando con $1$ CRYPT_BLOWFISH - Hash Blowfish con un salt como sigue: "$2a$", un parmetro de costo de dos dgitos, "$" y 22 dgitos en base64 del alfabeto "./0-9A-Za-z". Utilizar caracteres fuera de este rango en el salt causar que crypt() devuelva un string de longitud cero. Los dos dgitos del parmetro de costo es el logaritmo en base-2 del conteo de iteracin para el algoritmetro hash subyacente basado en Blowfish y debe estar en el rango de 04-31, valores por fuera de este rango causarn que crypt() falle.

Fuente: http://www.php.net/manual/es/

CRYPT_SHA256 - Hash SHA-256 con un salt de diecisis caracteres prefijado con $5$. Si el

strig del salt inicia con 'rounds=<N>$', el valor numrico de N se utiliza para indicar cuantas veces el bucle del hash se debe ejecutar, muy similar al parmetro de costo en Blowfish. El nmero de rondas por defecto es 5000, hay un mnimo de 1000 y un mximo de 999,999,999. Cualquier seleccin de N por fuera de este rango ser truncada al lmite ms cercano. CRYPT_SHA512 - Hash SHA-512 con un salt de diecisis caracteres prefijado con $6$. Si el strig del salt inicia con 'rounds=<N>$', el valor numrico de N se utiliza para indicar cuantas veces el bucle del hash se debe ejecutar, muy similar al parmetro de costo en Blowfish. El nmero de rondas por defecto es 5000, hay un mnimo de 1000 y un mximo de 999,999,999. Cualquier seleccin de N por fuera de este rango ser truncada al lmite ms cercano.

Note: A partir de PHP 5.3.0, PHP contiene su propia implementacin y la utilizar si el sistema carece de soporte para uno o varios de los algoritmos.

Parmetros
str

El string para hacerle el hash.


salt

Un string opcional de salt para la base del hash. Si no se proporciona, el comportamiento se define por la aplicacin del algoritmo y puede conducir a resultados inesperados.

Valores devueltos

Devuelve un string con el hash o un string que es ms corto que 13 caracteres y que se garantiza que difiere del salt en caso de fallo.

Historial de cambios Versin 5.3.2 5.3.2 Descripcin Agregado el crypt SHA-256 y SHA-512 basado en la implementacin de Ulrich Drepper. Corregido el comportamiento de Blowfish sobre rondas no vlidas para devolver el string

Fuente: http://www.php.net/manual/es/

Versin

Descripcin "failure" ("*0" or "*1"), en lugar de caer al DES. PHP ahora contiene su propia implementacin de los algoritmos MD5, DES estndar, DES extendido y Blowfish y los utilizar si el sistema carece de soporte para uno o varios de los algoritmos.

5.3.0

Ejemplos

Example #1 crypt() examples


<?php $password = crypt('mypassword'); // deja que el salt se genera automtica mente /* Se deben pasar todos los resultados de crypt() como el salt para la co mparacin de una contrasea, para evitar problemas cuando diferentes algoritmos hash so n utilizados. (Como se dice arriba, el hash estndar basado en DES utiliza un salt de 2 caracteres, pero el hash basado en MD5 utiliza 12.) */ if (crypt($user_input, $password) == $password) { echo "Password verified!"; } ?>

Example #2 Using crypt() with htpasswd


<?php // Establece la contrasea $password = 'mypassword'; // Obtiene el hash, dejando que el salt sea generado be automticamente $hash = crypt($password); ?>

Example #3 Using crypt() with different hash types


<?php if (CRYPT_STD_DES == 1) { echo 'Standard DES: ' . crypt('rasmuslerdorf', 'rl') . "\n"; } if (CRYPT_EXT_DES == 1) { echo 'Extended DES: ' . crypt('rasmuslerdorf', '_J9..rasm') . "\n";

Fuente: http://www.php.net/manual/es/

} if (CRYPT_MD5 == 1) { echo 'MD5: ; }

' . crypt('rasmuslerdorf', '$1$rasmusle$') . "\n"

if (CRYPT_BLOWFISH == 1) { echo 'Blowfish: ' . crypt('rasmuslerdorf', '$2a$07$usesomesillyst ringforsalt$') . "\n"; } if (CRYPT_SHA256 == 1) { echo 'SHA256: ' . crypt('rasmuslerdorf', '$5$rounds=5000$usesomesillystringfo rsalt$') . "\n"; } if (CRYPT_SHA512 == 1) { echo 'SHA512: ' . crypt('rasmuslerdorf', '$6$rounds=5000$usesomesillystringfo rsalt$') . "\n"; } ?>

El resultado del ejemplo sera algo similar a:


Standard DES: rl.3StKT.4T8M Extended DES: _J9..rasmBYk8r9AiWNc MD5: $1$rasmusle$rISCgZzpwk3UhDidwXvin0 Blowfish: $2a$07$usesomesillystringfore2uDLvp1Ii2e./U9C8sBjqp8I90dH6hi SHA-256: $5$rounds=5000$usesomesillystri$KqJWpanXZHKq2BOB43TSaYhEWsQ1Lr5QNyPCDH/Tp .6 SHA-512: $6$rounds=5000$usesomesillystri$D4IrlXatmP7rx3P3InaxBeoomnAihCKRVQP22JZ6E Y47Wc6BkroIuUUBOov1i.S5KPgErtP/EN5mcO.ChWQW21

Notas

Note: No hay funcin de desencriptado, ya que crypt() utiliza un algoritmo de un solo sentido.

md5
(PHP 4, PHP 5)

Fuente: http://www.php.net/manual/es/

md5 Calcula el hash md5 de un string

Descripcin string md5 ( string $str [, bool $raw_output = false ] )

Calcula el hash MD5 de str utilizando el algoritmo de resumen de mensaje MD5 de RSA Data Security, Inc. y devuelve ese hash.

Parmetros
str

El string.
raw_output

Si se establece el raw_output opcional en TRUE, entonces el resumen md5 ser devuelto en formato binario sin tratar con una longitud de 16.

Valores devueltos

Devuelve el hash como un nmero hexadecimal de 32 caracteres.

Historial de cambios Versin 5.0.0 Descripcin Fue agregado el parmetro raw_output.

Ejemplos

Example #1 Ejemplo de md5()


<?php $str = 'apple'; if (md5($str) === '1f3870be274f6c49b3e31a0c6728957f') { echo "Would you like a green or red apple?"; } ?>

Fuente: http://www.php.net/manual/es/