Inyección SQL

Hacking

Conceptos

DB: Almacén de datos simples o estructurados.

Motor de DB: Programa que implementa acceso a data.

SQL: Lenguaje de consulta (para DB).

Conceptos

Inyección: Interceptar una transacción.

Transacción: Consulta (o grupo) hecha a una DB.

Tabla, columna, registro: Componentes de DB.

INTRODUCCIÓN A SQL

Manipulación: SELECT


      SELECT * FROM users;
    

INTRODUCCIÓN A SQL

Manipulación: INSERT


      INSERT INTO users VALUES ('bryanjhv', 'password');
    

INTRODUCCIÓN A SQL

Manipulación: UPDATE


      UPDATE users SET username = 'bryan' WHERE id = 1;
    

INTRODUCCIÓN A SQL

Manipulación: DELETE


      DELETE FROM users;
    

INTRODUCCIÓN A SQL

Filtrado: WHERE


      SELECT * FROM users WHERE id >= 5;
    

INTRODUCCIÓN A SQL

Filtrado: ORDER BY


      SELECT * FROM personas ORDER BY nombre;
    

INTRODUCCIÓN A SQL

Filtrado: LIMIT


      SELECT * FROM personas ORDER BY pago LIMIT 3;
    

INTRODUCCIÓN A SQL

Operadores: BETWEEN


      SELECT * FROM personas WHERE edad BETWEEN (18, 30);
    

INTRODUCCIÓN A SQL

Operadores: AND/OR


      SELECT * FROM users WHERE id >= 5 AND id <= 30;
    

MySQL

Motor de DB opensource, gratis. Muy usado con PHP.

Escenarios

Formularios

Se pide un usuario y se ingresa una consulta.

Escenarios

Concatenación

Al leer el usuario, se lo adjunta a la consulta.

Escenarios

No validación

El usuario contiene símbolos, o tiene 1000 caracteres.

Implicaciones

Obtener DB design

"Atar cabos" lleva a esto.

Implicaciones

Filtrado

Los muy conocidos "leaks", se filtra información.

Implicaciones

Desconfianza

¿Confiarías en un sitio si deja libre tus datos?

No los datos que piensas, los comunes.

Implicaciones

Data loss

Si puede ejecutar algo, ¿por qué no un ...?


        DELETE FROM payments;
      

Soluciones

Escapar caracteres

Una consulta no debe tener " o '.
Reemplazar " por \".

Soluciones

Validación

Un nombre de usuario debe:

  • Tener entre 6 y 30 caracteres.
  • Hacer match a [A-Za-z][A-Za-z0-9._]+.

Soluciones

Guards

Por cada consulta, preguntar si el usuario está autorizado.

Poner un campo oculto y verificarlo en cada petición.

Soluciones

Librerías

Éstas han pasado por esto y son mantenidas. Ejemplos para PHP:

  • illuminate/database
  • Zend ORM

Fin