Concept

HRS

wermut 2025. 10. 10. 17:06

Introduction

HRS(=HTTP Request Smuggling): HTTP 프록시 서버 체인 내 HTTP 서버 구현간의 HTTP/1 요청이 끝나는 위치를 지정하는 헤더의 해석 불일치를 악용하는 공격

Front-end와 Back-end가 우선시 하는 헤더가 다른 경우 Front와 Back간의 불일치를 이용해 추가적인 Request 삽입이 가능


중요 Header

[[Connection]]

  • 현재의 전송이 완료된 후 네트워크 접속을 유지할지 여부를 의미
  • value는 keep-alive, close 존재
  • HTTP 2 이상에서는 삭제됨

[[Content-Length]]

  • 수신자에게 전송되는 메시지 본문의 크기를 의미
  • 헤더 이후 이어지는 데이터의 길이(byte 단위)

[[Transfer-Encoding]]

  • 메시지에 적용된 인코딩을 의미
  • hop-by-hop 헤더로, 리소스 자체가 아닌 두 노드 사이에 작용

HRS Flow

정상 요청처리

[USER1] --\                                /-------> [USER1]: 11
[USER2] -----> [Front-end] ---> [2][2]|[1][1] 
                                     \-------------> [USER2]: 22
                               [Request Queue]      [Back-end]
  1. 사용자가 Front-end 서버에 HTTP Request 송신
  2. Front-end 서버는 HTTP Request 수신 후, Back-end 서버에 송신
  3. Back-end 서버는 수신한 Request를 Queue를 사용해 FIFO로 처리 후 Response 반환
  4. 최종적으로 Front-end 서버는 Back-end 서버의 Response를 사용자에게 반환

공격자 개입 HRS 요청 처리

[ATTACKER] -\                                 /----> [ATTACKER]: AA
[USER] ------> [Front-end] ---> [U][U][A]|[A][A] 
                                        \---------->   [USER]  : AUU *에러 발생
                                 [Request Queue]     [Back-end]
  1. 공격자가 Front-end 서버에 악의적인 HTTP Request 송신
  2. Front-end는 정상적인 요청으로 간주하고 Back-end에 송신
  3. Back-end 서버는 Front-end 서버에서 전달된 Request 다르게 해석, 악의적인 요청 포함 전체 데이터 처리
  4. 최종적으로 공격자는 타 유저의 Request 가로채거나 세션 하이재킹 등 공격 수행 가능

HRS Attack

공격 유형 Request 헤더 구성 Front-end 해석 Back-end 해석
[[CL.CL]] Content-Length: 6
Content-Length: 4
첫 번째만 처리 두 번째만 처리
[[CL.TE]] Content-Length: 8
Transfer-Encoding: chunked
CL 우선 TE 우선
[[TE.CL]] Transfer-Encoding: chunked
Content-Length: 8
TE 우선 CL 우선
[[TE.TE]] Content-Length: 4
Transfer-Encoding: chunked
Transfer-Encoding: foobar
TE 우선 TE 에러 -> CL 사용

Security Considerations

공식 문서에서 아래 규정을 권고 및 강제

  • 서로 다른 필드 값을 가진 여러 개의 Content-Length 헤더 필드가 있거나, 단일 Content-Length 헤더 필드가 유효하지 않은 값을 가질 경우, 메시지 프레이밍은 유효하지 않은것으로 간주 [RFC 9112]

  • 상기한 상황에서 수신자는 이를 복구 불가능한 오류(unrecoverable error)로 처리 [RFC 9112]

  • 상기한 상황의 패킷이 Request message인 경우 서버는 400 응답코드와 연결해제 [RFC 9112]

  • 상기한 상황의 패킷이 Proxy가 수신한 Client로부터의 Request message인 경우 Proxy는 서버와 연결해제, 400에러 발생. 수신된 응답 폐기 [RFC 9112]

  • 상기한 상황의 패킷이 Proxy가 수신한 Server로부터의 Response message인 경우 Proxy는 서버와 연결해제, 502에러 발생수신된 응답 폐기 [RFC 9112]

  • Content-Length 헤더필드 값이 쉼표로 구분된 목록으로 반복되며 동일할 경우, 수신자는 message 거부 혹은 단일 유효한 Content-Length 값으로 대체 처리 가능 [RFC 9112], [RFC 9110]

  • Content-Length와 Transfer-Encoding 헤더가 동시에 사용되는 경우 Transfer-Encoding 헤더가 Content-Length 헤더 재정의. 즉 Content-Length 무시 [RFC 9112]

  • Request message인 경우 서버는 400 응답코드와 연결해제 [RFC 9112]

  • Proxy가 수신한 Client로부터의 Request message인 경우 Proxy는 서버와 연결해제, 400에러 발생. 수신된 응답 폐기 [RFC 9112]


HRS 테스트 환경

Portswigger Lab

https://portswigger.net/web-security/request-smuggling/finding/lab-confirming-cl-te-via-differential-responses

'Concept' 카테고리의 다른 글

HRS-CL.TE  (2) 2025.10.10
HRS-CL.CL  (2) 2025.10.10
OAuth 2.0 Security Considerations  (0) 2025.10.10
OAuth 2.0  (0) 2025.10.10
[JS] 자바스크립트 기본 개념 / DOM  (0) 2025.04.08