Sql Injection Avançado



Fala galera do mau! Hoje vamos aprender de uma vez por todas como fazer esse maldito SQL Injection na unha!

No post passado mostramos como invadir um banco de dados usando o sqlmap, quem não viu ainda recomendo: http://thecybersteam.blogspot.com.br/2015/10/invadindo-um-site-pelo-banco-de-dados.html

Qual vai ser a diferença do post anterior pra este?
Antes foi mostrado uma ferramenta que "Automatiza" esse trabalho pra gente, más além de automatizar também não mostra pra gente o que está sendo feito, apenas mostra os resultados, o que dificulta nosso aprendizado e por outro lado não confunde os iniciantes nem floda o terminal!

Que método que vamos utilizar?
A principio vamos aprender com o método GET para ficar mais facil, más poderia ser via POST também, más dai tu iria precisar de alguma extençao pra firefox para facilitar essa tarefa.

Sem enrolação mãos na massa!

Como sempre vamos escolher um alvo, e é lógico que vou dar exemplo utilizando o vulweb né, se acha que sou besta de botar um site de uma empresa aqui pra nego tirar print e deixar meu log ;D



Alvo

http://testphp.vulnweb.com/listproducts.php?cat=1

Método

GET

Verificando se o site está vuneravel


Para verificar se um site está vuneravel é facinho só botar uma aspas simples no final, se retornar um erro é porque está vul e depois é só alegria!

Protowave Attack


Descobrindo a quantidade de colunas na tabela atual

http://testphp.vulnweb.com/listproducts.php?cat=1 order by 11 --



O primeiro passo é descobrir a quantidade de colunas da tabela atual que está sendo utilizada na pagina, ainda não sabemos o nome da tabela, más olha só pro final do nosso link "listproducts", obviamente se refere a tabela "produtos", más não sabemos como que este nome foi escrito lá, pode ser "products" ou outra coisa do tipo.

Como descobrir a quantidade?
Simplesmente colocando um "order by" no final do link, seguido do número da coluna.

Vamos testar pra ver se funciona?

order by 1 --  < Continua mostrando os resultados de boa...
order by 2 --  < Continua mostrando os resultados de boa...
order by 3 --  < Continua mostrando os resultados de boa...
order by 4 --  < Continua mostrando os resultados de boa...
order by 5 --  < Continua mostrando os resultados de boa...
order by 6 --  < Continua mostrando os resultados de boa...
order by 7 --  < Continua mostrando os resultados de boa...
order by 8 --  < Continua mostrando os resultados de boa...
order by 9 --  < Continua mostrando os resultados de boa...
order by 10 -- < Continua mostrando os resultados de boa...
order by 11 -- < Continua mostrando os resultados de boa...
order by 12 -- < Errou, Errou Feio, Errou Feio, Errou Rude!




Nossa cansei de fazer isso, porque quando colocou order by 12 -- deu erro?
Simplesmente porque não tem a décima segunda coluna, dai ele tenta ordenar por ela e da um erro feio...

Legal más iai o que isso significa?
Significa que temos 11 colunas! Já que tentamos com 12 e não deu certo.

Entendeu?
Lógico!
Então vamos pro próximo!
Não perai! tu não falou daquele -- ali no final, pra que serve?
Haha, é só um comentário em SQL, ele vai pegar todo o código que vai entrar depois e ignorar, assim a tem mais chances de dar certo nosso teste!
Agora podemos ir?
Pode rs!

Descobrindo colunas vuneraveis


Lembra que eu falei que depois tu ia entender pra que tenho que saber o número de colunas?
Então bora...

Pro comando union select funfar, temos que colocar a quantidade de colunas da tabela atual.
Precisa ter exatamente esse números? Não, más vamos utilizar pra identificar as colunas vuneráveis.

E esse -1?
Pra não atrapalhar nosso teste, colocando -1 não vai trazer nenhum resultado porque não tem categoria -1 no banco, más por outro lado vai trazer a união, seguida do valor que colocamos no select!

A pegada é a seguinte, os números que aparecerem no site, no lugar do que deveria ser o titulo, descrição, ou sei lá, qualquer outra coisa relacionado ao conteúdo normal, são as colunas que estão vuneráveis, e vamos poder usar elas para trazer qualquer outro dado do banco de dados atual, ou de outros, seja como tabelas, colunas, e por fim os dados!

Descobrindo o nome do banco de dados

http://testphp.vulnweb.com/listproducts.php?cat=-1 union select 1,2,3,4,5,6,7,8,9,10,database() --
Banco de dados: acuart



Agora vamos descobrir o nome do banco de dados atual, utilizando a coluna vunerável 11, poderia ter escolhido a 7,2 ou 9, más vou pegar a ultima pra ficar mais facinho de ler.

Pronto, agora lá no lugar do titulo veio o nome do banco!, poderia ser em outro lugar sem ser o titulo? sim, era só ter escolhido outra coluna...

Descobrindo o nome das tabelas do banco de dados encontrado

http://testphp.vulnweb.com/listproducts.php?cat=-1 union select 1,2,3,4,5,6,7,8,9,10, group_concat(table_name) from information_schema.tables where table_schema='acuart' --



Tabelas: artists,carts,categ,featured,guestbook,pictures,products,users


Agora vai começar complicar, más calma, vou tentar explicar nas manhas...

O que precisamos pegar?
As tabelas do banco de dados.

O que delas precisamos saber?
O nome.

Então vamos colocar o table_name no lugar da coluna 11!
Ué, más ali tu escreveu group_concat e botou table_name dentro por que?
Porque se eu não fizer isto, vai trazer só a primeira tabela, e eu quero todas separadas por virgula, então posso usar essa função do banco de dados pra fazer o trabalho pesado pra mim.

Beleza e agora esse from information_schema.tables?
From serve pra dizer de onde eu quero buscar essa informação, e no caso eu quero do banco de dados information_schema.

Não entendi, que prr@ é essa?
É um banco de dados padrão, que todo site vai ter, que serve pra guardar informações de todos os bancos de dados, tabelas, colunas e outras coisas que a gente não entende rs.

Más e se o site que eu tentar invadir não tiver, o que eu faço?
Sempre vai ter! Porque se o adm tentar deletar essa tabela, se conseguir já era, nada vai funcionar haha.

Agora voltando...
Porque esse .tables ?
Além de colocar o nome do banco, eu preciso colocar qual tabela desse banco eu quero, resumindo:
Banco.Tabela, que no nosso caso se chama tables.

E esse where table_schema='acuart' ?

Agora vamos usar um filtro, quero que traga as tabelas apenas onde a coluna table_schema seja igual ao banco de dados que queremos saber as tabelas.

Porque cada banco de dados tem várias tabelas certo? Então se a gente não colocar isto vai trazer tabelas que não tem nada haver com o que a gente quer!

Uffa, essa parte foi treta explicar, más vamo que vamo!

Descobrindo o nome das colunas da tabela users

http://testphp.vulnweb.com/listproducts.php?cat=-1 union select 1,2,3,4,5,6,7,8,9,10, group_concat(column_name) from information_schema.columns where table_name='users' --



Colunas da tabela users:
uname,pass,cc,address,email,name,phone,cart


Beleza, já sabemos o nome das tabelas, só que a unica que interessa pra gente é a users né, afinal, um usuário tem um login e senha né?

Então vamos colocar agora from information_schema.columns, ou seja, do banco de dados information_schema vamos consultar a tabela columns.

Onde a coluna table_name seja igual a o nome da tabela que a gente quer saber as colunas, que no nosso caso é a users!

Cansou? Eu também, más  pra nossa alegria já estamos chegando no final!

Pegando o usuario:senha da tabela users


Heita nois! antes o group_concat só tinha uma coisa, agora tem uname,0x3A,pass ?
Bom simplesmente estamos juntando (concatenando) o resultado de nossa pesquisa.
Ou melhor, juntando o resultado das colunas!
Então temos 2 colunas que queremos o valor certo?
Que é a uname (user name, nome do usuario) e (pass, senha)!
Ué, e aquele 0x3 ali? 

Bom se a gente não colocasse isso ali, vamos supor que o nome do usuario seja n1k3 e a senha seja 123456 o resultado seria isso:
n1k3123456

Dai tu ia me perguntar, oxe, testei lá más quem é o usuario e quem é a senha?
Então quando eu coloco o 0x3 vai colocar dois pontinhos no meio dos dois, assim:

n1k3:123456

Dai vamos saber que o primeiro é o nome depois a senha!

Legal! Entendi o que faz, más da pra explicar melhor o que é essa prr@?

Tu pergunta demais ein? Quer ser reporter?
Brinks, vamos lá!

Entra em algum site ai que converta Ascii para Hexadecimal e digita dois pontinhos : ou outra coisa.


O resultado de : para hex é 3a, e como padrão sempre vamos colocar 0x na frente para o banco de dados tratar isto como um hex e converter pra asci e executar!

No site que recomendei ele já coloca o 0x na frente, más se for usar outros pode ser que não tenha, dai tu coloca!


Finish RIM

Acabou jéssica?
[...]



Agora juizo ein!
Abraç é noix!


Share this

Related Posts

Previous
Next Post »