Web

HTTP packet

supp0rt 2024. 6. 7. 21:57

Request

# example
[Request]
Method URI HTTP_Version
HEADER
Body

# header
[Request]
POST /somerequest HTTP/1.1
Host: a.com
Content-Type: application/x-www-form-urlencoded
Content-Length: 100
User-Agent: Mozilla/5.0(Windows NT 10.0; Win64; x64) AppleWebKit/537.36(KHTML, like Gecko)
Chorom/114.0.0.0 Safari/537.36
Referer: <https://a.com/>
Cookie: session=somesessionvalues

param1=parameter     # body

method

  1. GET : URL 쿼리를 통해 파리미터를 담아 요청
  2. POST : HTTP Body를 통해 파라미터를 담아 요청
  3. PUT : 서버에 리소스를 생성(업로드) 하거나 수정
  4. DELETE: 서버의 리소스를 삭제
  5. PATCH : 서버의 리소스를 일부 수정
  6. HEAD : Response에 Content 없이 헤더 부분만 요청
  7. OPTIONS : 서버에서 지원하는 메서드 종류를 열거

What is REST API

  • 정해진 코드가 아닌 개발자끼리의 약속
  • 사용자가 요청하는 목적에 따라 메소드를 나누어 전송하자 ⇒ REST pull
  1. GET : 리소스 조회
  2. POST : 리소스 생성 요청
  3. PUT / PATCH : 리소스 업데이트
  4. DELETE : 리소스 삭제

URI

https://id:pw@www.example.com:port/somereq.html?someparam1=value&someparam2=value2#hash

  • Protocol : 서버 리소스에 접근하기 위해 사용되는 프로토콜
  • Host : 서버의 도메인 이름이나 IP 주소. 접속하기 위한 id:pw, 도메인명 / IP와 포트로 구성되어 있음. HTTP에선 id:pw는 거의 사용하지 않지만, 지원하고 있기 때문에 여러 우회기법에 사용됨 ⇒ SSRF
  • Path : 서버 내의 리소스의 위치를 지정하는 경로. /..%2f , /..;/ 등 웹서버 및 로드밸런서가 경로를 해석하는 방식의 차이를 이용한 우회기법 등이 존재
  • Query String : 파라미터를 전달하는데에 사용. someparam1[key]=value와 같이 Dict 형태로 전송될 수 있음
  • hash : 서버 전달 x 브라우저 클라이언트 단에서만 동작 크롬에 scroll to text 를 이용하여 DOM영역 내부 정보를 빼내는 Xss Leak에 사용

HTTP version

  • HTTP/1.0 : 1996년에 출시된 첫번째 버전. 하나의 연결에 하나의 요청과 응답만 처리가 가능
  • HTTP/1.1 : 여러 개의 요청과 응답을 하나의 TCP 연결에서 처리 가능. Keep-Alive 연결을 통해 연결 재사용, 캐시 등 기능 또한 도입됨
  • HTTP/2 : 2015년에 출시된 버전. 요청과 응답을 작은 프레임 단위로 분할하여 전송
  • HTTP/3 : 2020년에 출시됨. QUIC 프로토콜을 기반으로 TCP가 아닌 UDP를 사용하여 지연시간을 낮춤

Header

  • Host : 요청하는 호스트(도메인 / IP)의 이름
  • Content-Type : 요청하는 POST Body 데이터의 형식을 지정
    • applicatioin/x-www-form-urlencoded : param=value 형식을 가지고, value는 url encoding을 지원
    • application/json : json 형식
    • application/xml : xml 형식
  • Content-Length : 요청하는 POST Body 데이터의 길이
  • User-Agent : 요청하는 클라이언트의 정보. 브라우저 버전 등이 적힌다.
  • Referer : 요청 패킷이 어디서부터 흘러왔는지 알려주는 정보
  • Cookie : 사용자 세션 정보 등과 같이 유지하고자 하는 정보 등이 적혀있음

<aside> 📖 Cookie

  • 어떠한 정보를 저장할 때 브라우저에 저장. 매 요청시마다 전송 Session
  • 어떠한 정보를 저장할 때 서버에 저장(메모리, 파일, 데이터베이스 등), 서버에서 관리

</aside>

<aside> 📖 Cookie 속성 secure

  • https로만 전송 only
  • 브라우저 js에서 접근 불가

</aside>

Response

# example
[Response]
HTTP_Version Status_code
HEADER
Body

# header
[Request]
HTTP/1.1 200 OK
Server: nginx
Content-Type: application/json;charset=UTF-8
Set-Cookie: sessio=newsessionvalue; expires=Mon, 24 Jul 2023 13:18:29 GMT; path=/; doamin=.a.com
Content-Length: 100

{"response":"resp!"}

Status Code

  • 200 OK : 정상 응답
  • 301 Moved Permanently : 리소스가 다른곳으로 영구적으로 이동됨
  • 302 Found : 리소스가 일시적으로 다른 위치로 이동됨. 보통 Location 헤더를 통해 이동할 위치를 지정
  • 400 Bad Request : 요청이 잘못되었거나 서버가 이해할 수 없는 요청
  • 401 Unauthorized : 자격증명이 없어 인가되지 않은 요청
  • 403 Forbidden : 권한이 없어 인가되지 않은 요청
  • 404 Not Found : 없는 페이지
  • 500 Internal Server Error : 서버 내부 오류. 서버가 요청을 해석하여 서버단 언어로 해석 도중 에러가 생겼을 때

Header

  • Server : 서버의 정보를 나타냄. 서버 정보, 버전 등의 정보를 제공
  • Content-Type : 응답 데이터의 content-type을 정의. Character set(인코딩)에 대한 정보도 전달 가능
    • Character set의 인코딩 방식을 이용하여 WAF 우회 가능
  • Set-Cookie : 쿠키 (세션 값 등) 정보를 세팅 가능. 만료와 적용 대상 path, domain 지정 가능
  • Content-Length : 응답 데이터의 길이