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

33
SQL Injection: O que é, como detectar, e como evitar Versão 0.1.1

description

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

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

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

SQL Injection:O que é, como detectar, e

como evitarVersão 0.1.1

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

ConteúdoO que é SQL InjectionComo detectar SQL InjectionEvitando SQL Injection

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

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

Partindo do princípio...

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

Um simples formulário

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

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

E onde está o erro?

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

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

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

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

Como assim?

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

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

O que acontece?

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

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

Mas, o que isso significa?

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

Que você é um alvo em potencial:

Fonte: Zone-H

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

E como evitar?

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

Boas práticasSanitização de parâmetrosUso de prepared statements

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

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

Ainda não é a solução ideal

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

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

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

...e como detectar?

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

sqlmap

Fonte: sqlmap.org

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

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

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

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

...e não é só!

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

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

Ou seja:

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

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

?Perguntas

Comentários

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

Créditos da apresentaçãopor Fábio Beneditto

[email protected] github.com/fabiobeneditto

powered by: reveal.jshttp://lab.hakim.se/reveal-js/