Documente Academic
Documente Profesional
Documente Cultură
ALUMNO: HCTOR ESTIGARRIBIA PROF: ING. RUBEN GONZLEZ FACULTAD POLITCNICA UNVES 2010
Fuente: http://www.php.net/manual/es/
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
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.
Fuente: http://www.php.net/manual/es/
Fuente: http://www.php.net/manual/es/
crypt
(PHP 4, PHP 5) crypt Hashing de una sola va de un string
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
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
Fuente: http://www.php.net/manual/es/
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"; } ?>
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/
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
Ejemplos
Fuente: http://www.php.net/manual/es/