티스토리 뷰

크로스 사이트 스크립팅 ( 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 

&lt; 

&#40 

&gt; 

&#41 

&#35 

&#38 

&quot; 

&apos; 




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
«   2024/04   »
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
글 보관함