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

Post on 02-Jul-2015

420 Views

Category:

Internet

6 Downloads

Preview:

Click to see full reader

DESCRIPTION

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

Transcript

SQL Injection:O que é, como detectar, e

como evitarVersão 0.1.1

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

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.

fabio@altoscodigos.tkgithub.com/fabiobeneditto

Partindo do princípio...

Um simples formulário

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');}

E onde está o erro?

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

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

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.

Como assim?

Lembra de nosso formulário?E se ao invés de colocar...

...enviássemos assim:

O que acontece?

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'";

Mas, o que isso significa?

Que você é um alvo em potencial:

Fonte: Zone-H

E como evitar?

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

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']);

Ainda não é a solução ideal

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.

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

...e como detectar?

sqlmap

Fonte: sqlmap.org

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

Dentre suas muitas featuresSuporte COMPLETO a seis técnicas de SQL injection:

boolean-based blindtime-based blinderror-basedUNION query-basedstacked queriesout-of-band.

Principal forma de usoAtravés de URLs do tipo $_GET[]:

$ python sqlmap.py -u "http://target/vuln.php?id=1" --batch

...e não é só!

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

Ou seja:

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

?Perguntas

Comentários

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

fabio@altoscodigos.tk github.com/fabiobeneditto

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

top related