Ir al contenido principal

SQL Inyección con PHP. PARTE III

Hablare en mis próxima entradas de un lenguaje que me viene gustando mucho PHP pero no quiero empezar sin antes hacer dos cosas, la primera es terminar el tutorial de Inyección PHP y la segunda mostrar la instalación de un servidor local en Debian Squeeze, después de estas dos entradas empezaremos a realizar un poco de ejercicios con PHP.
Pues bien empezaremos con la tercera parte de este pequeño tutorial, como vimos en la parte numero dos creamos el pequeño formulario, así que en esta tercera parte empezaremos a inyectar código sql.

Buscaremos el id numero 2 mostrándonos lo siguiente:


Nuestro paso siguiente es "suponer" que el formulario es propenso a una inyección sql, intentemos inyectando de la siguiente forma directamente en el cuadro de texto, 2 and 1=1 -- , como podemos darnos cuenta al ingresar la inyección anterior no cambia nada sigue mostrando como si solo colocáramos en el cuadro de texto un 2, esto se debe a que a demás del 2 contiene una condición que siempre se cumplira puesto que 1 siempre sera igual a 1.

Ahora comprobaremos si realmente es vulnerable a inyecciones sql ingresaremos una condición que nunca se cumple de esta forma, 2 and 1=0 -- ,  la condición nunca se cumplira por lo cual nunca regresara una respuesta esto nos abre el abanico para poder inyectar código sql.

Como ya vimos anteriormente nuestro formulario si es vulnerable a inyecciones sql, lo primero que obtendremos sera el numero de campos de nuestra tabla usuarios, para conocer el numero de columnas utilizaremos la sentencia ORDER BY de la sentencia SELECT, la idea es que cuando superemos el numero de columnas la sentencia devolverá un error fatal o en su defecto ningún dato después de hacer esa consulta, jugaremos de la siguiente forma, id=1 order by 1-- lo cual nos arroja lo siguiente.


Así jugamos hasta que nos produzca un error fatal la consulta o en su defecto no muestre ningún dato, esto es lo que pasa cuando llegamos al order by 5--.


Como se pueden dar cuenta ahora sabemos que la tabla usuario contiene 4 columnas, ahora proseguiremos a obtener información del servidor :P.

Debemos tener en cuenta que la sentencia select se ejecutan una a una por lo que nos valdremos de la sentencia UNION para realizar dos querys en el mismo campo de texto del formulario, para esto nos valdremos de el numero de columnas que ya obtuvimos en el paso anterior para comenzar a obtener información, jugaremos con la siguiente sentencia -1 union select 1,2,3,4 la cual nos arroja lo siguiente.
Que fue lo que hicimos, pues lo que hicimos es hacer un query que no devuelve nada puesto que no existe un usuario con id negativo y una segunda consulta con un 1, 2, 3 y 4, esto se realizo para ver en que posición muestran los datos de la consulta, podemos ver que el único numero que omite es el numero 3.
Ahora si empezaremos a sacar información del servidor con ayuda de varias funciones entre ellas:
user(): Devuelve el usuario de la base de datos.
version(): Devuelve la versión del servidor MySQL.
database(): Devuelve el nombre de la base de datos actual.
current_user(): Devuelve el nombre de usuario y el del host para el que está autenticada la conexión.
- last_insert_id(): Devuelve el último valor generado automáticamente que fue insertado en una columna AUTO_INCREMENT.
connection_id(): Devuelve el ID de una conexion.

Supongamos que queremos obtener el usuario, el nombre de la base de datos y el password de mysql basta con armarnos esta sentencia para lograrlo, -1 union select user(), database(), 3, password from mysql.user , obteniendo todos los datos siguientes:


Ahora solo es cuestión de que exploren ustedes mismo jugando con la inyección en nuestro ejemplo.

La verdad es que se ve sencillo pero si se indaga mas se pueden hacer muchas cosas tanto buenas como malas ya depende de cada persona, quise tocar este tema debido a que me encuentro programando aplicaciones en internet y quería informarles a los que me leen una forma en la que pueden comprometer seriamente nuestras bases ya que obteniendo los datos de acceso, tan solo basta que se conecten con nuestro server remotamente para que obtengan toda la información que quieran obtener.

Por ultimo no soy para nada experto solo expongo en la forma en que yo lo entendí esperando que les sirva la información aquí expuesta.



 

Comentarios

Entradas populares de este blog

Google Docs: Activar poder ver el salto de páginas de un documento.

Ya tengo mucho tiempo usando Google Docs, de hecho puedo decir que mis documentos ya no los hago mas en ninguna suite ofimática instalada en mi computadora, la verdad es que Google Docs es un magnifico servicio, no hablare de sus pros y contras lo que les quiero comentar es que POR FIN GoogleDocs tiene la vista de el salto de página algo que yo estaba esperando hace mucho, me desesperaba mucho que al escribir no veía cuando empezaba o terminaba una página. El modo de activarlo es el siguiente lo mostrare en imagenes con un documento mio para que se vea mejor en donde se debe de hacer click. Como se muestra en la imagen para activar el poder ver el salto de página se debe de elegir "Paginated" , al hacer click se vera el salto de pagina automáticamente en el documento abierto en ese momento, si no te gusta ver este salto de pagina basta con dar click de nuevo en "Compact"  para eliminar estos saltos, que seguirán ahí pero ya no de forma visible. De nuevo cualquier

Python: Insertar campos desde Mysql

Antes ya he hecho una entrada sobre Conexion entre Mysql-Python pues bien ahora veremos como insertar campos a una tabla desde consola, básicamente se crea el arhivo de la misma forma que en el ejemplo anterior, aquí anexo el código: import MySQLdb code =raw_input("Id:") name=raw_input("Nombre:") db=MySQLdb.connect(host='localhost',user='root',passwd='root',db='usuariospy') cursor=db.cursor() sql='INSERT INTO usuarios VALUES("%s","%s")'%(code,name) cursor.execute(sql) En el anterior código se ve claramente como primero importamos la librería Mysql que nos ayuda con la conexion a la base de datos, seguido de esto pedimos dos datos y los almacenamos en variables para después abrir la conexion con la base e insertar los datos ingresados por el usuario; como pueden ver algo muy sencillo pero útil. Espero les sirva puede ver como configurar y ejecutar su primer conexion entre python y msql en mi entr

Arduino, Instalación en Debian Squeeze Linux.

La semana pasada pedí una placa Arduino Uno R3 la cual me llego el pasado lunes 11 de junio, no había tenido la oportunidad siquiera de sacar la placa de la bolsita donde me llego, debido a que estamos en finales de semestre y entre tantos proyectos y exámenes que tuve no encontraba ese hueco para jugar un rato con ella; pero hoy al fin ya estoy saliendo de los pendientes, así que como ya no tengo tanta carga de trabajos decidí abrir el paquete en el que venía el Arduino, digo paquete porque pedí otras cosas pero esas las mostraré conforme vaya jugando mas con la placa.  Acá una foto del paquete que recibí, (disculpen la calidad de las imágenes). Empezaremos a instalar el software necesario para controlar nuestra placa Arduino, lo haré en Debian Squeeze, como nota para entendernos mejor, cuando aparezca el símbolo #  en los comandos esto quiere decir que son ejecutados con permisos de administrador root. Pero bueno basta de detalles empecemos con el trabajo. 1.- Instalar