Como obtenho um URL sobre HTTP com netcat?

4

Alguém pode me dizer por que estou recebendo bad request durante a execução deste comando

echo -e "GET http://www.yellowpages.com.eg/Mjg3NF9VUkxfMTEwX2h0dHA6Ly93d3cubG90dXMtYWlyLmNvbV8=/Lotus-Air/profile.html HTTP/1.1\n\n" | nc www.yellowpages.com 80 

O mesmo site abre bem no navegador.

    
por Madhur Ahuja 29.06.2011 / 12:08

3 respostas

8

Os cabeçalhos em uma solicitação HTTP devem usar os finais de linha CRLF (Windows). (Consulte Wikipédia ou RFC 2616 .) Muitos servidores suportam terminações de linha LF (Unix) como uma extensão, mas não esta.

Além disso, o HTTP 1.1 requer uma linha de cabeçalho Host: , como Warren Young apontou . (Consulte Wikipédia ou RFC 2616 ).

echo -e "GET http://www.yellowpages.com.eg/Mjg3NF9VUkxfMTEwX2h0dHA6Ly93d3cubG90dXMtYWlyLmNvbV8=/Lotus-Air/profile.html HTTP/1.1\r\nHost: www.yellowpages.com.eg\r\n\r\n" | nc www.yellowpages.com 80

ou mais legivelmente

sed $'s/$/\r/' <<EOF | nc www.yellowpages.com 80
GET http://www.yellowpages.com.eg/Mjg3NF9VUkxfMTEwX2h0dHA6Ly93d3cubG90dXMtYWlyLmNvbV8=/Lotus-Air/profile.html HTTP/1.1
Host: www.yellowpages.com.eg

EOF

Mas por que não usar o wget ou o curl, que construirão uma solicitação válida sem suar e ainda permitirão que você especifique cabeçalhos personalizados, se necessário?

    
por 29.06.2011 / 16:32
4

Você precisa incluir o nome de domínio em sua solicitação GET. Você disse a nc o nome de domínio ao qual está se conectando para saber onde encontrar o servidor, mas nc não passa isso para o servidor. Se o servidor estiver hospedando vários domínios, ele não saberá qual enviar para você. O cabeçalho da solicitação que você está passando com echo deve incluir este domínio completo como este:

echo "GET http://domain.tld/path" | nc domain.tld 80

Observe que você também pode descartar o argumento -e em seu eco e as novas linhas de escape no final. O -e está suprimindo a tendência natural do echo de adicionar uma nova linha, então você está adicionando um você mesmo.

Editar 1: Existe algum motivo para você não estar usando uma ferramenta de download normal como curl , que pode lidar com todas as possibilidades de cabeçalho e fornecer uma saída útil? Você realmente precisa lidar com o bate-papo de cabeçalho? curl http://domain.tld/path deve dar a você uma saída muito mais confiável, porque os programadores já trabalharam em todas as possibilidades para você.

Editar 2: Veja a resposta de Warren para informações sobre a especificação do protocolo. TL; DR: Se você especificar 1.1, precisará obedecer a esse protocolo. Se você especificar 1,0, normalmente você pode fazer o pedido como acima.

Faça um request com echo e netcat usando HTTP / 1.1, tente isto:

echo "GET http://domain.tld/path HTTP/1.1\nHost: domain.tld\n" | nc domain.tld 80
    
por 29.06.2011 / 12:09
3

HTTP 1.1 requer que você envie pelo menos um cabeçalho Host em solicitações GET. Ou seja, a solicitação legal mínima é assim:

GET http://www.example.com/noise/and/junk HTTP/1.1
Host: www.example.com

(Mais um CRLF adicional para finalizar a seção de cabeçalho, é claro.)

Pode haver servidores HTTP que atendem a uma solicitação que exige o uso de HTTP 1.1, mas que não inclui o Host do cabeçalho, mas o servidor está correto ao rejeitar essa solicitação.

Host é uma extensão HTTP 1.1 necessária para suportar hospedagem virtual baseada em nome. Se o site que você está tentando acessar tiver servidores dedicados (ou, pelo menos, um IP dedicado), você pode voltar ao HTTP 1.0 com segurança, o que permite fazer uma solicitação HTTP de linha única:

GET http://www.example.com/noise/and/junk HTTP/1.0
    
por 29.06.2011 / 14:27

Tags