Sql injection

Preview:

DESCRIPTION

Básico de SQL Injection

Citation preview

SQL Injection

Tiago Natel de Mouranatel@owasp.org

Sobre mim

Pesquisador e co-fundador do grupo BugSec Team. bugsec.googlecode.com

Consultor de Segurança na SEC+. www.secplus.com.br

Co-Fundador e Lider do Capítulo da OWASP de Florianópolis.

Desenvolvedor de algumas ferramentas de segurança: http://github.com/tiago4orion

Experiências/Interesses

Linguagens:• C, C++, Assembly, Lisp

Segurança:• Desenvolvimento de Exploits;

• Buffer overflows (Stack/Heap Overrun);

• Network Protocol (TCP/UDP/IP, WEP/WPA, FTP/HTTP, etc)

• Análise de Malwares;

• Web Application Vulnerabilities (SQLI, XSS, CSRF, LFD/RFI, etc)

• Metodologias de segurança;

SQL Injection

DEMO

SQL Injection

SQL Injection é uma falha que ocorre quando o desenvolvedor permite que a query de consulta ao banco de dados seja manipulada de forma maliciosa por uma entrada do usuário.

Programadores não gostam de crashar seus softwares ...

Query na aplicação:

Sql = “SELECT id, username, password FROM admin WHERE username = '“ + req.getParameter(“usuario”) + “' and password = '” + req.getParameter(“senha”) + “'”;

Como ele testa:

[POST] http://localhost/login.do?usuario=admin&senha=123456

Programadores não gostam de crashar seus softwares ...

Query na aplicação:

Sql = “SELECT id, username, password FROM admin WHERE username = '“ + req.getParameter(“usuario”) + “' and password = '” + req.getParameter(“senha”) + “'”;

Como o hacker testa:

[POST] http://localhost/login.do?usuario=admin&senha=' or 1=1 LIMIT 1

Como ocorre:

Input malicioso:

usuario=admin&senha=' OR 1=1

Query produzida:

SELECT id, username, password FROM admin WHERE username='admin' and password='' OR 1=1;

O que o hacker pode fazer?

Roubar todos os dados do seu banco de dados;

Inserir, atualizar ou DELETAR dados do banco; Autenticar com a conta de qualquer usuário; Ler e escrever arquivos dentro do seu servidor; Executar comandos no sistema (exec

xp_cmdshell); Upload de arquivos (Oracle); Requisição em outros servidores (Oracle); E muito mais...

Como se proteger?

Saiba o tipo de dado de todo input do usuário e transforme a entrada num objeto desse tipo;

Utilize Prepared Statements; Se não for possivel usar prepare, utilize

whitelist de caracteres válidos; NUNCA use blacklist;

Prepared Statement

stmt = conn.prepareStatement(“SELECT id, username, password FROM admin WHERE username = ? and password = ?”);

stmt.setString(0, req.getParameter(“usuario”));

stmt.setString(1, reg.getParameter(“senha”));

stmt.execute();

NUNCA utilize blacklist

Exemplos de formas de burlas blacklists: ' uNiOn AlL SeLecT 999 fRoM admin '/**/UnIoN/**/aLl/**/sElECT/**/666/**/fRoM/**/ad

min '%0a--%a%2f**%2f--%0asElEct--%0a666%2f**

%2f … Utilize a imaginação :)

Quem se beneficia dessas falhas?

BLACK MARKET

BLACK MARKET

Fim

Perguntas?