sql injection: o que é, como detectar, e como evitar
DESCRIPTION
Uma breve explicação sobre SQL Injection: o que é, como evitar, e como detectarTRANSCRIPT
![Page 1: Sql Injection: o que é, como detectar, e como evitar](https://reader033.vdocuments.mx/reader033/viewer/2022060121/5594297a1a28abb45a8b45da/html5/thumbnails/1.jpg)
SQL Injection:O que é, como detectar, e
como evitarVersão 0.1.1
![Page 2: Sql Injection: o que é, como detectar, e como evitar](https://reader033.vdocuments.mx/reader033/viewer/2022060121/5594297a1a28abb45a8b45da/html5/thumbnails/2.jpg)
ConteúdoO que é SQL InjectionComo detectar SQL InjectionEvitando SQL Injection
![Page 3: Sql Injection: o que é, como detectar, e como evitar](https://reader033.vdocuments.mx/reader033/viewer/2022060121/5594297a1a28abb45a8b45da/html5/thumbnails/3.jpg)
Fábio BenedittoUsuário GNU/Linux desde 1999, Desenvolvedor Web desde 2008, trabalha com aslinguagens 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.
[email protected]/fabiobeneditto
![Page 4: Sql Injection: o que é, como detectar, e como evitar](https://reader033.vdocuments.mx/reader033/viewer/2022060121/5594297a1a28abb45a8b45da/html5/thumbnails/4.jpg)
Partindo do princípio...
![Page 5: Sql Injection: o que é, como detectar, e como evitar](https://reader033.vdocuments.mx/reader033/viewer/2022060121/5594297a1a28abb45a8b45da/html5/thumbnails/5.jpg)
Um simples formulário
![Page 6: Sql Injection: o que é, como detectar, e como evitar](https://reader033.vdocuments.mx/reader033/viewer/2022060121/5594297a1a28abb45a8b45da/html5/thumbnails/6.jpg)
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');}
![Page 7: Sql Injection: o que é, como detectar, e como evitar](https://reader033.vdocuments.mx/reader033/viewer/2022060121/5594297a1a28abb45a8b45da/html5/thumbnails/7.jpg)
E onde está o erro?
![Page 8: Sql Injection: o que é, como detectar, e como evitar](https://reader033.vdocuments.mx/reader033/viewer/2022060121/5594297a1a28abb45a8b45da/html5/thumbnails/8.jpg)
OWASPOpen Web Application Security Project
O objetivo principal do OWASP Top 10 é educardesenvolvedores, projetistas, arquitetos, gestores e
organizações sobre as consequências das maisimportantes vulnerabilidades de segurança de
aplicações web.
Fonte: OWASP
![Page 9: Sql Injection: o que é, como detectar, e como evitar](https://reader033.vdocuments.mx/reader033/viewer/2022060121/5594297a1a28abb45a8b45da/html5/thumbnails/9.jpg)
OWASP Top 10 2013A1: Injeção de códigoA2: Quebra de autenticação e Gerenciamento de SessãoA3: Cross-Site Scripting (XSS)A4: Referência Insegura e Direta a ObjetosA5: Configuração Incorreta de SegurançaA6: Exposição de Dados SensíveisA7: Falta de Função para Controle do Nível de AcessoA8: Cross-Site Request Forgery (CSRF)A9: Utilização de Componentes Vulneráveis ConhecidosA10: Redirecionamentos e Encaminhamentos Inválidos
Fonte: OWASP
![Page 10: Sql Injection: o que é, como detectar, e como evitar](https://reader033.vdocuments.mx/reader033/viewer/2022060121/5594297a1a28abb45a8b45da/html5/thumbnails/10.jpg)
A1: Injeção de CódigoAs 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 uminterpretador como parte de um comando ou
consulta. Os dados manipulados pelo atacantepodem iludir o interpretador para que este execute
comandos indesejados ou permita o acesso a dadosnão autorizados.
![Page 11: Sql Injection: o que é, como detectar, e como evitar](https://reader033.vdocuments.mx/reader033/viewer/2022060121/5594297a1a28abb45a8b45da/html5/thumbnails/11.jpg)
Como assim?
![Page 12: Sql Injection: o que é, como detectar, e como evitar](https://reader033.vdocuments.mx/reader033/viewer/2022060121/5594297a1a28abb45a8b45da/html5/thumbnails/12.jpg)
Lembra de nosso formulário?E se ao invés de colocar...
...enviássemos assim:
![Page 13: Sql Injection: o que é, como detectar, e como evitar](https://reader033.vdocuments.mx/reader033/viewer/2022060121/5594297a1a28abb45a8b45da/html5/thumbnails/13.jpg)
O que acontece?
![Page 14: Sql Injection: o que é, como detectar, e como evitar](https://reader033.vdocuments.mx/reader033/viewer/2022060121/5594297a1a28abb45a8b45da/html5/thumbnails/14.jpg)
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 = '[email protected]' AND password = 'dunno'";
mas, na segunda, se torna...$query = "SELECT user,password FROM public.admin WHERE user = '1' OR '1=1' AND password = 'dunno'";
![Page 15: Sql Injection: o que é, como detectar, e como evitar](https://reader033.vdocuments.mx/reader033/viewer/2022060121/5594297a1a28abb45a8b45da/html5/thumbnails/15.jpg)
Mas, o que isso significa?
![Page 17: Sql Injection: o que é, como detectar, e como evitar](https://reader033.vdocuments.mx/reader033/viewer/2022060121/5594297a1a28abb45a8b45da/html5/thumbnails/17.jpg)
E como evitar?
![Page 18: Sql Injection: o que é, como detectar, e como evitar](https://reader033.vdocuments.mx/reader033/viewer/2022060121/5594297a1a28abb45a8b45da/html5/thumbnails/18.jpg)
Boas práticasSanitização de parâmetrosUso de prepared statements
![Page 19: Sql Injection: o que é, como detectar, e como evitar](https://reader033.vdocuments.mx/reader033/viewer/2022060121/5594297a1a28abb45a8b45da/html5/thumbnails/19.jpg)
Sanitização de ParâmetrosCom 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']);
![Page 20: Sql Injection: o que é, como detectar, e como evitar](https://reader033.vdocuments.mx/reader033/viewer/2022060121/5594297a1a28abb45a8b45da/html5/thumbnails/20.jpg)
Ainda não é a solução ideal
![Page 21: Sql Injection: o que é, como detectar, e como evitar](https://reader033.vdocuments.mx/reader033/viewer/2022060121/5594297a1a28abb45a8b45da/html5/thumbnails/21.jpg)
Prepared StatementsSã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.
![Page 22: Sql Injection: o que é, como detectar, e como evitar](https://reader033.vdocuments.mx/reader033/viewer/2022060121/5594297a1a28abb45a8b45da/html5/thumbnails/22.jpg)
Uso de prepared statementsCom 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
![Page 23: Sql Injection: o que é, como detectar, e como evitar](https://reader033.vdocuments.mx/reader033/viewer/2022060121/5594297a1a28abb45a8b45da/html5/thumbnails/23.jpg)
...e como detectar?
![Page 25: Sql Injection: o que é, como detectar, e como evitar](https://reader033.vdocuments.mx/reader033/viewer/2022060121/5594297a1a28abb45a8b45da/html5/thumbnails/25.jpg)
O que é sqlmap?É uma ferramenta Open Source para pentests que:
automatiza processo de detecção eexploração de falhas de SQL Injection, eexpõe os dados do DB do servidor
Fonte: sqlmap.org
![Page 26: Sql Injection: o que é, como detectar, e como evitar](https://reader033.vdocuments.mx/reader033/viewer/2022060121/5594297a1a28abb45a8b45da/html5/thumbnails/26.jpg)
Dentre suas muitas featuresSuporte COMPLETO a seis técnicas de SQL injection:
boolean-based blindtime-based blinderror-basedUNION query-basedstacked queriesout-of-band.
![Page 27: Sql Injection: o que é, como detectar, e como evitar](https://reader033.vdocuments.mx/reader033/viewer/2022060121/5594297a1a28abb45a8b45da/html5/thumbnails/27.jpg)
Principal forma de usoAtravés de URLs do tipo $_GET[]:
$ python sqlmap.py -u "http://target/vuln.php?id=1" --batch
![Page 28: Sql Injection: o que é, como detectar, e como evitar](https://reader033.vdocuments.mx/reader033/viewer/2022060121/5594297a1a28abb45a8b45da/html5/thumbnails/28.jpg)
...e não é só!
![Page 29: Sql Injection: o que é, como detectar, e como evitar](https://reader033.vdocuments.mx/reader033/viewer/2022060121/5594297a1a28abb45a8b45da/html5/thumbnails/29.jpg)
O que mais pode ser feito:Download e upload de qualquer arquivoExecutar comandos arbitrários e receber seus retornosatravés do Banco de Dados, quando o SGBD for MySQL, PostgreSQLou Microsoft SQL Server
![Page 30: Sql Injection: o que é, como detectar, e como evitar](https://reader033.vdocuments.mx/reader033/viewer/2022060121/5594297a1a28abb45a8b45da/html5/thumbnails/30.jpg)
Ou seja:
![Page 31: Sql Injection: o que é, como detectar, e como evitar](https://reader033.vdocuments.mx/reader033/viewer/2022060121/5594297a1a28abb45a8b45da/html5/thumbnails/31.jpg)
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
![Page 32: Sql Injection: o que é, como detectar, e como evitar](https://reader033.vdocuments.mx/reader033/viewer/2022060121/5594297a1a28abb45a8b45da/html5/thumbnails/32.jpg)
?Perguntas
Comentários
![Page 33: Sql Injection: o que é, como detectar, e como evitar](https://reader033.vdocuments.mx/reader033/viewer/2022060121/5594297a1a28abb45a8b45da/html5/thumbnails/33.jpg)
Créditos da apresentaçãopor Fábio Beneditto
[email protected] github.com/fabiobeneditto
powered by: reveal.jshttp://lab.hakim.se/reveal-js/