삶 가운데 남긴 기록 AACII.TISTORY.COM
JAVA 보안 HTTP Response Splitting 본문
HTTP Response Splitting(HTTP 응답 분할)
HTTP request에 들어있는 인자값이 HTTP response header에 포함되어 사용자에게 다시 전달 될 때, 입력값에 CR(캐리지리턴), LF(라인피드)같은 줄바꿈 문자가 존재하면 response가 2개 이상으로 분리될 수 있는데, 공격자가 첫번째 응답을 종료시키고 두 번째 응답에 악의적인 코드를 주입해서 XSS 및 캐시를 훼손하는 공격 등을 할 수 있습니다.
외부 입력값을 HTTP response의 응답 헤더(Set Cookie 등)에 포함시킬 경우 CR, LF를 제거하거하거나 오작동을 일으킬만한 소지가 있는 문자들을 제거하여 방어합니다.
안전하지 않은 예
//생략
response.setContentType("text/html");
String author = request.getParameter("authorName");
Cookie cookie = new Cookie("replidedAuthor", author);
cookie.setMaxAge(1000);
reponse.addCookie(cookie);
RequestDispatcher frd = request.getRequestDispatcher("cookieTest.jsp");
frd.forward(request, response);
//생략
예제에서 외부 입력값을 사용해서 반환되는 쿠키의 값을 설정하는데 공격자가 Wiley Hacker\r\nHTTP/1.1 200 OK\r\n을 authorName 으로 설정하면 의도하지 않은 두개의 페이지가 전달되어 두번째 응답 페이지는 공격자가 마음대로 수정이 가능하게 됩니다.
안전한 코드의 예
//생략
response.setContentType("text/html");
String author = request.getParameter("authorName");
if(author == null || "".equals(author)) return;
String filtered_author = author.replaceAll("\r", "").replaceAll("\n","");
Cookie cookie = new Cookie("replidedAuthor", filtered_author);
cookie.setMaxAge(1000);
cookie.setSecure(true);
response.addCookie(cookie);
RequestDispatcher frd = request.getRequestDispatcher("cookieTest.jsp");
frd.forward(request, response);
//생략
참고
http://cwe.mitre.org/data/definitions/113.html
728x90
'DEV&OPS > Java' 카테고리의 다른 글
JAVA 보안 Reliance on Untrusted Inputs in a SecurityDecision (0) | 2022.08.17 |
---|---|
JAVA 보안 정수 오버플로우(Integer Overflow) (0) | 2022.08.16 |
JAVA 보안 Path Traversal (0) | 2022.08.05 |
JAVA 보안 Cross-Site Request Forgery (0) | 2022.08.04 |
JAVA 보안 URL Redirection to Untrusted Site (0) | 2022.08.04 |