HTTP 패킷을 분석하는데 도움이 될 헤더들의 설명과 HTTP 오류코드의 의미에 대하여 학습해보았다.
HTTP
hyper text transfer protocol은 웹 사이트를 이용할 때 사용되는 네트워크 프로토콜로 서버와 클라이언트가 통신하기 위한 약속(규약)이다.
HTTP는 요청 메세지와 응답 메세지가 다르며 사용하는 헤더도 차이가 있는데 직접 패킷을 보면서 하나씩 살펴보자.
다음은 버프스위트를 이용해 비박스로 접속하는 HTTP 패킷을 가져온 것이다.
HTTP Request 메시지
다음은 HTTP 요청 메시지이다. 첫 줄에는 메소드와 URL, HTTP 버전을 나타낸다.
그다음부터 헤더를 나타내고 한 줄 공백 다음에 바디를 나타내나 전송할 데이터가 없으면 바디를 비워서 전송한다.
이제 요청 메시지에서 자주 볼 수 있는 요청 헤더에 대해서 설명할 것이다.
Host : 요청하는 서버의 도메인과 포트를 나타내며 포트가 생략된 경우 일반적으로 80 포트를 의미한다.
User-Agent : 클라이언트의 정보를 나타낸다. 대표적으로 웹브라우저의 정보를 나타내고 서버는 이를 이용해 응답을 달리할 수 있다.
Referer : 클라이언트가 어디에서 부터 접속하는지 이전 웹페이지 주소를 알려준다. 이를 통해 CSRF 공격을 검사하기도 한다.
Accept : 클라이언트가 어떤 컨텐츠 타입을 처리할 수 있는지 알려준다. 서버는 이를 참고하여 응답한다.
Accept-Encoding : 클라이언트가 어떤 인코딩, 압축 방식을 처리할 수 있는지 알려준다.
Accept-Language : 클라이언트가 어떤 언어를 처리할 수 있는지 알려준다.
Cookie : 쿠키를 전달하는 헤더로 키와 값으로 된 데이터를 서버로 전달한다.
Content-Type, Content-Length : 바디가 존재하는 경우 바디의 종류와 길이를 알려준다. 요청과 응답 두 가지 모두에서 사용될 수 있다.
HTTP Response 메시지
다음은 HTTP 응답 메시지이다. 첫 줄에는 HTTP 버전, 응답코드, 응답 코드 메시지을 나타낸다. 응답 코드는 아래에서 다룬다.
응답 메시지의 주요 헤더들을 알아보자
Server : 웹 서버와 프레임워크 등 버전 정보를 알려준다. 보안적으로 약점이 될 수 있으므로 이를 숨기는 조치를 할 수 있다.
X-Powered-By, X-ASPNET-VERSION : Server 헤더와 마찬가지로 버전 정보를 나타낸다.
Set-Cookie : 서버가 클라이언트로 쿠키를 전달할 때 사용된다. 옵션으로 유효기간과 경로 등을 설정 하나 생략될 수 있다.
- Secure : 옵션으로 사용 시 HTTP 요청 시 전달되지 않고 HTTPS를 사용할 때만 암호화되어 전송된다. 세션ID 노출 위험을 차단한다.
- HttpOnly : 옵션으로 사용 시 자바스크립트로 쿠키값을 접근하는 것을 막아 XSS 취약점에 대한 피해를 방지할 수 있다.
- Expires : 쿠키의 유효기간을 설정하며 지정되지 않으면 세션 종료 시까지만 유효시간을 가진다.
X-Frame-Options : <frame>이나 <iframe> 등을 제어하는 헤더로 이를 이용하여 악성링크를 숨기는 클릭재킹 공격을 방지한다.
- DENY : 값을 사용 시 프레임 내에 웹페이지를 절대 표시하지 않는다.
- SAMEORIGIN : 값을 사용 시 같은 도메인 안에서 요청된 페이지만 프레임으로 표시되게 한다.
X-XSS-Protection : 리플렉티드 XSS 공격이 탐지되었을 때 웹 페이지 로딩을 막아준다. X-XSS-Protection: 1; block
X-Content-Type-Options : 파일을 읽을 때 Content-Type의 값과 파일이 다를 때 추측하여 실행하는 MIME 기능을 차단하기 위한 헤더이다. nosniff 값을 이용하여 MIME 스니핑를 방지한다.
이밖에도 다양한 헤더들이 존재하며 관리자가 임의의 헤더를 생성하여 사용할 수도 있다.
HTTP 응답 코드
응답 코드 종류 | 자주 쓰는 응답 코드와 메세지 | 설명 |
1xx (정보) | 101 Switching Protocol | 프로토콜 전환이 요청되어 서버가 승인하는 중이다. |
2xx (성공) | 200 OK | 서버가 요청을 제대로 처리했다는 뜻이다. |
201 Created | 성공적으로 요청되어 서버가 리소스 생성을 완료했다. | |
3xx (리다이렉션) | 301 Moved Permanently | Location 헤더에 정의된 URL로 리소스가 이동되어 리다이렉트되었다. |
302 Found | 현재 서버가 다른 위치의 페이지로 요청에 응답하지만 향후 요청 시에는 원래 위치를 사용해야 한다. | |
304 Not Modified | 마지막 요청 이후 페이지가 수정되지 않았다. 리소스 변경 내용 없음 | |
4xx (클라이언트 오류) | 401 Unauthorized | 인증이 실패했거나 인증이 필요하다. |
403 Forbidden | 권한이 없어 리소스 요청을 거부한다. | |
404 Not Found | 해당 리소스가 존재하지 않는다. | |
5xx (서버 오류) | 500 Internal Server Error | 서버에 오류가 발생하여 요청을 처리할 수 없다 |
503 Service Unavailable | 서버가 오버로드되거나 다운되어 현재 사용할 수 없다. 대체로 일시적인 상태이다. |
https://developer.mozilla.org/ko/docs/Web/HTTP/Status
'보안 이론 > 웹 보안' 카테고리의 다른 글
SQL Injection - 오류 페이지를 이용한 공격 (0) | 2022.09.14 |
---|---|
SQL Injection - 로그인 우회 (0) | 2022.09.14 |
(2021) OWASP TOP 10에 대해서 (0) | 2022.09.13 |
Web Shell 업로드 우회 실습 (0) | 2022.09.13 |
Malzilla를 이용한 난독화 실습 (2) | 2022.09.07 |