티스토리 뷰
크로스 사이트 스크립팅 ( XSS )
: 게시판, 웹 메일 등에 삽입된 악의적인 스크립트에 의해 페이지가 깨지거나 다른 사용자의 사용을 방해허거나 쿠키 및 기타 개인정보를 특정 사이트로 전송시키는 공격 ( NAVER 지식백과 )
XSS 공격 유형에는 Reflective XSS, Stored XSS, DOM XSS 세 가지가 존재한다.
1. Reflective XSS
- 공격자가 악성 스크립트가 포함된 URL을 클라이언트에게 노출시켜 클릭하도록 유도하여 쿠키 정보를 탈취하거나, 피싱사이트, 불법 광고 사이트로 이동하게 한다.
- JSP나 서블릿 코드에서 사용자의 입력 값을 검증하지 않고 그대로 브라우저로 출력하는 경우 발생한다.
- 텍스트 필드에 <script>alert('xss');</script> 를 입력하여 전송버튼을 눌렀을 때,
Alert 창이 뜨게 된다면 해당 텍스트 필드는 Reflective XSS에 취약점을 가지게 된다.
- XSS로 부터 방어하는 최선의 방법은 HTTP헤더, 쿠키쿼리스트링, 폼필드, 히든필드 등의 모든 인자들에 대하여 허용된 유형의 데이터만을 받아들이도록 입력값 검증을 실시한다.
2. Stored XSS
- 악성 스크립트를 DOCUMENT에 저장하여 해당 DOCUMENT 정보를 이용하는 에플리케이션을 통해, 시스템을 사용하는 모든 사용자들이 해당 스크립트를 실행하게 하여 사용자의 쿠키 정보를 탈취하거나, 피싱사이트, 불법 광고 사이트로 이동하게 된다.
- 악의적 스크립트가 DB에 저장되어 있어, 관리자 혹은 사용자가 해당 정보를 읽어서 보는 경우 스크립트가 실행된다.
3. DOM XSS
- HTML, XML 을 다루기 위한 프로그래밍 API로 AJax 프로그램에서 사용되는 자바 스크립트를 이용하여 브라우저에게 수신된 데이터를 다시 잘라서 Document wrtie 하는 작업을 수행하는 경우 XSS 공격이 가능하게 된다.
- 가능한한 애플리케이션은 DOM 데이터를 처리하기 위한 클라이언트측 스크립트 사용을 자제 해야한다.
4. 시큐어 코딩 기법
- 사용자의 입력값을 HTML 인코딩하여 반환하는 방식은 악의적인 사용자가 삽입한 스크립트가 다른 사용자에게 실행 가능한 형태로 전달되지 않기 때문에 유용하다.
- HTML 인코딩이 필요한 문자들
FROM |
TO |
FROM |
TO |
< |
< |
( |
( |
> |
> |
) |
) |
# |
# |
& |
& |
" |
" |
' |
' |
5. 외부 프리 라이선스 라이브러리를 사용하여 XSS 취약점 제거
- 네이버에서 제작 / 배포하고 있는 Lucy-XSS 라이브러리를 이용
- Lucy-XSS Filter는 악의적인 XSS 공격으로부터 웹 애플리케이션을 보호하는 기능을 화이트리스트 설정 방식으로 구현했다.
- 입력 파라미터로 전달되는 데이터의 경우 XSS 코드를 포함하고 있는지 판단하기 어렵기 때문에 Lucy-XSS Filer을 사용하여 필터링 하는 것은 어렵다.
- Lucy-XSS Filter는 출력 부분을 담당하는 로직에서 사용하면 좋을 것이다.
6. Lucy-XSS를 이용한 Secure Coding
https://github.com/naver/lucy-xss-filter 에서 Download ZIP
conf 폴더에 있는 lucy-css-superset.xml 파일을 프로젝트에 붙여 넣는다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36 |
@RequestMapping("/board/article/{id}")
public ModelAndView detail(@PathVariable String id) {
BoardListVO boardList = boardService.getBoardById(id);
ModelAndView view = new ModelAndView("board/detail");
if(boardList != null) {
// XSS 게시판의 제목과 내용에 대해 XSS HTML 인코딩
String content = boardList.getList().get(0).getContent();
String subject = boardList.getList().get(0).getSubject();
XssFilter xssFilter = XssFilter.getInstance("/lucy-xss-superset.xml");
content = xssFilter.doFilter(content);
subject = xssFilter.doFilter(content);
boardList.getList().get(0).setContent(content);
boardList.getList().get(0).setSubject(subject);
view.addObject("article", (BoardVO)boardList.getList().get(0));
// XSS 게시판 댓글에 대해 XSS HTML 인코딩
List<ReplyVO> replyList = replyService.getAllReplyByBoardId(id);
content = "";
for ( ReplyVO reply : replyList ) {
content = reply.getContent();
content = xssFilter.doFilter(content);
reply.setContent(content);
}
view.addObject("replyList", replyList);
}
return view;
} |
cs |
'Secure Coding' 카테고리의 다른 글
안전하지 않은 예외처리 (2) | 2016.05.02 |
---|---|
파일 업로드/다운로드 취약점 (0) | 2016.05.02 |
크로스 사이트 요청 위조 [ CSRF ] (0) | 2016.04.29 |
로그인 시도 횟수 제한 (0) | 2016.04.28 |
패스워드 정책 (0) | 2016.04.28 |
- Total
- Today
- Yesterday
- DP
- REDIRECT
- AlertDialog.Builder
- jsp
- java
- BFS
- table
- Spring
- 이클립스
- onBackPressed
- Baekjoon Online Judege
- order by
- 안드로이드 스튜디오
- DFS
- RequestMapping
- sort
- algorithm
- restfb
- controller
- INSERT
- list
- onPostExecute
- indexOf
- mybatis
- 안드로이드 비콘
- 예외처리
- maven
- 자바
- boj
- servlet
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |