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 < 0return;  
8.       String[] temp = new String[size];  
9.   }  

댓글 없음:

댓글 쓰기