View
555
Download
0
Category
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?
Recommended