TeamH4C

[빡공팟 5기] W4 : Web Hacking 로드맵 - STAGE 1 - 3

이유갬 2022. 10. 13. 00:10

HTTP/HTTPS

- HTTP(HyperText Transfer Protocol)/HTTPS(HyperText Transfer Protocol Secure Socket Layer) 는 무엇일까?

: URI 의 구성 요소 중 Scheme(Protocol) 에 해당한다.

: 서버와 클라이언트의 데이터 교환을 요청과 응답의 형식으로 정의한 프로토콜이다.

클라이언트가 서비스 포트에 HTTP 요청을 전송하면, 이를 해석하여 적절한 응답을 반환한다.

Conectionless, Stateless 의 특징을 가지고 있다. (Conectionless : 한번 연결하고 연결을 종료, Stateless : 상태를 저장하지 않는다.)

: TCP 혹은 TLS(암호화된 TCP)를 사용하여 통신한다.

: 웹 서버는 HTTP 서버를 HTTP 서비스 포트에 대기시키는데 이 포트는 일반적으로 TCP/80 이거나 TCP/8080 이다.

: 프로토콜(Protocol)이란 컴퓨터 내부 또는 컴퓨터 사이에서 어떻게 데이터를 교환할지를 정의하는 규칙 체계이다.


+ ) 네트워크 포트와 서비스 포트?

- 네트워크 포트 : 네트워크에서 서버와 클라이언트가 정보를 교환하는 추상화된 장소를 말한다. 포트 = 항구라는 의미가 존재한다.

- 서비스 포트 : 네트워크 포트 중에서 특정 서비스가 점유하고 있는 포트를 말한다. -> HTTP 가 80번 포트 점유 시 HTTP 의 서비스 포트는 80번 포트이다.

포트로 데이터를 교환하는 방식에는 전송 계층(Transport Layer)의 프로토콜을 따른다. 대표적으로 TCP, UDP 가 존재한다.

따라서, TCP 로 데이터를 전송하려는 서비스에 UDP 클라이언트가 접근하면 데이터가 교환되지 않는다. 그래서 서비스 포트 표기 시 서비스가 사용하는 전송 계층 프로토콜을 같이 표기하기도 한다. -> TCP/80

+ ) 포트 : 0 ~ 1023번 포트 - Well-Known port(잘 알려진 포트) 또는 Privilieged port(특권 포트) 라고 한다.

이름대로 유명한 서비스가 등록되어 있다. -> SSH : 22, HTTP : 80, HTTPS : 443 등.. -> 잘 알려진 포트에 서비스를 실행하려면 관리자 권한이 필요하다.

포트 번호는 서버의 설정을 통해서 변경이 가능하다. 무조건 서버의 포트 번호가 80, 443번으로 서비스되는 것이 아니다.


- HTTP 와 HTTPS 의 차이는?

: HTTPS 는 HTTP 의 문제점인 데이터 평문 전송을 보완하기 위해서 보안이 추가된 프로토콜이다.

: HTTPS 는 TLS 와 SSL 을 사용해서 암호화하는데 공개키 암호화를 사용해서 클라이언트과 서버가 키를 교환하므로 비교적 안전하다.

: TLS 는 서버와 클라이언트 사이에 오가는 모든 HTTP 메시지를 암호화한다.

: 웹 서버의 URL이 http://로 시작되면 HTTP, https://로 시작되면 HTTPS 프로토콜을 사용한다.

: 두 개는 핵심 구조 및 동작 원리는 동일하므로 HTTP 로 통칭하기도 한다.

 

- HTTP(Hyper Text Transfer Protocol)에 대한 설명

(HTTP 메시지의 구조)

: HTTP 메시지에는 클라이언트가 전송하는 HTTP 요청과 서버가 응답하는 HTTP 응답 총 2개가 있다.

: 이들은 HTTP 헤드와 바디로 구성된다.

 

HTTP 요청

 

1. HTTP 헤드

: 헤드의 각 줄은 CRLF 로 구분되며, 첫 줄은 시작 줄, 나머지 줄은 헤더라고 부르고 헤드의 끝은 CRLF 한 줄로 나타낸다.

- 시작줄 : 요청과 응답에서 큰 차이가 나타난다.

 

HTTP 요청의 시작줄 :

1. 메소드(Method) : URI 가 가리키는 리소스를 대상으로 서버가 수행하기를 바라는 동작을 말한다. -> HTTP 표준에 정의된 메소드는 총 8개가 존재한다. ( 종류 정리 내용 추가 )

- GET : 리소스를 가져오라는 메소드, 이용자가 브라우저에서 웹 서버의 하이퍼링크를 클릭했을 때 새로운 페이지 렌더링을 위해 리소스가 필요하다. 이때, 브라우저는 GET 요청을 서버에 전송해서 리소스를 받아온다.

- POST : 리소스로 데이터를 보내라는 메소드, 전송할 데이터는 HTTP 바디에 포함된다. 로그인 폼에서의 아이디, 비밀번호, 게시판에서 글쓰기 등이 POST 로 서버에 보내진다.

2. 요청 URI(Request-URI) : 메소드의 대상

3. HTTP 버전 : 클라이언트가 사용하는 HTTP 프로토콜의 버전

-> 각각은 띄어쓰기로 구분한다.

 

- 헤더필드와 값으로 구성되며 HTTP 메시지 또는 바디의 속성을 나타낸다. 하나의 HTTP 메시지에는 0개 이상의 헤더가 있을 수 있다.

CRLF란?
Carrage Return(CR) Line Feed(LF) 로 커서를 현재 행의 맨 좌측과 수직 아래로 이동시키는 문자열이다.
즉, 줄 바꿈을 의미하며 hex 코드로는 0x0d, 0x0a 이고 아스키 코드에서 표현 방식은 "\r\n" 이다.

2. HTTP 바디

: 헤드의 끝을 나타내는 CRLF 뒤의 모든 줄을 말한다.

: 클라이언트나 서버에게 전송하려는 데이터가 바디에 담긴다.

 

HTTP 응답

: HTTP 요청에 대한 결과를 반환하는 메시지이다.

: 요청의 수행 여부를 알려주는 상태 정보(Status) 와 클라이언트에게 전송할 리소스가 응답에 포함된다.

 

1. HTTP 헤드

- 시작줄 :

1. HTTP 버전 : 서버에서 사용하는 HTTP 프로토콜의 버전을 나타낸다.

2. 상태 코드(Status Code) : 요청에 대한 처리 결과를 세 자릿수로 나타낸다. 각각은 첫번째 자릿수에 따라서 5개의 클래스로 분류된다.


1xx : 요청을 제대로 받았고 처리가 진행 중이다.

2xx : 요청이 제대로 처리되었다. /200 : 성공

3xx : 요청을 처리하려면 클라이언트가 추가적인 동작을 수행해야 한다. /302 : 다른 URL 로 갈 것

4xx : 클라이언트가 잘못된 요청을 보내서 실패하였다.

/400 : 요청이 문법이 맞지 않는다. /403 : 리소스 요청할 권한이 없다. /404 : 리소스가 없다.

5xx : 클라이언트 요청은 유효하지만 서버에서 에러가 발생하여 실패했다.

/500 : 요청 처리하다가 에러가 났다. /503 : 서버가 과부하로 인해 요청 처리가 불가능하다.


3. 처리 사유(Reason Phrase) : 상태 코드가 발생한 이유를 짧게 기술 한 것이다.

200 : OK / 201 : Created

301 : Moved Permanently / 302 : Found -> Response Header 에 포함되어 있는 Location 헤더의 값으로 리다이렉션함.

400 : Bad Request / 403 : Forbidden / 404 : Not Found / 405 : Method Not Allowed - 사용자가 요청한 메소드가 서버에서 허용하지 않는 메소드이다.

500 : Internal Server Error / 503 : Service Unavailable

 

2. HTTP 바디

: 헤드의 끝을 나타내는 CRLF 뒤의 모든 줄을 말한다.

: 클라이언트나 서버에게 전송하려는 데이터가 바디에 담긴다.

 

-> Response 구조도 CRLF 로 줄바꿈이 이루어져야 한다. 또한, 웹 해킹에서는 사용자의 입력에 의한 서버의 응답에 주목해야 한다.

예를 들어, 악의적인 입력을 보냈을 경우 500 Status Code(Internal Server Error) 를 응답하면 해당 입력이 서버에 영향을 끼쳤다고 예상이 가능하므로 취약점 도출이 가능해진다.

 

(HTTP의 Request 와 Response 의 간단한 데이터 구조)