Mostrando entradas con la etiqueta SQL. Mostrar todas las entradas
Mostrando entradas con la etiqueta SQL. Mostrar todas las entradas

jueves, 2 de junio de 2011

Debian Squeeze: Instalación de Servidor Local Apache, Php, Mysql, Phpmyadmin

Ayer termine el Minitutorial de Inyecciones SQL, ahora mostrare como instalar un servidor local que nos ayudara con los ejercicios que empezaremos a desarrollar mas adelante con PHP así que pues manos a la obra.

Mostrare la instalación paso a paso en Debian Squeeze, la instalación no debería de ser muy diferente en Ubuntu, lo primero que haremos es actualizar nuestros repositorios seguido de esto instalaremos nuestros servidor apache2 de la siguiente manera.

  • # apt-get install apache2
Al terminar la instalación nos dirigimos a nuestro navegador y tecleamos lo siguiente.
  • http://localhost
Al dar enter en teoría debería de mostrar una pagina mas o menos como la siguiente, cabe mencionar que la pagina index.html se encuentra alojada en /var/www , por lo que todos nuestros proyectos deberían ir en esta carpeta.

Ahora instalaremos php5, tecleamos lo siguiente.
  • # apt-get install php5
Para probar que php5 esta instalando y corriendo debemos hacer dos cosas la primera es crear un archivo en /var/www/info.php que contenga el siguiente código.
< php
    phpinfo();
?>
Y la segunda cosa que necesitamos hacer es reiniciar nuestro servidor con la siguiente
instrucción.
  • /etc/init.d/apache2 restart
Ahora teclearemos en nuestro navegador lo siguiente.
  • http://localhost/info.php
Lo cual nos mostrara una imagen mas o menos como la siguiente.

Ahora instalaremos nuestro Gestor de Bases De Datos Mysql de la siguiente manera.
  • #apt-get install mysql-server
Durante el proceso de instalación se nos pedirá la contraseña de superusuario de Mysql es 
importante recordarlo bien, al finalizar la instalación reiniciaremos nuestro servidor Apache.
  • /etc/init.d/apache2 restart
Ahora ya podemos crear bases desde la consola, personalmente me gusta hacerlo así pero 
cuando se trata de tablas largas y complejas prefiero hacerlo visual, debido a esto instalaremos phpmyadmin, seguramente muchos ya saben que es un completo gestor visual de mysql, lo 
instalamos de la siguiente manera.
  • # apt-get install phpmyadmin
Durante la instalación se nos pedirán varios datos el primero de ellos es que servidor usaremos
a lo cual marcaremos obviamente apache2 después se nos pedirá si queremos crear una 
base de datos en ese cuadro de dialogo escogemos que si, por ultimo se nos pide el 
password de mysql, así que tecleamos el que ingresamos durante la instalación de mysql en 
pasos anteriores.
En varios post y tutoriales en los que me apoye se limitaban a solo decirnos que para echar a 
andar el phpmyadmin ingresáramos a http://localhost/phpmyadmin y al hacerlo siempre me 
regresaba que la pagina no existía o errores de ese tipo, por lo que para terminar la instalación
correcta de phpmyadmin se debe de editar el siguiente archivo como se muestra a 
continuación.
Editaremos el archivo /etc/apache2/apache2.conf después de abrirlo nos vamos hasta abajo
del archivo cuidado no tocar nada mas e incluiremos la siguiente linea.
  • Include /etc/phpmyadmin/apache.conf
Ahora tecleamos en la barra de direcciones http://localhost/phpmyadmin y mostrara una pagina como esta.
Ahora si ya tenemos listo nuestro server no les queda mas remedio que empezar a jugar un 
rato por ustedes mismos para que así se vallan acostumbrando al proceso de instalación y 
desarrollo de aplicaciones.
Soy Hiram Zuñiga y agradezco sus comentarios.

miércoles, 1 de junio de 2011

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.



 

lunes, 21 de marzo de 2011

SQL Inyección con PHP. PARTE II

Continuando con lo anterior en el que vimos una pequeña introducción a la Inyección SQL, creo que para mostrar la inyección sql es mejor si nos hacemos un ejemplo practico verdad, pues bien manos a la obra.

Mi ejemplo practico esta hecho en:
SO: Linux Debian Squeeze
Mysql:  5.1
PHP: 5.3
Apache
Editor PHP Bluefish
Navegador Chromium




Crearemos una base de datos inyección de esta manera:
mysql&gt; create database inyeccion;
Usamos nuestra base de datos:
mysql&gt;use inyeccion
Creamos una tabla usuario con 4 campos, id, login , password, email
mysql&gt;create table usuario(id int primary key auto_increment, login varchar(30), password(50), email varchar(50));
Agregamos datos a la tabla:
Insert into usuario values(null,"Hiram","passw_hiram","email_hiram"),
(null,"Edgar","passw_edgar","email_edgar"),
(null,"Luis","passw_luis","email_luis"),
(null,"Isai","passw_isai","email_isai");
Ahora ya tenemos nuestra base de datos, lo que prosigue es hacer un script en php para hacer nuestras pruebas, abrimos nuestro editor php, yo les recomiendo esté, o usen el que mas les acomode o guste.

El script php se llamara inyecciones.php, contendrá un campo de texto(input) para poder hacer nuestros ejemplos de inyecciones, y un botón para enviar el valor.

&lt;html&gt;
&lt;head&gt;
  &lt;title&gt;SQL Injection&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;

  &lt;form action="inyecciones.php" method="get"&gt;
     &lt;label for="id"&gt;ID: &lt;/label&gt;
     &lt;input type="text" id="id" name="id" /&gt;
     &lt;input type="submit" value="Iniciar" /&gt;
  &lt;/form&gt;

&lt;?php
if( isset($_GET['id']) )
{
  $id    = $_GET['id'];

  $mysqli = new mysqli('localhost', 'root', '');

  $mysqli-&gt;select_db('inyeccion');

  $consulta = 'SELECT * FROM usuario WHERE id='.$id;

  echo $consulta.'&lt;br /&gt;';

  $resultado = $mysqli-&gt;query($consulta);

  $usuario = $resultado-&gt;fetch_row();
  echo 'DATOS DEL USUARIO: &lt;br /&gt;';
  echo 'ID: '.$usuario[0].'&lt;br /&gt;';
  echo 'LOGIN: '.$usuario[1].'&lt;br /&gt;';
  echo 'EMAIL: '.$usuario[3].'&lt;br /&gt;';

  $resultado-&gt;free();

  $mysqli-&gt;close();
}
?&gt;
&lt;/body&gt;
&lt;/html&gt;

Seguido de esto ejecutamos el script en el navegador, se mostrara de esta forma:


Podemos jugar un poco con el formulario ingresando el id que queremos buscar, en la próxima entrada empezaremos a "inyectar" código sql, así que tienen tiempo de hacer la base y el script anterior para empezar a probar el ejemplo.

jueves, 17 de marzo de 2011

SQL Inyección con PHP. PARTE I

Hoy estaba testeando una aplicación que estoy desarrollando; ya saben, la típica que la interfaz esta hecha para todo menos para que el usuario de click en donde nunca jamas debe de dar click simplemente por que no es obvio no es razonable no es intuitivo, pero el usuario hace el click y truena el sistema, la verdad esto es molesto pero muy necesario hacer este tipo de pruebas para que cuando liberes tu aplicacion tenga lo menos posible de errores o caídas,.

Este fin de semana platique con mi cuñada y le mostré mi aplicación le pedi de favor que interactuara con ella y al cabo de tiempo me dice "que pasa si en lugar de guardar todos dejo este sin seleccionar" increíblemente no había pensado en eso, estaba tan preocupado por otros aspectos que no había colocado una validación en los campos de un formulario; seguido de esto me fui a mi casa y estuve pensando que así como deje de hacer esa validacion sencilla de campos deberían de existir mas bugs en mi aplicacion, de esta forma supe que necesitaba poner atención.






Navegando con el buen amigo Google y buscando vulnerabilidades de PHP+Mysql, me encontré con la Inyeccion SQL, pero ¿que es eso?, según Wikipedia:
Inyección SQL es un método de infiltración de código intruso que se vale de una vulnerabilidad informática presente en una aplicación en el nivel de validación de las entradas para realizar consultas a una base de datos.
En pocas palabras, la inyeccion SQL es como su nombre lo dice una inyección de código sql en una consulta previamente definida, casi siempre con el objeto de tomar información de una base de datos llegando a conseguir un user y un password para poder manipular totalmente una base de datos, para los que entienden un poco de esto habrán pensado que es realmente delicado, si nuestra aplicacion maneja información sensible para la empresa en donde se esta desarrollando es sumamente importante dotar de mayor seguridad a nuestras aplicaciones, tratare de explicar como entiendo lo que es la inyección sql a continuación un ejemplo; Supongamos que tenemos una url así:

http://mipagina.com/viewrentas.php?iden=2

Ahora bien necesitamos observar bien la url, en ella nos muestra información importante de como podría estar haciendo el programador la consulta a la base de datos llegando al siguiente query:

$sql = 'SELECT * FROM clientes
WHERE personas.id = '.$_GET['iden'];


La query anterior selecciona todos los campos de la tabla clientes donde id de los clientes sea igual a 2(esto segun nuestra url). La consulta anterior es claramente vulnerable a inyecciones SQL, ¿Por que?, eso lo tratare de explicar en mi próxima entrada.


SQL Inyección con PHP. PARTE II