HTTP 요청 스머글링
IT 위키
HTTP Request Smuggling : HTTP 요청 밀수
HTTP 요청의 길이를 알려 주는 헤더를 조작해, 프런트엔드 서버와 백엔드 서버가 요청의 경계를 서로 다르게 해석하도록 만드는 공격
HTTP 는 본문의 길이를 알리는 방법이 두 가지다.
- Content-Length : 본문의 바이트 수를 직접 지정한다.
- Transfer-Encoding: chunked : 본문을 청크로 나눠 보내고 크기 0 인 청크로 끝을 알린다.
두 헤더가 한 요청에 동시에 들어 있을 때 어느 쪽을 따를지 서버마다 다르다. 프런트엔드(로드 밸런서·리버스 프록시·CDN)와 백엔드가 서로 다른 헤더를 따르면, 앞쪽 서버가 요청 하나로 본 것을 뒤쪽 서버는 요청 둘로 보게 된다. 이때 뒤에 남은 조각이 다음 사용자의 요청 앞에 붙는다.
- CL.TE : 프런트엔드는 Content-Length 를, 백엔드는 Transfer-Encoding 을 따른다.
- TE.CL : 프런트엔드는 Transfer-Encoding 을, 백엔드는 Content-Length 를 따른다.
- TE.TE : 양쪽 다 Transfer-Encoding 을 처리하지만, 헤더를 변형(난독화)하면 한쪽만 무시한다.
- 프런트엔드의 접근 통제를 우회해 내부 전용 경로에 직접 접근한다.
- 다른 사용자의 요청을 가로채 세션 쿠키 등 중요 정보를 획득한다.
- 응답을 오염시켜 XSS 를 유발한다.
- 조작된 응답이 캐시에 저장되게 하는 웹 캐시 포이즈닝으로 이어진다.
- Content-Length 와 Transfer-Encoding 이 함께 온 요청은 거부한다.
- 프런트엔드와 백엔드가 같은 HTTP 구현·같은 버전을 쓰도록 맞춘다.
- 프런트엔드와 백엔드 사이를 HTTP/2 로 연결한다. HTTP/2 는 길이를 프레임으로 다루므로
헤더 해석 차이가 생기지 않는다.
- 백엔드 연결을 재사용하지 않으면 남은 조각이 다음 요청에 붙지 않는다.
