www : World Wide Web으로 현재 우리가 사용하는 인터넷 네트워크를 의미하며
팀 버너스 리에 의해 고안되어 만들어졌다.
20억 개에 달하는 수많은 웹사이트가 월드 와이드 웹 프로젝트에 존재하며
운영되고 있다.
네트워크에서 송수신을 위해 필요한 규약인 프로토콜이 존재하며, 그 중
http 프로토콜이 가장 많이 사용된다.
http에는 요청과 응답 프로세스가 존재하며 각각 정적과 동적으로 나뉜다.
정적 http 요청의 경우 GET /url HTTP버전 의 형태로 구성되며
GET /127.0.0.1:8080 HTTP/1.0 과 같이 사용한다.
이에 대한 응답으로 정적 http 응답이 있는데
HTTP버전 상태코드 상태메시지의 형태로 구성되며
HTTP/1.0 200 OK 와 같다.
위의 설명은 모두 요청과 응답의 startline에 대한 설명으로
http로 전송되는 요청과 응답은 startline 외에 header와 body로 구성된다.
요청에서 header는 body의 총 길이, 요청하는 서버 이름 및 포트 등의 정보를 담고 있으며
body는 request가 전송하는 데이터를 담고 있는 부분으로 데이터가 없다면 body가 비어 있다.
요청 메시지에서 startline과 header는 붙어 있지만 body는 공백 라인을 두고 떨어져 있다.
응답 메시지의 경우 startline, header가 마찬가지로 붙어 있고 공백 라인 이후 body로 구성된다.
header는 요청에서와 비슷한 정보를 담고 있으며
body는 요청받은 내용에 대한 데이터가 담겨 있고 마찬가지로 데이터를 전송하지 않는 경우
body는 비어 있게 된다.
program misuse 때와 마찬가지로 해당 강좌에 수록되어 있는 문제들이다.
1. babyhttp1
curl을 이용해 http 서버로 전송하는 문제이다.
babyhttp를 실행하면 서버가 127.0.0.1:80으로 열리지만 무엇을 할 수는 없다.
따라서 curl을 사용해 전송해야 한다.
curl이란 client URL의 약자로
커맨드 라인으로 서버와 통신할 수 있는 프로그램이다.
curl + option + URL로 구성되는 명령을 통해 요청을 전송할 수 있다.
curl 127.0.0.1 명령을 입력하면 응답으로 flag를 획득할 수 있다.
2. babyhttp2
nc를 이용해 http 서버로 전송하는 문제이다.
마찬가지로 실행하면 서버가 127.0.0.1:80으로 열린다.
nc란 netcat으로 원격으로 특정 서버의 포트에 접속할 수 있다.
nc를 통해 서버에 접속하고 요청을 보낼 수 있는데
nc 127.0.0.1 80 의 형태로 nc, url, port 로 구성하여 입력한다.
이 때 HTTP 프로토콜에서 사용되는 GET 메시지 형태로 요청을 전송할 것이다.
GET /127.0.0.1 HTTP/1.0
nc로 접속한 뒤 위의 요청을 입력하면 응답 메시지를 받아 flag를 확인할 수 있다.
python을 이용해 서버로 전송하는 문제이다.
마찬가지로 실행하면 127.0.0.1:80으로 열린다.
python은 모듈을 import하여 다양한 기능을 할 수 있다.
서버를 만들어 열거나, 클라이언트로 요청을 보내거나 접속하는 등
여러 가지 작업을 수행할 수 있다.
현재 문제를 풀기 위해서는 서버로 요청을 보내고 응답을 받아야 한다.
따라서 파이선 스크립트를 작성해야 한다.
requests 모듈을 import하고
requests.get으로 127.0.0.1:80 즉 현재 열려있는 서버에
get 요청을 보낸 뒤의 응답을 변수에 담는다.
그리고 해당 변수의 text를 출력하도록 한다.
해당 스크립트를 실행시키면 flag를 획득할 수 있다.