Está en la página 1de 3

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. Ejemplo #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 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. Nota: 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. Ejemplo #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'"; $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. 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. Ejemplo #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 ' or uid like'%admin% a $uid para cambiar la contrasea del administrador, o simplemente cambiar $pwd a hehehe', trusted=100, admin='yes para obtener ms privilegios. Entonces, la consulta sera cambiada:
<?php // $uid: ' or uid like '%admin% $query = "UPDATE usertable SET pwd='...' WHERE uid='' or uid like '%admin %';";

// $pwd: hehehe', trusted=100, admin='yes $query = "UPDATE usertable SET pwd='hehehe', trusted=100, admin='yes' WHE RE ...;"; ?>

Un ejemplo horrible de cmo pueden ser accedidos los comandos a nivel de sistema operativo en algunos hospedadores de bases de datos. Ejemplo #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:
<?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. Nota: 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.

También podría gustarte