How HTTP Works
모든 HTTP 트랜잭션은 모두 동일한 포맷을 따른다. 각 클라이언트의 요청과 서버의 응답은 세 부분으로 구성된다: 요청/응답 라인, 헤더 부분, 바디이다.
클라이언트는 다음과 같이 트랜잭션을 시작한다:
- 클라이언트는 서버에 접속 후 요청 문서를 보낸다. GET 요청은 URL 파라미터를 가질 수 있으며, 이 파라미터는 웹 접속 로그에서도 확인할 수 있다.
GET /index.html?param=value HTTP/1.0
- 다음으로, 선택적 헤더 정보를 보낼 수 있는데 이는 서버가 받아들일 수 있는 문서 포맷과 설정을 알리기 위함이다.
User-Agent: Mozilla/4.06 Accept: image/gif,image/jpeg, /
- POST 요청에서는 사용자가 전송한 데이터가 선택적 헤더의 형태로 전송되므로, URL의 한 부분으로 포함되지 않는다.
크게, 이 파트에서 중요하게 생각해야 할 것은 GET 메소드는 파라미터 값을 URL에 포함시켜 전송하는 것이고, POST 메소도는 URL이 아닌 바디 부분에 포함시켜 전송하는 것이다.
위와 같이 등록한 계정 이름을 입력하여 Go! 버튼을 클릭하면 입력된 문자열이 서버로 전송된 후 뒤집어서 응답해주는 것을 알 수 있다. 여기서 주목할 점은 URL을 확인했을 때 뒤에 파라미터 없이 입력한 값을 전송하였으므로 POST 메소드로 전송하였음을 알 수 있다.
문자열 입력 후 Go! 버튼을 클릭했을 때 POST 요청인지 GET 요청인지 맞추는 문제이다. 여기서 우리는 Proxy 프로그램 중 하나인 Burp Suite를 사용할 것이다. 칼리 리눅스에는 기본적으로 Burp Suite가 설치되어 있으므로 이를 실행하면 된다.
Burp Suite 실행 후 위와 같이 프록시 서버 정보를 설정한다. (기본적으로 8080 포트를 사용하도록 되어 있지만 이 포트는 WebGoat에서 사용 중이므로 8888로 변경한 것이다.)
나는 파이어폭스 브라우저를 사용 중이므로 위와 같이 프록시 설정을 해주면 이제부터 이 브라우저에서 보내는 요청과 서버에서 보내는 응답 패킷들이 Burp Suite를 거쳐가게 된다. 즉 서버(WebGoat)와 클라이언트(웹 브라우저) 사이에 Burp Suite라는 Proxy 서버가 존재하는 것이다.
일단 아무 문자열(webgoat) 입력 후 Go! 버튼을 클릭하여 어떤 방식으로 요청을 보내는지 확인한다.
💡 파이어폭스에서 루프백(127.0.0.1)로 보내는 트래픽은 Proxy를 우회하도록 설정되어 있기 때문에 다음과 같은 설정이 필요하다.
일단, 파이어폭스 브라우저 주소창에about:config
를 입력한다.
그 후 검색창에network.proxy.allow_hijacking_localhost
를 검색하고 기본값이 false로 되어 있는 것을 더블 클릭하여 true로 변환하면 된다.
Burp Suite에 잡힌 요청 패킷을 보면 POST 방식으로 전송하고 있음을 알 수 있다. 그리고 바디 데이터를 보면 magic_num 이라는 파라미터 값이 85라는 것을 알 수 있으므로 퀴즈 답으로 각각 POST, 85를 입력하면 클리어 할 수 있다.
이 파트의 내용은 프록시에 관한 내용으로, 여기서는 OWASP ZAP이라는 프로그램에 대한 설명이 나와있지만, 칼리 리눅스에는 Burp Suite가 설치되어 있기에 이 프로그램을 사용할 것이다.
요약하자면, 프록시는 중간자로서 서버와 사용자 사이에서 서로 주고 받는 데이터를 대신 전송해주거나, 내용을 기록하는 것이다. 물론 이 외에도 다른 사용 예시가 있지만 여기서는 앞에서 설명했듯이 중간에서 요청 및 응답 메세지를 감청하기 위한 용도로 사용한다고만 알고 있으면 된다.
Submit 버튼을 클릭해서 서버로 전송하는 요청 패킷을 인터셉트하여 수정하라는 문제이다.
최초로 Submit 버튼을 클릭했을 때 Burp Suite를 이용하여 요청 패킷을 인터셉트 했을 때의 화면이다. 버튼을 클릭하기 전 Burp Suiite에서 Intercept is on
상태이어야 한다. 여기서 이제 요구사항대로 패킷 내용을 수정하면 된다.
일단 POST를 GET로 변경한다. 헤더 값은 간단하게 헤더 부분 마지막에 추가했다. 여기서 주의해야 할 점은 바디 부분인데, GET 메소드로 변경하였으므로 파라미터 값은 URL에 추가되어 전송된다. 따라서 changeMe 파라미터 값을 요청 라인에서 URL 부분 끝에 ?
와 함께 파라미터를 추가한다. 이 때 문자열 내에 있는 공백은 +
로 변경한다.