netcat을 사용하여 HTTP를 통해 URL을 얻는 방법은 무엇입니까?

netcat을 사용하여 HTTP를 통해 URL을 얻는 방법은 무엇입니까?

bad request이 명령을 실행할 때 왜 이런 일이 발생하는지 말해 줄 수 있는 사람이 있습니까 ?

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

동일한 웹사이트가 브라우저에서 정상적으로 열릴 수 있습니다.

답변1

HTTP 요청의 헤더는 CRLF(Windows) 줄 끝을 사용해야 합니다. (바라보다위키피디아또는RFC 2616.) 많은 서버가 LF(Unix) 줄 끝을 확장으로 지원하지만 이 서버는 지원하지 않습니다.

또한 HTTP 1.1에는 Host:다음과 같은 헤더 줄이 필요합니다.워렌 영은 지적했다.. (바라보다위키피디아또는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

또는 더 명확

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

하지만 유효한 요청을 손쉽게 구성하고 필요한 경우 사용자 정의 헤더를 지정할 수 있는 wget 또는 컬을 사용하면 어떨까요?

답변2

GET 요청에 도메인 이름을 포함해야 합니다. nc연결하려는 도메인 이름을 알려주었고 서버를 찾을 수 있는 위치를 알고 있지만 nc서버에 전달하지 않습니다. 서버가 여러 도메인을 호스팅하는 경우 어느 도메인을 보낼지 알 수 없습니다. 전달하는 요청 헤더에는 echo다음과 같은 전체 도메인이 포함되어야 합니다.

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

인수를 echo에 넣고 -e끝에서 이스케이프된 개행 문자를 제거할 수도 있습니다. 이는 -e개행 문자를 추가하려는 에코의 자연스러운 경향을 억제한 다음 직접 개행 문자를 추가하는 것입니다.

편집 1:curl모든 헤더 가능성을 처리하고 유용한 출력을 제공할 수 있는 이와 같은 일반 다운로드 도구를 사용하지 않는 이유가 있습니까? 타이틀 채팅을 직접 처리해야 합니까? curl http://domain.tld/path프로그래머가 당신을 위해 모든 가능성을 해결했기 때문에 더 안정적인 출력을 제공해야 합니다.

편집 2:바라보다워렌의 대답프로토콜 사양에 대한 정보입니다. 핵심요약: 1.1을 지정하는 경우 해당 프로토콜을 준수해야 합니다. 1.0을 지정하면 일반적으로 위와 같이 요청을 할 수 있습니다.

HTTP/1.1을 사용하여 echo와 netcat을 통해 요청하려면 다음을 시도해 보세요.

echo "GET http://domain.tld/path HTTP/1.1\nHost: domain.tld\n" | nc domain.tld 80

답변3

HTTP 1.1필요HostGET 요청에 하나 이상의 헤더를 보냅니다 . 즉, 최소 법적 요구 사항은 다음과 같습니다.

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

(물론 헤더 부분을 종료하려면 CRLF를 추가로 추가해야 합니다.)

HostHTTP 1.1이 필요하다고 주장하지만 헤더를 포함하지 않는 요청을 처리할 수 있는 일부 HTTP 서버가 있을 수 있지만 귀하의 서버는 이러한 요청을 거부하는 것이 맞습니다.

Host이름 기반 가상 호스팅을 지원하려면 HTTP 1.1 확장이 필요합니다. 액세스하려는 사이트에 전용 서버(또는 최소한 전용 IP)가 있는 경우 안전하게 HTTP 1.0으로 대체하여 한 줄의 HTTP 요청을 할 수 있습니다.

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

관련 정보