Sql Injection: o que é, como detectar, e como evitar

1.815 visualizações

Publicada em

Uma breve explicação sobre SQL Injection: o que é, como evitar, e como detectar

Publicada em: Internet
0 comentários
3 gostaram
Estatísticas
Notas
  • Seja o primeiro a comentar

Sem downloads
Visualizações
Visualizações totais
1.815
No SlideShare
0
A partir de incorporações
0
Número de incorporações
13
Ações
Compartilhamentos
0
Downloads
60
Comentários
0
Gostaram
3
Incorporações 0
Nenhuma incorporação

Nenhuma nota no slide

Sql Injection: o que é, como detectar, e como evitar

  1. 1. SQL Injection: O que é, como detectar, e como evitar Versão 0.1.1
  2. 2. Conteúdo O que é SQL Injection Como detectar SQL Injection Evitando SQL Injection
  3. 3. Fábio Beneditto Usuário GNU/Linux desde 1999, Desenvolvedor Web desde 2008, trabalha com as linguagens de programação PHP e Javascript e atualmente se dedica ao estudo de Segurança da Informação. Cursa Sistemas para Internet na Universidade Feevale. fabio@altoscodigos.tk github.com/fabiobeneditto
  4. 4. Partindo do princípio...
  5. 5. Um simples formulário
  6. 6. Como o script (normalmente) recebe os dados $user = $_POST['user']; $pass = $_POST['password']; $query = "SELECT user,password FROM public.admin WHERE user = '$user' AND password = '$pass'"; $is_valid = pg_query($query); if($is_valid){ $ar_user = pg_fetch_row($is_valid); $_SESSION['user'] = $ar_user[0]; $_SESSION['pass'] = $ar_user[1]; header('location: ../php/home.php'); } else { header('location: ../php/error.php'); }
  7. 7. E onde está o erro?
  8. 8. OWASP Open Web Application Security Project O objetivo principal do OWASP Top 10 é educar desenvolvedores, projetistas, arquitetos, gestores e organizações sobre as consequências das mais importantes vulnerabilidades de segurança de aplicações web. Fonte: OWASP
  9. 9. OWASP Top 10 2013 A1: Injeção de código A2: Quebra de autenticação e Gerenciamento de Sessão A3: Cross-Site Scripting (XSS) A4: Referência Insegura e Direta a Objetos A5: Configuração Incorreta de Segurança A6: Exposição de Dados Sensíveis A7: Falta de Função para Controle do Nível de Acesso A8: Cross-Site Request Forgery (CSRF) A9: Utilização de Componentes Vulneráveis Conhecidos A10: Redirecionamentos e Encaminhamentos Inválidos Fonte: OWASP
  10. 10. A1: Injeção de Código As falhas de Injeção, tais como injeção de SQL, de SO (Sistema Operacional) e de LDAP, ocorrem quando dados não confiavéis são enviados para um interpretador como parte de um comando ou consulta. Os dados manipulados pelo atacante podem iludir o interpretador para que este execute comandos indesejados ou permita o acesso a dados não autorizados.
  11. 11. Como assim?
  12. 12. Lembra de nosso formulário? E se ao invés de colocar... ...enviássemos assim:
  13. 13. O que acontece?
  14. 14. Nossa consulta que recebia $user = $_POST['user']; $pass = $_POST['password']; $query = "SELECT user,password FROM public.admin WHERE user = '$user' AND password = '$pass'"; na primeira situação, se torna $query = "SELECT user,password FROM public.admin WHERE user = 'fabio@altoscodigos.tk' AND password = 'dunno'"; mas, na segunda, se torna... $query = "SELECT user,password FROM public.admin WHERE user = '1' OR '1=1' AND password = 'dunno'";
  15. 15. Mas, o que isso significa?
  16. 16. Que você é um alvo em potencial: Fonte: Zone-H
  17. 17. E como evitar?
  18. 18. Boas práticas Sanitização de parâmetros Uso de prepared statements
  19. 19. Sanitização de Parâmetros Com MySQL e PHP: $user = mysql_real_escape_string($_POST['user']); $pass = mysql_real_escape_string($_POST['password']); ...passaria a receber... $query = "SELECT user,password FROM public.admin WHERE user = '1 ' or '1=1' AND password = 'dunno'"; Com PostgreSQL e PHP, pode-se utilizar $user = pg_escape_string($_POST['user']);
  20. 20. Ainda não é a solução ideal
  21. 21. Prepared Statements São consultas pré-prontas. A diferença é que em lugar das variáveis você coloca um placeholder (marcador de lugar) e na hora da consulta informa a ordem das variáveis a serem substituidas.
  22. 22. Uso de prepared statements Com PostgreSQL e PHP: $user = $_POST['user']; $pass = $_POST['password']; $query = pg_query_params($dbconn, "SELECT user,password FROM public.admin WHERE user = $1 AND password = $2", array($user,$pass)); que vai nos retornar $query = "SELECT user,password FROM public.admin WHERE user = '1 ' or '1=1' AND password = 'dunno'"; Fonte: PHP.net
  23. 23. ...e como detectar?
  24. 24. sqlmap Fonte: sqlmap.org
  25. 25. O que é sqlmap? É uma ferramenta Open Source para pentests que: automatiza processo de detecção e exploração de falhas de SQL Injection, e expõe os dados do DB do servidor Fonte: sqlmap.org
  26. 26. Dentre suas muitas features Suporte COMPLETO a seis técnicas de SQL injection: boolean-based blind time-based blind error-based UNION query-based stacked queries out-of-band.
  27. 27. Principal forma de uso Através de URLs do tipo $_GET[]: $ python sqlmap.py -u "http://target/vuln.php?id=1" --batch
  28. 28. ...e não é só!
  29. 29. O que mais pode ser feito: Download e upload de qualquer arquivo Executar comandos arbitrários e receber seus retornos através do Banco de Dados, quando o SGBD for MySQL, PostgreSQL ou Microsoft SQL Server
  30. 30. Ou seja:
  31. 31. Não é só PHP que está mais vulnerável. Todas as linguagens que não estiverem sanitizando suas entradas correm o mesmo risco. Fonte: XKCD
  32. 32. ? Perguntas Comentários
  33. 33. Créditos da apresentação por Fábio Beneditto fabio@altoscodigos.tk github.com/fabiobeneditto powered by: reveal.js http://lab.hakim.se/reveal-js/

×