SW개발보안과정

Overloper·2020년 11월 10일
1

SW_개발보안과정

목록 보기
5/7

5차시 : 취약점 유형 - 위조된 요청

크로스사이트 스크립트 취약점 개요


크로스사이트 스크립트(XSS) 취약점 개요
검증 되지 않은 외부 입력 값을 응답의 일부로 사용하는 경우 사용자 브라우저에서 악의적인 스크립트가 실행될 수 있는 보안 취약점

발생원인
외부에서 입력된 사용자 입력값을 검증하지않고 그대로 응답페이지 생성에 사용하거나,
DB에 저장된 데이터를 읽어서 출력할 때 DB에서 읽어온 값을 검증하지 않고 응답 페이지 생성에
사용하거나
자바스크립트로 DOM구조를 조작하여 페이지를 변경하는 경우 변경되는 내용을 검증하지 않고 브라우저에 표시하는 경우 발생

영향
이 취약점으로 인해 해당 사용자PC는 악성코드를 다운로드 받아 좀비PC가 되거나,
사용자가 피싱 사이트로 접속되게 하거나, 사용자의 중요 정보를 공격자에게 전송하는 침해사고 발생


Reflective XSS 취약점 개요
외부 입력값을 검증 없이 응답 페이지 생성에 사용하는 경우
웹 페이지에 악의적인 스크립트를 포함시켜 웹페이지를 열람하는 접속자의 권한으로 부적절한 스크립트가 수행되어 정보유출 등의 공격을 유발 함.

Stored XSS 취약점 개요
DB에 저장된 값을 검증 없이 응답페이지 생성에 사용하는 경우
공격자가 미리 취약한 서버에 악의적인 스크립트가 포함된 정보를 저장해서 일반 사용자들이 해당 정보를 조회하는 경우 접속자의 권한으로 부적적한 스크립트가 수행되어 정보 유출 등의 공격을 유발함


크로스사이트 스크립트 대응 방법

제한적인 입력값 허용
XSS 공격으로부터 웹 애플리케이션을 방어하는 최선의 방법은 클라이언트 프로그램과 서버 애플리케이션에서 HTTP헤더, 쿠키, 쿼리 스트링, 폼 필드, 히든 필드 등의 모든 인자들에게 대해 허용된 유형의 데이터만을 받아들이도록 정규식을 이용하여 제한된 입력값을 받아서 처리

제한적인 출력값 허용
입력값이나 DB에서 조회한 결과 값을 응답으로 내보내기전에 XssFilter를 적용하여 동적으로 스크립트가 실행될 수 있는 요소들은 HTML인코딩을 적용하여 출력

필터링 되어야 하는 문자들

Spring MVC 구조


크로스사이트 스크립트 보안약점 제거를 위한 시큐어코딩

안전하지 않은 코드

<% String customerID = request.getParameter("id"); %>
요청한 사용자: <%=customerID%>
처리결과: ${m.content}

안전한 코드

// 방법1. 서블릿에서 출력값에 HTML 인코딩 적용
String cleanData = input.replaceAll("<", "&lt;").replace(">", "&gt;"); out.println(cleanData);
// 방법2. JSP에서 출력값에 JSTL HTML 인코딩 함수 적용
<textarea name="content">${fn:escapeXml(model.content)}</textarea>
// 방법3. JSP에서 출력값에 JSTL Core 출력 포맷을 사용하여 텍스트로 처리
<textarea name="content"><c:out value="${model.content}"/></textarea>
// 방법4. 잘 만들어진 외부 XSSFilter 라이브러리를 활용하여 출력값에 대해 필터링을 적용
XssFilter filter = XssFilter.getInstance("lucy-xss-superset.xml"); out.append(filter.doFilter(data));

내용 정리

1. 외부입력값을 사용하여 동적으로 응답 페이지를 생성하는 경우 입력값 검증을 수행하지 않으면 공격자가 의도하는 스크립트가 사용자의 브라우저에서 실행될 수 있습니다.
2. 이러한 외부 입력값은 반드시 안전하게 필터링해서 응답에 사용할 수 있도록 프로그래밍 해야 합니다.

profile
세계최초 샤머니즘형 프로그래머🛐

0개의 댓글