SQL Injection
Tiago Natel de Moura
[email protected]
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=1
23456
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?
Download

Slide 1