본문으로 건너뛰기

29. HTTP Request Smuggling 감 잡기

요청 스머글링은 프록시와 백엔드가 하나의 바이트 스트림에서 요청의 끝을 다르게 정할 때 생긴다. Content-Length와 Transfer-Encoding의 충돌은 대표적인 원인이지만, 문제의 본질은 헤더 이름 하나가 아니라 서로 다른 HTTP 파서와 연결 재사용의 조합이다. 실험은 격리된 랩과 승인된 CTF에서만 진행한다.

먼저 경로와 파서를 식별한다​

클라이언트에서 CDN·로드밸런서·리버스 프록시·애플리케이션까지 연결 경로를 그린다. 각 계층의 HTTP 버전, hop-by-hop 헤더 처리, 비정상 요청의 거부 정책, 백엔드 연결 재사용을 문서화한다. 프록시 로그와 백엔드 로그의 요청 ID·메서드·경로·본문 길이를 비교하면 경계 불일치를 찾는 데 도움이 된다.

검증은 무해한 두 번째 요청과 전용 백엔드로 시작한다. 정상 요청의 기준선, 잘못된 길이의 단일 요청, 충돌하는 framing을 각각 분리해 보내고, 연결이 멈추거나 다음 정상 요청의 응답이 바뀌는지만 관찰한다. 운영 사용자 연결에 섞일 수 있는 도구나 지속적인 스캔은 사용하지 않는다. 응답 혼합은 의심 신호이지 취약성의 확정이 아니므로 서버 로그와 패킷 캡처로 원인을 교차 확인한다.

방어의 우선순위​

가장 좋은 방어는 앞단과 뒷단이 동일한 엄격한 파싱 규칙을 사용하게 하는 것이다. 충돌하는 Content-Length·Transfer-Encoding, 중복 길이 헤더, 비정상 공백과 잘린 chunk를 경계에서 거부하고, 프록시가 hop-by-hop 헤더를 정리하도록 한다. HTTP/2를 HTTP/1.1로 변환하는 지점도 별도의 테스트 대상으로 삼는다.

수정 후에는 keep-alive와 오류 경로를 포함한 회귀 테스트를 돌린다. 스머글링은 단순히 400을 반환하는지보다, 한 요청이 다음 요청의 해석에 영향을 주지 않는지로 판정해야 한다.