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. }
댓글 없음:
댓글 쓰기