티스토리 뷰

반응형

 

 

 

가. 원인

  - 검증되지 않은 입력값 또는 DB저장값을 동적 웹페이지 생성에 사용

 

 

나. 영향

  - 클라이언트에서 악성코드 실행

  - 피싱사이트 실행

  - 세션 하이재킹 공격 실행

  - 접속자 권한으로 부적절한 스크립트 실행으로 정보유출

 

 

다. 보안대책

  - 스크립트를 삽입하지 못하도록 입력값 필터링 ( < > % " 등 )

  - HTML태그를 허용하는 게시판의 경우 허용되는 HTML태그를 화이트리스트로 관리 및 사용

  - 입력값에 정규식을 이용하여 검증

  - 모든 요청에 대해 XSS 필터를 적용하여 입력값 검증

  - 출력값에 HTML 인코딩 적용

  - 출력값에 XSSFilter를 적용

 

 

라. 안전한 코드

1. 서블릿에서 HTML 인코딩

 

  String data = request.getParameter("data");

  data = data.replaceAll("<", "&lt;").replaceAll(">", "&gt;");

  data = data.replaceAll("&". "&amp;").replaceAll("\\", "&quot;");

 


2. JSP에서 JSTL HTML 인코딩

 

  <textarea> $<fn:escapeXml(model.content)} </textarea>

 


3. JSP에서 JSTL Core 출력포멧

 

  <textarea> <c:out value="${model.content}" /> </textarea>

 

 

4. 외부 XSSFilter 라이브러리 사용

 

  XssFilter filter = XssFilter.getInstance("lucy-xss-superset.xml");  

  String data = request.getParameter("data");

  out.append(filter.doFilter( data ));

 

 

  <script>

     var output = "<textarea> <%=Encoder.encodeForJS(Encoder.encodeForHTML(keyword))%></textarea>";

     document.write( output );

  </script>

 

 

 

마. 진단방법

  1. 웹페이지로 출력하는 변수값이 존재하는지 확인

  2. 해당 변수값이 외부 입력값을 통해 저장된 값인지 확인

  3. 변수값이 적절히 필터링이 되고 있는지 확인

 

 

바. 정/오탐 케이스

<정탐 케이스>

  1. 입력값을 필터링하지 않고 출력

  2. JSTL의 <c:out>을 통해 외부 입력값을 출력 시 escapeXml값을 false로 설정함

  3. 키워드 필터링이 미흡하여 우회공격으로 스크립트가 실행가능

  4. 주석 내 필터링 없이 입력값을 출력 시 주석을 포함한 스크립트 공격으로 우회공격 가능

  5. 사용자가 입력한 값이 저장 후 출력 시 검증되지 않은 경우 취약

 

<오탐 케이스>

  1. 입력값이 Location 값으로 출력될 경우, URL로 이동하므로 안전하다고 판정 (sendRedirect / location.href )

  2. JSTL의 <c:out>을 사용하여 외부값을 출력

  3. JSTL의 escapeXml을 이용하여 외부값을 출력 ( ${fn:escapeXml(param)) }

  4. 출력되는 외부입력값이 문자형이 아닌 경우

  5. 출력되는 외부입력값의 글자수가 짧은 경우 안전한 것으로 판정

  6. 시스템 콘솔에 외부입력값을 출력시 안전한 것으로 판정 (system.out)

  7. 출력되는 데이터가 외부 입력값이 아닌 경우

  8. 사용자가 입력하지 않은 값이 저장 후 출력 시 취약하지 않은 것으로 판정

반응형
댓글
반응형
최근에 올라온 글
Total
Today
Yesterday