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필요Host
GET 요청에 하나 이상의 헤더를 보냅니다 . 즉, 최소 법적 요구 사항은 다음과 같습니다.
GET http://www.example.com/noise/and/junk HTTP/1.1
Host: www.example.com
(물론 헤더 부분을 종료하려면 CRLF를 추가로 추가해야 합니다.)
Host
HTTP 1.1이 필요하다고 주장하지만 헤더를 포함하지 않는 요청을 처리할 수 있는 일부 HTTP 서버가 있을 수 있지만 귀하의 서버는 이러한 요청을 거부하는 것이 맞습니다.
Host
이름 기반 가상 호스팅을 지원하려면 HTTP 1.1 확장이 필요합니다. 액세스하려는 사이트에 전용 서버(또는 최소한 전용 IP)가 있는 경우 안전하게 HTTP 1.0으로 대체하여 한 줄의 HTTP 요청을 할 수 있습니다.
GET http://www.example.com/noise/and/junk HTTP/1.0