멘토님의 한 마디
정말.. GET 으로 요청할 경우 body 를 보내지 못하나요? 정확한 근거를 찾아보세요.
친절하게 힌트까지 주셨다.
https://datatracker.ietf.org/doc/html/rfc9110#name-get
Internet Engineering Task Force, IETF
국제 인터넷 표준화 기구
Request for Commnets
인터넷 개발에 있어서 필요한 기술, 연구 결과, 절차 등을 기술해 놓은 메모
Although request message framing is independent of the method used,
HTTP 메시지 구조는 메서드와 무관하다!
모든 HTTP 메서드는 같은 요청 메시지 구조를 갖는다.
GET, POST 등과 무관하게 Message Framing은 다음과 같다.
content received in a GET request has no generally defined semantics, cannot alter the meaning or target of the request, and might lead some implementations to reject the request and close the connection because of its potential as a request smuggling attack
(하지만) GET 요청에 담기는 콘텐츠(Body)는 일반적으로 정의되지 않는다.
만약 GET으로 Body에 데이터가 들어오면 일부 서버는 응답을 거절하거나 종료해 버릴 수 있다.
왜냐면 이건 잠재적으로 스머글링 공격 가능성이 있기 때문이다.
일반적으로 서버는 get요청에서 본문이 들어올 걸 예상하지 못함.
그래서 서버가 이걸 잘못 해석해서 예기치 않은 동작을 할 수 있음.
서버가 두 개 이상의 서버 또는 프록시가 HTTP 요청을 잘못 해석하도록 유도하는 공격
HTTP 요청의 경계를 인식하는 방식이 일관되지 않을 때 발생
하나의 HTTP 연결에서 두 개의 요청을 동시에 보낸다.
GET / HTTP/1.1
Host: example.com
Content-Length: 13
GET /admin HTTP/1.1
Host: example.com
위의 코드에서 Length가 13인데 본문이 없어서 첫 번째 요청 무시하고 두 번째 요청은 처리함.
그 후 두 번째 요청을 별도 요청으로 해석해 버림. 그럼 이건 서버에 도달함.
밀반입 공격의 핵심은 최초 HTTP 메시지로 length를 조작해서 서버가 전체 메시지 길이를 오인하게 만들고, 두개의 요청을 하나로 인식하게 하거나, 하나의 요청을 여러 개로 해석하게 만듦.
정상적인 요청과 악의적인 요청을 섞어서, 정상적인 요청으로 보안을 뚫고, 그 다음 악의적인 요청은 이미 뚫린 보안을 통해 실행되게 함.