As vezes queremos acessar uma aplicação web para procurar falhas, ou fazer alguma tipo de investigação minuciosa.
Uma ferramenta de linha de comando que pode ser usada para fazer isso é o curl. O uso mais básico do curl é fazer uma requisição em uma determinada URL.
O resultado desse comando não mostra nenhuma informação muito útil, apenas o HTML da resposta. Uma das formas de visualisar os dados no cabeçalho HTTP é usando a opção -v.
Com a opção -v são adicionadas no topo da saída do comando, informações sobre o que o curl está fazendo, precedidas de um “*”; o cabeçalho da requisição, precedidas de um “>” e o cabeçalho da resposta, precedias de um “<”. Se forem feitas várias requisições, como quando há um redirecionamento, apareceram todas as operações de requisição e resposta. Isso pode ajudar na hora de procurar um bug em sua aplicação.
A forma mais comum do fazer um login nos dias atuais é com um formulário HTML usando o método POST e, caso tenha sucesso identificando o usuário, salvando um cookie no browser do usuário.
Para fazer uma requisição usando o método POST com curl basta indicar os dados que você deseja postar com a opção --data, e o curl infere qual método será usado. Para demostrar isso vou usar uma aplicação de teste que tenho no Heroku.
É possível ver que a aplicação identificou corretamente o usuário e salvou um cookie no browser. Isso pode ser confirmado pelo campo Set-Cookie no cabeçalho da resposta.
A aplicação de teste que eu usei, depois do login com sucesso redireciona o usuário para uma listagem de todos os usuários do site. Por padrão o curl não segue para as páginas seguintes quando recebe um status code 302, de redirecionamento. Para que ele faça isso você deve passar a opção -L.
É possível ver que o último status code é 401, que significa “Não autorizado”. Mas como isso pode acontecer se acabamos de logar e um cookie foi enviado para o curl? Isso acontece por que, diferente dos browser, o curl não salva essas informações para enviar para o servidor posteriormente. Você precisa fazer isso manualmente.
O sintaxe básica para fazer uma requisição com cookie é:
Isso pode ser um pouco chato, pois você tem que pegar os valores que quer na resposta, com o grep talvez, salvar em uma variável para poder usar em uma requisição posterior.
Uma forma mais fácil de fazer isso é salvado o cabeçalho em um arquivo e reutilizando esse informação. O curl já tem uma opção que salva essas informações em um arquivo. E a opção –cookie também aceita um arquivo como parâmetro.
Com base nisso é possível fazer login em qualquer site.