2. 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
3. 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;
5. 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.
6. 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
7. 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
9. 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...
10. 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;
11. 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();
12. 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 :)