2015년 12월 1일 화요일

입력데이터 검증 및 표현 - HTTP응답분할, 정수오버플로우

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

n  안전한 코딩 기법
①     외부에서 입력된 인자값을 사용하여 HTTP 응답헤더(Set Cookie 등)에 포함시킬 경우 CR, LF등이 제거하거나 적절한 인코딩 기법을 사용하여 변환한다.
②     외부에서 입력된 인자값을 적절한 필터링 코드를 통해 검증하여, 오작동을 일으킬 소지가 있는 문자들을 제거한 후 코드에 사용한다.
1.   protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {  
2.           String author = request.getParameter("authorname");  
3.           if(author == null || "".equals(author)) return;  
4.             
5.           String filteredAuthor = author.replaceAll("\r", "").replaceAll("\n", "");  
6.           Cookie cookie = new Cookie("replidedAuthor", filteredAuthor);  
7.           cookie.setMaxAge(30*60);  
8.           cookie.setSecure(true); // SSL(https) 사용하는 경우  
9.           response.addCookie(cookie);  
10.          RequestDispatcher rd = request.getRequestDispatcher("cookieTest.jsp");  
11.          rd.forward(request, response);  
12.  }  

2)     정수 오버플로우
정수형 변수의 오버플로우는 정수값이 증가하면서, JAVA에서 허용된 가장 큰 값보다 더 커져서 실제 저장되는 값은 의도하지 않게 아주 작은 수이거나 음수가 될 수 있다. 특히 반복문 제어, 메모리 할당, 메모리 복사 등을 위한 조건으로 사용자가 제공하는 입력값을 사용하고 그 과정에서 정수 오버플로우가 발생하는 경우 보안상 문제를 유발할 수 있다.

n  안전한 코딩 기법
①     언어/플랫폼 별 정수타입의 범위를 확인하여 사용한다. 정수형 변수를 연산에 사용하는 경우 결과값의 범위를 체크하는 모듈을 사용한다. 특히 외부 입력 값에 동적으로 할당하여 사용하는 경우 변수의 값 범위를 검사하여 적절한 범위 내에 존재하는 값인지 확인한다.


1.   // 동적 메모리 할당  
2.   public static void main(String args[]) {  
3.       int size = new Integer(args[0]).intValue();  
4.       size += new Integer(args[1]).intValue();  
5.         
6.       //배열의 크기가 음수인지 검사한다.  
7.       if(size < 0) return;  
8.       String[] temp = new String[size];  
9.   }  

댓글 없음:

댓글 쓰기