Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

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

2,852 views

Published on

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

Published in: Internet
  • Be the first to comment

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/

×