Sql Injection: o que é, como detectar, e como evitar
-
Upload
fabio-beneditto -
Category
Internet
-
view
421 -
download
6
description
Transcript of Sql Injection: o que é, como detectar, e como evitar
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.
[email protected]/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 = '[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'";
Mas, o que isso significa?
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?
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
[email protected] github.com/fabiobeneditto
powered by: reveal.jshttp://lab.hakim.se/reveal-js/