Notice
Recent Posts
Recent Comments
Link
IgnatiusHeo
구현단계 보안약점 제거 기준-크로스사이트 스크립트 본문
작성일: 230703
※ 본 게시글은 학습 목적으로 행정안전부·KISA의 소프트웨어 보안약점 진단 가이드, 소프트웨어 개발보안 가이드를 참고하여 작성하였습니다.
정리 내용: 소프트웨어 보안약점 진단 가이드(211~222p)
구분 | - 입력데이터 검증 및 표현 |
설계단계 | - 웹 서비스 요청 및 결과 검증 https://cryptocurrencyclub.tistory.com/93 |
개요 | 웹 페이지에 악의적인 스크립트를 포함시켜 사용자 측에서 실행되게 유도할 수 있다. 예를 들어, 검증되지 않은 외부 입력이 동적 웹페이지 생성에 사용될 경우, 전송된 동적 웹페이지를 열람하는 접속자의 권한으로 부적절한 스크립트가 수행되어 정보유출 등의 공격을 유발할 수 있다. |
진단 세부사항 (설계단계) |
① 사용자 입력값을 동적 생성 응답페이지에 사용하는 경우 XSS 필터링을 수행 후 사용해야 하며 사용자 입력값에 스크립트의 포함 여부를 검증하도록 설계하고 있는지 확인한다. ㅇ XSS 필터 컴포넌트 설계 확인 → 외부라이브러리를 사용하는 경우 안전한 필터링 가능 여부 확인 → XSS필터 생성 시 필터링 규칙이 안전한 화이트리스트 정책이 적용되도록 설계되었는지 확인 ㅇ 외부입력값에 대한 XSS 필터링 방법이 정의되어 있는지 아키텍처설계서 등에서 확인 → Filter 사용: 필터링 적용 대상이 웹서버 설정파일에 정확히 정의되어 있는지 확인 → 개별 프로그램에서 입력값 필터링 수행: 필터링 코딩 규칙이 개발 가이드에 정의되어 있는지 확인 → 개별 프로그램에서 출력값에 대해 필터링 수행: 필터링 코딩 규칙이 개발 가이드에 정의되어 있는지 확인 ㅇ XSS 발생 가능한 입력값에 대한 필터링 적용 여부 확인 → <IMG SRC=”javascript:alert(‘XSS’);”> , <IMG “””><SCRIPT>alert(“XSS”)</SCRIPT>”> , <IMG SRC=”jav
ascript:alert(‘XSS’);”> 등 ② DB조회결과를 동적 생성 응답페이지에 사용하는 경우 HTML인코딩 또는 XSS 필터링 수행 후 사용해야 하며 외부 입력값이 사용되는 경우 사용자 입력값에 스크립트 포함 여부를 검증하도록 설계하고 있는지 확인한다. ㅇ XSS 필터 컴포넌트 설계 확인 → 외부라이브러리를 사용하는 경우 안전한 필터링 가능 여부 확인 → XSS필터 생성 시 필터링 규칙이 안전한 화이트리스트 정책이 적용되도록 설계되었는지 확인 ㅇ DB조회결과를 응답페이지 생성에 사용 시, XSS필터 또는 HTML 인코딩을 적용하여 응답페이지를 생성하도록 코딩 규칙이 개발가이드에 정의되어 있는지 확인 ㅇ DB조회의 결과값에 대해 XSS필터링이 적용되어 안전한 값만 응답에 사용되는지 점검하기 위한 테스트 계획이 수립되어 있는지 확인 |
보안대책 (구현단계) |
외부입력값에 스크립트가 삽입되지 못하도록 문자변환 함수 또는 메서드를 사용하여 < > & “ 등을 < > & "로 치환한다. HTML태그를 허용하는 게시판에서는 허용되는 HTML 태그들을 화이트리스트로 만들어 해당 태그만 지원하도록 한다. |
진단방법 (구현단계) |
① 웹 페이지로 출력하는 변수값이 존재하는지 확인하고, ② 해당 변수값이 외부 입력값 또는 사용자 입력 데이터 폼에 의해 저장된 데이터 베이스 값인지 확인한 후 변수값이 적절하게 필터를 거치는지 확인한다. 적절한 필터를 거친 후 출력되는 경우나 프레임워크 등을 사용하여 자체적인 검증 기능이 존재하면 안전하지만 그 외에는 취약하다. |
다. 코드예제
ㅇ 분석
1: <% String keyword = request.getParameter("keyword"); %>
2:
3: 검색어 : <%=keyword%>
4:
5: 검색결과 : ${m.content}
6: <script type=“text/javascript”>
7:
8: document.write(“keyword:” + <%=keyword%>);
9: </script>
ㅇ 설명
1. 1~3: Reflected XSS: Keyword 값이 리다이렉트되는 악성 스크립트일 가능성이 있음
2. 5~6: Stored XSS: 검색 결과로 받는 content가 악성 스크립트일 가능성이 있음
3. 8~9: DOM 기반 XSS: 외부에서 입력받은 악성 스크립트가 포한된 URL 파라미터 값이 서버를 거치지 않고, DOM 생성의 일부로 실행되면서 공격
ㅇ 수정
1: <% String keyword = request.getParameter("keyword"); %>
2: // 방법1. 입력값에 대하여 스크립트 공격가능성이 있는 문자열을 치환한다.
3: keyword = keyword.replaceAll("&", "&");
4: keyword = keyword.replaceAll("<", "<");
5: keyword = keyword.replaceAll(">", ">");
6: keyword = keyword.replaceAll("\"", """);
7: keyword = keyword.replaceAll("'", "'");
8: keyword = keyword.replaceAll("/"", "/");
9: keyword = keyword.replaceAll("(", "(");
10:keyword = keyword.replaceAll(")", ")");
11:검색어 : <%=keyword%>
12://방법2. JSP에서 출력값에 JSTL c:out 을 사용하여 처리한다.
13:<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
14:<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
15:검색결과 : <c:out value="${m.content}"/>
16:<script type="text/javascript">
17: //방법3. 잘 만들어진 외부 라이브러리를 활용(NAVER Lucy-XSS-Filter, OWASP ESAPI,
OWASP Java-Encoder-Project)
18:document.write("keyword:“ +
<%=Encoder.encodeForJS(Encoder.encodeForHTML(keyword))%>);
19: </script>
ㅇ 설명
1. 3~10: 입력값에 대해 필터링 후 변경
2. 13~16: c:out을 사용해서 컨텐츠값 출력
3. 18: Encoder 사용해서 키워드값 안전하게 처리
ㅇ 분석
1: int XSS(int argc, char* argv[]) {
2: unsigned int i = 0;
3: char data[1024];
4: …
5:
6: cgiFromString(“user input”, data, sizeof(data));
7: fprintf(cgiOut, “Print user input = %s<br/>”, data);
8: fprintf(cgiOut, “</body></html>\n”);
9: return 0;13:
10: }
ㅇ 설명
1. r6에서 받은 data값에 대한 검증 X (여기서 검증해야 할 문자열은 HTML에서 사용하는 구분자인 <>로 보임)
2. r7에서 그대로 출력
ㅇ 수정
1: int XSS(int argc, char* argv[]) {
2: unsigned int i = 0;
3: char data[1024];
4: …
5:
6: cgiFromString(“user input”, data, sizeof(data));
7: if(strchr(p, ‘<’)) return;
8: if(strchr(p, ‘>’)) return;
9: fprintf(cgiOut, “Print user input = %s<br/>”, data);
10: fprintf(cgiOut, “</body></html>\n”);
11: return 0;13:
12: }
ㅇ 설명
1. r7 r8에서 strchr을 써서 <나 >가 있으면 리턴하는 코드를 추가함
끝.
'자격 > SW보안약점진단원' 카테고리의 다른 글
구현단계 보안약점 제거 기준-위험한 형식 파일 업로드 (0) | 2023.07.04 |
---|---|
구현단계 보안약점 제거 기준-운영체제 명령어 삽입 (0) | 2023.07.03 |
구현단계 보안약점 제거 기준-경로 조작 및 자원 삽입 (0) | 2023.07.03 |
구현단계 보안약점 제거 기준-코드 삽입 (0) | 2023.07.03 |
구현단계 보안약점 제거 기준-SQL 삽입 (0) | 2023.07.03 |