보안/시큐어코딩

[시큐어코딩-12] 입력데이터 검증및 표현(12) HTTP응답 분할

오픈이지 2012. 10. 28. 15:01

발생원인


HTTP요청에 대한 검증을 하지 않은 경우 발생


영향


 XSS 발생, 캐시 훼손


캐리지리턴(%0D)와 라인추가문자(%0A)를 이용해서 HTTP응답을 분할하여 CRLF공격을 할 수 있다.

Carrage Return은 커서의 위치를 줄의 맨 첫번째 자리로 옮기는 것이고, Line Feed는 새로운 줄을 생성하는 문자이다.

현재 윈도우에서만 Carrage Return과 Line Feed 문자 둘다 사용하고 있으며, UNIX, LINUX에서는 Line Feed만 사용하고 있다. 


그리고 자바에서는 carrage Return 문은 %0D가 아닌 \r 로 사용되고 있으며, Line Feed 또한 %OA가 아닌 \n으로 사용한다.


이러한 Carrage Return, Line Feed문들을 이용하여 임의의 제약들을 깨고 현재 서버에서 다른 페이지를 불러 올 수도 있으며 그리고 임의의 포트를 연결해서 대부분의 명령을 보낼 수 도 있다.


CRLF공격이 가능한 이유는 요청 매개변수의 값이 나타나는 각 응답헤더에 대해 애플리케이션이 URL 인토딩된 Carrage Return, Line Feed를 필터링하지 않기 때문에 발생한다. 

이를 막기 위해서는 애플리케이션이 개행문자를 포함한 입력값을 막아놓아야 하며 응답부분에 필터링이 효과적으로 작성되어야 한다.


코드예



 안전하기 않은 코드의 예 - JAVA

throws IOExceptionServletException {

  response.setContentType("text/html");

  String author = request.getParameter("authorName"); 

  Cookie cookie = new Cookie("replidedAuthor", author);

  cookie.setMaxAge(1000);

  response.addCookie(cookie);

  RequestDispatcher frd = request.getRequestDispatcher("cookieTest.jsp");

  frd.forward(request, response);

}


 authorName에 대한 검증을 거치지 않음


 안전한 코드의 예 - JAVA

throws IOException, ServletException {

  response.setContentType("text/html");

  String author = request.getParameter("authorName");

  if (author == null || "".equals(author))

         return;

  String filtered_authorauthor.replaceAll("\r", "").replaceAll("\n", "");

  Cookie cookie =  new Cookie("replidedAuthor", filtered_author);

  cookie.setMaxAge(1000);

  cookie.setSecure(true);

  response.addCookie(cookie);

  RequestDispatcher frdrequest.getRequestDispatcher("cookieTest.jsp");

  frd.forward(request, response);

}

입력값에대한 필터링 수행(개행문자등)