[시큐어코딩 가이드] 2-1-13. HTTP 응답분할

HTTP 응답분할

정의

HTTP 요청 내의 파라미터가 HTTP 응답 헤더에 포함되어 사용자에게 다시 전달될 때, 입력값에 CR이나 LF와 같은 개행문자가 존재하면 HTTP 응답이 2개 이상으로 분리될 수 있다. 이 경우 공격자는 개행문자를 이용해 첫 번째 응답을 종료 시키고, 두 번째 응답에 악의적인 코드를 주입해 XSS 및 캐시훼손(Cache Poisoning) 공격 등을 수행할 수 있다.

* CR(Carriage Return) : \r , LF(Line Feed) : \n

안전한 코딩기법

  • 요청 파라미터의 값을 HTTP 응답 헤더(예를 들어, Set-Cookie 등)에 포함시킬 경우 CR, LF와 같은 개행문자를 제거해야 한다.
  • 외부 입력값이 헤더, 쿠키, 로그 등에 사용될 경우에는 항상 개행 문자를 검증 하고 가능하다면 헤더에 사용되는 예약어 등을 화이트리스트로 제한해야 한다.

 

코드예제

다음은 안전하지 않은 코드예제로 사용자 요청에 포함된 값을 필터링 및 검증 없이 응답에 사용하는 경우 개행문자로 인해 여러 개의 응답으로 분할되어 사용자에게 전달될 수 있습니다.

#HTTP 응답분할(안전X)
def http_route_bad(request):
    content_type = request.GET.get('content_type')

    res = HttpResponse()
    res['Content-Type'] = content_type
    return res

 

응답분할을 예방하기위해서는 \r, \n과 같은 문자에 대해 치환 또는 예외처리를 적용해야합니다. 다음은 안전한 코드예제입니다.

#HTTP 응답분할(안전O)
def http_route_good(request):
    content_type = request.GET.get('content_type')

    content_type = content_type.replace('\r', '')
    content_type = content_type.replace('\n', '')

    res = HttpResponse()
    res['Content-Type'] = content_type
    return res

 

 

 

입력데이터 검증 및 표현/HTTP 응답분할

[참고문헌] Python 시큐어코딩 가이드(2022) / KISA(한국인터넷진흥원)