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?