O diagrama acima apresenta a anatomia de uma solicitação HTTP em um nível muito alto. A primeira vez que um usuário insere a URL (inlanefreight.com) no navegador, ele envia uma solicitação a um servidor DNS (Resolução de Nome de Domínio) para resolver o domínio e obter seu IP. O servidor DNS procura o endereço IP de inlanefreight.com e o retorna. Todos os nomes de domínio precisam ser resolvidos desta forma, pois um servidor não pode se comunicar sem um endereço IP.
Nota: Nossos navegadores geralmente procuram primeiro os registros no arquivo local '/etc/hosts' e, se o domínio solicitado não existir nele, eles entrarão em contato com outros servidores DNS. Podemos usar '/etc/hosts' para adicionar registros manualmente para resolução de DNS, adicionando o IP seguido do nome de domínio.
Assim que o navegador obtém o endereço IP vinculado ao domínio solicitado, ele envia uma solicitação GET para a porta HTTP padrão (por exemplo, 80), solicitando a raiz/caminho. Em seguida, o servidor web recebe a solicitação e a processa. Por padrão, os servidores são configurados para retornar um arquivo de índice quando uma solicitação de / é recebida.
Neste caso, o conteúdo de index.html é lido e retornado pelo servidor web como uma resposta HTTP. A resposta também contém o código de status (por exemplo, 200 OK), que indica que a solicitação foi processada com sucesso. O navegador da web então renderiza o conteúdo index.html e o apresenta ao usuário.
Duas das ferramentas mais importantes para qualquer testador de penetração na web, um navegador da Web, como Chrome ou Firefox, e a ferramenta de linha de comando cURL.
cURL (URL do cliente) é uma ferramenta e biblioteca de linha de comando que oferece suporte principalmente a HTTP junto com muitos outros protocolos. Isso o torna um bom candidato para scripts e também para automação, tornando-o essencial para o envio de diversos tipos de solicitações da web a partir da linha de comando, o que é necessário para muitos tipos de testes de penetração na web.
Podemos enviar uma solicitação HTTP básica para qualquer URL usando-a como argumento para cURL, como segue:
Terminal:
venelouis@vene$ curl inlanefreight.com
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
...RECORTE...
Vemos que cURL não renderiza o código HTML/JavaScript/CSS, ao contrário de um navegador da web, mas o imprime em seu formato bruto. No entanto, como testadores de penetração, estamos interessados principalmente no contexto de solicitação e resposta, que geralmente se torna muito mais rápido e conveniente do que um navegador da web.
Também podemos usar cURL para baixar uma página ou arquivo e enviar o conteúdo para um arquivo usando o sinalizador -O. Se quisermos especificar o nome do arquivo de saída, podemos usar o sinalizador -o e especificar o nome. Caso contrário, podemos usar -O e cURL usará o nome do arquivo remoto, como segue:
Terminal:
venelouis@vene$ curl -O inlanefreight.com/index.html
venelouis@vene$ ls
index.html
Como podemos ver, a saída não foi impressa desta vez, mas sim salva em index.html.
Finalmente, podemos usar o sinalizador -h para ver quais outras opções podemos usar com cURL:
Terminal
venelouis@vene$ curl -h
Usage: curl [opções...] <url>
-d, --data <dados> Dados HTTP POST
-h, --help <category> Obtenha ajuda para comandos
-i, --include Inclui cabeçalhos de resposta do protocolo na saída
-o, --output <arquivo> Grava no arquivo em vez de stdout
-O, --remote-name Grava a saída em um arquivo nomeado como arquivo remoto
-s, --silent Modo silencioso
-u, --user <usuário:senha> Usuário e senha do servidor
-A, --user-agent <nome> Envia User-Agent <nome> para o servidor
-v, --verbose Torna a operação mais falante
Esta não é a ajuda completa, este menu está dividido em categorias.
Use "--help categoria" para obter uma visão geral de todas as categorias.
Use o manual do usuário `man curl` ou o sinalizador "--help all" para todas as opções.
Como a mensagem acima menciona, podemos usar --help all para imprimir um menu de ajuda mais detalhado, ou --help categoria (por exemplo, -h http) para imprimir a ajuda detalhada de um sinalizador específico. Se precisarmos ler uma documentação mais detalhada, podemos usar man curl para visualizar a página de manual completa do cURL.
Podemos enviar uma solicitação HTTP básica para qualquer URL usando-a como argumento para cURL, como segue:
Terminal:
venelouis@vene$ curl inlanefreight.com
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
...RECORTE...
Vemos que cURL não renderiza o código HTML/JavaScript/CSS, ao contrário de um navegador da web, mas o imprime em seu formato bruto. No entanto, como testadores de penetração, estamos interessados principalmente no contexto de solicitação e resposta, que geralmente se torna muito mais rápido e conveniente do que um navegador da web.
Também podemos usar cURL para baixar uma página ou arquivo e enviar o conteúdo para um arquivo usando o sinalizador -O. Se quisermos especificar o nome do arquivo de saída, podemos usar o sinalizador -o e especificar o nome. Caso contrário, podemos usar -O e cURL usará o nome do arquivo remoto, como segue:
Terminal:
venelouis@vene$ curl -O inlanefreight.com/index.html
venelouis@vene$ ls
index.html
Como podemos ver, a saída não foi impressa desta vez, mas sim salva em index.html.
Finalmente, podemos usar o sinalizador -h para ver quais outras opções podemos usar com cURL:
Terminal
venelouis@vene$ curl -h
Usage: curl [opções...] <url>
-d, --data <dados> Dados HTTP POST
-h, --help <category> Obtenha ajuda para comandos
-i, --include Inclui cabeçalhos de resposta do protocolo na saída
-o, --output <arquivo> Grava no arquivo em vez de stdout
-O, --remote-name Grava a saída em um arquivo nomeado como arquivo remoto
-s, --silent Modo silencioso
-u, --user <usuário:senha> Usuário e senha do servidor
-A, --user-agent <nome> Envia User-Agent <nome> para o servidor
-v, --verbose Torna a operação mais falante
Esta não é a ajuda completa, este menu está dividido em categorias.
Use "--help categoria" para obter uma visão geral de todas as categorias.
Use o manual do usuário `man curl` ou o sinalizador "--help all" para todas as opções.
Como a mensagem acima menciona, podemos usar --help all para imprimir um menu de ajuda mais detalhado, ou --help categoria (por exemplo, -h http) para imprimir a ajuda detalhada de um sinalizador específico. Se precisarmos ler uma documentação mais detalhada, podemos usar man curl para visualizar a página de manual completa do cURL.
cURL
Command | Description |
---|---|
curl -h | cURL help menu |
curl inlanefreight.com | Basic GET request |
curl -s -O inlanefreight.com/index.html | Download file |
curl -k https://inlanefreight.com | Skip HTTPS (SSL) certificate validation |
curl inlanefreight.com -v | Print full HTTP request/response details |
curl -I https://www.inlanefreight.com | Send HEAD request (only prints response headers) |
curl -i https://www.inlanefreight.com | Print response headers and response body |
curl https://www.inlanefreight.com -A 'Mozilla/5.0' | Set User-Agent header |
curl -u admin:admin http://<SERVER_IP>:<PORT>/ | Set HTTP basic authorization credentials |
curl http://admin:admin@<SERVER_IP>:<PORT>/ | Pass HTTP basic authorization credentials in the URL |
curl -H 'Authorization: Basic YWRtaW46YWRtaW4=' http://<SERVER_IP>:<PORT>/ | Set request header |
curl 'http://<SERVER_IP>:<PORT>/search.php?search=le' | Pass GET parameters |
curl -X POST -d 'username=admin&password=admin' http://<SERVER_IP>:<PORT>/ | Send POST request with POST data |
curl -b 'PHPSESSID=c1nsa6op7vtk7kdis7bcnbadf1' http://<SERVER_IP>:<PORT>/ | Set request cookies |
curl -X POST -d '{"search":"london"}' -H 'Content-Type: application/json' http://<SERVER_IP>:<PORT>/search.php | Send POST request with JSON data |
APIs
Command | Description |
---|---|
curl http://<SERVER_IP>:<PORT>/api.php/city/london | Read entry |
curl -s http://<SERVER_IP>:<PORT>/api.php/city/ | jq | Read all entries |
curl -X POST http://<SERVER_IP>:<PORT>/api.php/city/ -d '{"city_name":"HTB_City", "country_name":"HTB"}' -H 'Content-Type: application/json' | Create (add) entry |
curl -X PUT http://<SERVER_IP>:<PORT>/api.php/city/london -d '{"city_name":"New_HTB_City", "country_name":"HTB"}' -H 'Content-Type: application/json' | Update (modify) entry |
curl -X DELETE http://<SERVER_IP>:<PORT>/api.php/city/New_HTB_City | Delete entry |
Browser DevTools
Shortcut | Description |
---|---|
[CTRL+SHIFT+I ] or [F12 ] | Show devtools |
[CTRL+SHIFT+E ] | Show Network tab |
[CTRL+SHIFT+K ] | Show Console tab |
Nenhum comentário:
Postar um comentário