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]- 사용자가 Front-end 서버에 HTTP Request 송신
- Front-end 서버는 HTTP Request 수신 후, Back-end 서버에 송신
- Back-end 서버는 수신한 Request를 Queue를 사용해 FIFO로 처리 후 Response 반환
- 최종적으로 Front-end 서버는 Back-end 서버의 Response를 사용자에게 반환
공격자 개입 HRS 요청 처리
[ATTACKER] -\ /----> [ATTACKER]: AA
[USER] ------> [Front-end] ---> [U][U][A]|[A][A]
\----------> [USER] : AUU *에러 발생
[Request Queue] [Back-end]- 공격자가 Front-end 서버에 악의적인 HTTP Request 송신
- Front-end는 정상적인 요청으로 간주하고 Back-end에 송신
- Back-end 서버는 Front-end 서버에서 전달된 Request 다르게 해석, 악의적인 요청 포함 전체 데이터 처리
- 최종적으로 공격자는 타 유저의 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: 4Transfer-Encoding: chunkedTransfer-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
'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 |