De artificios y otros cuentos en Sql inyeccion by _84kur10_

Started by _84kur10_, 29 de March , 2010, 03:39:20 PM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

_84kur10_


De artificios y otros cuentos en  Sql inyeccion by _84kur10_


0x01 Sql Inyeccion


Primero que nada, pues conocer a que se le denomina inyeccion: es aquel codigo malicioso que es mezclado con una setencia sql normal, con el fin de alterar la intencion  normal de la setencia sql, y lograr un efecto diferente. dicho efecto pues simplemente consultar algun dato especial, o insertar algun dato especial, inyectar un archivo etc.

0x02 Introduccion

Para este articulo voy a suponer que quien lo lea tiene un concepto basico de lo que es inyeccion sql, y que al menos sabe inyectar en una situacion normal. Bueno la idea es contar alguna experiencias creando inyecciones sql, en diferentes contextos, y analizando dichas situaciones para verificar algunas posibles variantes.


Cierto dia, necesitaba entrar a un sitio web, ya que en ese servidor se encontraba una web objetivo, no necesariamente para defacear, simplemente objetivo. Bueno pues haciendo un reverse di con una web que tenia el tipico sql inyeccion, construi la inyeccion
resulto ser algo como :
+union+select+1,user,password,4,5,6,7,8,9,10+from+usuario+limit+5,1

bueno y me tiro un el user y el hash asi

edwinc:13dd3a9725dba7a9


hasta ahi, todo normal, lo malo era que no tenia un crackeador ni el dic a mano para crackear ese tipo de hash, asi que  fui al panel del administrador
ensaye un usuario slkdjfljdsf, y el resultado fue decia que el usuario no existia.

bien despues meti el usuario edwinc, y me decia que el pass no era el correcto, por lo cual, era muy probable que la consulta del logueo estubiera en sentencias sql diferentes, intente sin analizar el tipico ' or 1=1 --, pero no funciono, sinembargo me arrojo algunos errores de sql.

entre las cosas que vi en el error, se veia que la consulta que intentaban hacer internamente era:
select password('passdigitado') as cryptado

osea que posteriormente me supuse que el parametro crytado esta consultado, y comparado posiblemente con lo arrojado en la primera consulta que solo verificaba el usuarios. Como asi? pues bien meti una ' en el login para que me arrojara el error de la primera consulta y efectivamente hacian algo como

select * from usuarios where user ='usuariodigitado'

con lo que mi hipotesis, se volvio mas probable

asi que simplemente lo que debia hacer era colocar en el parametro crytado el valor del hash del usuario que puse en el logueo: asi que el bypass me vino quedando asi

login:        edwinc
password: aku'),'13dd3a9725dba7a9' as cryptado /*


tambien es importante aclarar el conocer cual comentario es el q realmente funciona para el bypass, para mi es parte fundamental, lo que yo regularmente hago para darme cuenta de esto es, primero meter un ' para verificar que tire error, despues probar '' para probar q podemos cerrar comillas, y despues probar

/* '
-- '
# '



sabremos q nos sirve, porq no tirara el error q salio cuando colocamos ' de esta manera sabremos cual comentario debemos tener en cuenta para bypassear.




y happy hacking  :D....


Tal vez esta idea. pueda aplicarse a tipos de autenticacion que usan 2 setencias sql para el logueo, y que tiene sql  inyeccion, y ademas damos con un pass poco comun. Aunque en este caso se trato sobre un cotexto muy especifico, tal vez existan simulitudes en otras aplicaciones.


0x03 El peligro de usar inadecuadamente like

Bueno pues esto sucedio con una aplicacion web, jsf + oracle se traba que durante el logueo se consultaba usando la funcion like , como muchos sabran like es usado para busquedas de palabras, pero no para comparaciones exactas, con lo cual sabemos que enviando un % se hara la consulta de forma general, basicamente es un comodin, por lo cual si una aplicacion realiza autenticaciones de tipo:


<?php
$query
="select * from usuarios where login like('".$_POST['login']."') and password like('".$_GET['password'].'"");

//si la consulta viene  llena pasa
?>



podremos bypassearla simplemente enviando % tanto en el login como en el password, o si necesita de un usuario valido seria cuestion de tener el usuario valido y mandar de password %.

por otro lado, si necesitamos conocer los datos de autenticacion correectos, y el logueo no tiene en cuenta el numero de intentos, podemos realizar busqdas generalizadas para dar con los datos

preguntamos asi:

hay un login q contenga la letra a?

login: %a%
password:%


si si, pasa, si no, no loguea

hay un login q contenga  ac?
login: %ac%
password:%


hay un login q contenga la letra ad?

login: %ad%
password:%

y asi... se podria codear una exploit para que aproveche ese bug y encuentre los datos correctos, dado el caso de que necesitemos los datos correctos para probar quizas en el ftp o en el email.


Otro Bypass.


Bueno, el otro dia me encontre con otro sistema que tambien tenia un login bypasseable. cuando usaba ' en el login me tiraba un error, cuando metia ' en el password y el login lo dejaba normal, pues no tiraba error, asi que uno supone que el login esta dentro de la sentencia sql pero el password no. Por tanto supuse que hacian un especie de


$result=query(select id, name, password from usuarios where login='$login')

if ($password=$result[3])



una vez me imagine eso el bypass me quedo

login:logininexistebte' union select 1,2,3 3 #

y probe con password 1 con 2 y 3, y pues en este caso obviamente era el 3.

es importante que el logininexistente realmente no exista en la tabala usuarios para que la consulta
nos devuelta el resulta del segundo select.


weno y por ultimo dejo un tema a nivel de informativo

0x04 Stacked Query Advance (Informacion)

EL otro dia estube leyendo algunos documentos que me encontre sobre inyeccion sql, asi que decidi pues simpleme redactar a mi estilo la informacion que ido leyendo, ademas de que ya estaba cansado de ver la repeticion de siempre los mismos estilos de tutoriales sobre inyeccion sql (no digo que esten mal), para nada , de hecho debo decir que he visto varios tutoriales de sql inyeccion muy buenos, y pues gracias a los tutos es que tambien he aprendido un poco de esta tecnica, he leido algunos documentos de la ultima conferencia de blackhat, que por cierto son muy buenas, se las recomiendo, se ven cosas muy interesantes.

0x05 ?Que es Stacked Query?

Se le denomina Stacked Query a aquel hilo de conexion a la Base de Datos que permite ejecutar mas de una setencia sql al tiempo, como algunos sabran el simbolo que determina donde inicia y donde empieza una setencia sql, sobre cualquier motor de base de datos es el ;, cuando logramos inyectar mas de una setencia sql al tiempo, es a lo que se de denomina Stacked Query.

Ejemplo:
select * from recaudo;drop table recaudo

En este ejemplo tenemos 2 setencias sql, segun lo que he leido cuando se intenta aplicar un query de este tipo sobre aplicaciones desarrolladas sobre php y mysql , este envia un mensaje de error, aunque el motor de base de datos como tal soporta esta setencia, para que una aplicacion soporte ataques basados en Stacked Query es necesario (Segun lo descubierto por algunos integrantes de BlackHat) es necesario tener habilitada la libreria MySQL UDF (User Define Function)


espero les agrade.