Explorar el Código

initial commit

hroman9 hace 8 años
padre
commit
6bf7cbfcae
Se han modificado 3 ficheros con 89 adiciones y 0 borrados
  1. 1
    0
      README.md
  2. BIN
      injection.jpg
  3. 88
    0
      untitled

+ 1
- 0
README.md Ver fichero

@@ -1,4 +1,5 @@
1 1
 # SQL Injection: Rompiendo Autenticación
2
+<img src='http://msblackhat.com/wp-content/uploads/2016/11/sql-injection-example-2016-h8oapmul-900x400.jpg'>
2 3
 ### Introducción
3 4
 En esta experiencia de laboratorio estaremos estudiando la inyección de SQL. La inyección de SQL es un método por el cual la data de una base de datos es alterada, borrada o robada con intenciones maliciosas por medio de la inserción de código SQL en una aplicación insegura. Cuando escucha en las noticias que la data de alguna compañía fue comprometida por un ataque cibernético, lo más probable significa que una o más de sus bases de datos fueron comprometidas por medio de una inyección de SQL. Cada vez se hace más difícil llevar a cabo este tipo de ataque dado que las librerías de programación que se usan para conectar con las bases de datos, cada vez implementan mejores métodos de seguridad para llevar a cabo transacciones con bases de datos. De todas maneras cuando se diseña una aplicación que hace uso de una base de datos, es necesario hacer validación de la entrada, como también asegurarse que se hace uso de la librería de conneción a la base de datos de la manera más segura posible, lo que significa desabilitar el uso de múltiples queries y usar queries parametrizados (queries preparados). En esta experiencia de laboratorio se va a demostrar como una aplicación de web insegura puede ser explotada usando inyección de SQL.  Se utiliza Flask para servir las páginas web en este laboratorio . La base de datos que se utiliza es MySQL server.
4 5
 ### Setup Pre Laboratorio

BIN
injection.jpg Ver fichero


+ 88
- 0
untitled Ver fichero

@@ -0,0 +1,88 @@
1
+# SQL Injection: Rompiendo Autenticación
2
+
3
+<img src='http://msblackhat.com/wp-content/uploads/2016/11/sql-injection-example-2016-h8oapmul-900x400.jpg'>
4
+### Introducción
5
+En esta experiencia de laboratorio estaremos estudiando la inyección de SQL. La inyección de SQL es un método por el cual la data de una base de datos es alterada, borrada o robada con intenciones maliciosas por medio de la inserción de código SQL en una aplicación insegura. Cuando escucha en las noticias que la data de alguna compañía fue comprometida por un ataque cibernético, lo más probable significa que una o más de sus bases de datos fueron comprometidas por medio de una inyección de SQL. Cada vez se hace más difícil llevar a cabo este tipo de ataque dado que las librerías de programación que se usan para conectar con las bases de datos, cada vez implementan mejores métodos de seguridad para llevar a cabo transacciones con bases de datos. De todas maneras cuando se diseña una aplicación que hace uso de una base de datos, es necesario hacer validación de la entrada, como también asegurarse que se hace uso de la librería de conneción a la base de datos de la manera más segura posible, lo que significa desabilitar el uso de múltiples queries y usar queries parametrizados (queries preparados). En esta experiencia de laboratorio se va a demostrar como una aplicación de web insegura puede ser explotada usando inyección de SQL.  Se utiliza Flask para servir las páginas web en este laboratorio . La base de datos que se utiliza es MySQL server.
6
+### Setup Pre Laboratorio
7
+
8
+1. Necesita tener el interpretador de Python instalado en su computadora.  
9
+
10
+2. Flask necesita ser instalado. Refiérase a estas [instrucciones](http://flask.pocoo.org/docs/0.11/installation/).  
11
+
12
+3. Un servidor de MySQL necesita estar corriendo en su computadora. Necesita correr el servidor como el usuario **root**, la contraseña para el usuario root debe ser **python1234**, también necesita crear una base de datos llamada **sqlinjection** . Refiérase a estas [instrucciones](http://dev.mysql.com/doc/mysql-getting-started/en/#mysql-getting-started-installing) para la instalación.  
13
+
14
+4. Descarge el código fuente de este laboratorio.  
15
+
16
+
17
+### Parte I
18
+
19
+En esta parte estaremos demostrando algunas inyecciones utilizando una simple aplicación web que sirve para hacer búsqueda en una guía de teléfono.(con los nombre de algunos científicos de cómputos famosos)
20
+
21
+###### Instrucciones
22
+
23
+1. Localice el lugar donde almaceno el código fuente. Luego de asegurarse de tener Flask instalado al igual que el servidor de MySL con los parámetros requeridos, localice archivo de python **sqlgen1.py** y ejecute este script. El script preparará la base de datos para la primera parte de este laboratorio.  
24
+
25
+2. Ahora localice el archivo de python **sql.py** y ejecute este script. Este es el script que ejecuta la aplicación web para este laboratorio. Este script debe mantenerse corriendo por el resto de este laboratorio.  
26
+
27
+3. Vaya a su browser e ingrese **localhost:5000/phone** en la barra de URL. Esta es la aplicación de la guía de teléfono. Localhost significa que este pidiendo un documento que esta siendo servido en la misma computadora donde corre el browser y 5000 es el puerto default donde Flask sirve los documentos html.  
28
+
29
+4. Ingrese **Ada** en la caja de texto y presione **Search** para verificar como funciona la búsqueda.  
30
+
31
+5. En el paso anterior vio como pudo encontrar entradas que fueran igual al string ingresado en la caja de texto. En este paso utilizará una inyección de SQL para poder desplegar todas las entradas en la guía a la vez. El query que utiliza la aplicación web para buscar en la base de datos se contruye de la siguiente forma:  
32
+
33
+    
34
+        query = "select * from phonebook where name = '"  
35
+        query += name  
36
+        query += "';"
37
+
38
+    La variable **name** que la aplicación añade al string del query, corresponde a la entrada del usuario de la caja de texto. Como esta es una aplicación insegura donde no se hace validación de la entrada del usuario, el string del query se enviaba con cualquier inyección para interpretación en la base de datos. Ahora usara una inyección para mostrar todas las entradas de la base de datos a la a vez. Ingrese el string que sigue y pulse **Search**:  
39
+
40
+
41
+        randomText' or 1=1; --
42
+
43
+    **IMPORTANTE: Debe incluir un espacio después del doble guión.**  
44
+
45
+    Note que el string que se construye es **select * from phonebook where name = 'randomText' or 1=1;  --**
46
+    Note que esta añadiendo la condición 1=1 que hará que el query sea válido para cualquier fila en la tabla, por lo tanto todas las entradas se desplegarán en la página. **Tome un screenshot con todas las entradas.**  
47
+
48
+6. En este paso utilizará una inyección para borrar una entrada de la guía.(la entrada que usted quiera). Luego de borrar la entrada, muestre la guía completa de nuevo como hizo en el paso anterior y **tome un screenshot**. El string para la inyección debe lucir así:  
49
+
50
+    ```
51
+    randomText'; DELETE FROM phonebook where name = "chosenName"; --
52
+    ```  
53
+
54
+7. En este paso usted hará una inyección para borrar el contenido completo de la guía. Luego de borrar la guía usará una inyección para insertar dos estradas de su preferencia a la guía. Luego de hacer las inserciones **tome un screenshot**. Aquí están los strings de inyección que debe usar:  
55
+
56
+    
57
+        randomText'; DELETE FROM phonebook; --
58
+        randomText'; INSERT INTO phonebook (name, phone) VALUES ("someName", "123-456-7890"); --
59
+    
60
+    
61
+### Parte 2
62
+##### Instrucciones
63
+En esta parte romperá la autenticación de una muy simple e insegura aplicación web. El simple método de autenticación consiste en verificar si la combinación de nombre de usuario y contraseña está en la tabla de autenticación de la base de datos.
64
+
65
+1. En al código fuente, ejecute el script de python **sqlgen2.py** para preparar la base de datos para este ejercicio.  
66
+
67
+2. Navegue en su browser a **localhost:5000/auth**  
68
+
69
+3. En la primera parte del laboratorio se le proveyó el nombre de las tablas y las columnas que iba a alterar. En la vida real esta información es desconocida para un potencial atacante. Su tarea es determianr el nombre de la tabla de autenticacion en la base de datos por medio de verificar los mensajes de error en la aplicación al tratar de hacer una inyección con un nombre potencial para la tabla. Utilize la siguiente inyección, cambiando la palabra **tableName** por una de las siguientes: (authtentication , login) **tome screenshot** de ambos intentos y determine el nombre de la tabla.  
70
+
71
+    ```
72
+    randomText' select * from tableName; --
73
+    ```  
74
+
75
+4. En el siguiente paso su tarea es determinar los nombres de las columnas en la tabla de autenticación de la cual usted determinó el nombre en el paso anterior. Utilizará las siguientes 4 palabras (userid , password, username, passphrase) con la siguiente inyección para determinar los nombres correctos de las columnas. Permita que los errores le dejen saber los nombres correctos de las columnas y **tome a screenshot** de sus intentos.  
76
+
77
+    ```
78
+    randomText'; INSERT INTO tableNameStep2 (guessColumnName, guessColumnName) VALUES ("someValue", "someValue"); --
79
+    ```  
80
+
81
+5. Los aplicaciones web almacenan las contraseñas como hashes en las bases de datos. En el caso de este laboratorio, la contraseña se almacena como un hash de md5. Esta será su tarea final. Su meta debe ser poder autenticarse como el usuario **dbadmin** de la base de datos. Para lograr esto necesita hacer lo siguiente:
82
+    * Computar el md5 hash de algun string.
83
+    * Usar una inyección para modificar el hash en la base de datos de este usuario por el que usted computó.
84
+    * Autentíquese usando como username **dbadmin** y como contraseña el string al que le computó el hash usted. (La aplicación web hace hash al string que se ingrese en el campo de la contraseña)
85
+    * Luego de autenticar como **dbadmin** tome un screenshot de la página web y anote la inyección que utilizó.
86
+
87
+### Entregables
88
+> Entregue un documento PDF que inluya los screenshots que tomó y todas las inyecciones de codigo que utilizó.