XSS ( Cross Site Scripting ) 개념 및 실습

2017. 8. 28. 21:28WebHacking/Web




# XSS ( Cross Site Scripting )

클라이언트에 대한 취약점을 이용한 javascript와 HTML 언어를 사용한 불특정 다수에게 하는 공격법이다

공격자가 악의적인 코드를 사용자의 웹 브라우저에 심어놓으면 해당 사용자의 접속시 악성코드가 실행된다

악성코드 유포나 실행 제어 등등 ... 응용가능



1> Stored XSS 

게시글, 쪽지, 댓글, 등에 자바스크립트 코드를 입력하여 작성해놓는다

공격대상자가 해당 웹 페이지를 열어볼 때, 자바스크립트 코드가 실행되어 공격을 당하게 된다

공격방법은 아래 2가지 방법을 포함해 여러가지 방법이 있습니다


#공격방법 1. 게시글 작성시 스크립트 삽입

[ 작성 화면 ]


게시글 작성시 스크립트 코드를 작성해놓았습니다

사용자가 해당 게시글에 접속하면, script코드를 통해서 alert()함수가 실행된다

해당 스크립트 코드는 사용자에게 보여지지 않아 다른 악성코드를 입력했다면 사용자는 공격당한것을 인지하지 못한다


[ 실행결과 ]


#공격방법 2. 메시지 전송시 스크립트 코드 삽입

[ 작성 화면 ]


메시지 전송시 자바스크립트 코드를 포함한 메시지를 전송했습니다

사용자가 해당 메시지를 열어보았을 때, 자바스크립트 코드가 실행됩니다


[ 실행 결과 ]


* 웹 페이지는 HTML코드 사용이 가능한 상태




2> Reflected XSS - 실행시킨 웹 페이지에서 자바스크립트 코드가 발생


[ 실습화면 1 ]


회원가입 페이지입니다. " Check ID "버튼을 클릭하면 아이디 중복확인 페이지가 실행됩니다 ( Check_user_id.php )


[ 실습화면 2 ]


위의 페이지는 http://192.168.6.123/zboard/check_user_id.php 페이지입니다 ( 입력한 아이디 값의 중복을 확인하는 곳 )

위의 페이지는 " user_id " 변수에 사용자가 입력한 아이디값을 DB에 저장된 아이디값들을 비교한다

" user_id " 변수에 자바스크립트 코드를 입력해서 웹 페이지가 실행될 때 자바스크립트 코드가 실행되도록 할 수 있다

Reflected XSS는 실행시킨 웹 페이지에서 자바스크립트가 동작하는 것이다

공격하는 방식은 공격대상자에게 링크를 보내서 접속하도록 하는것


http://192.168.6.123/zboard/check_user_id.php?user_id=<script>Code ... </script> 이런식으로 링크를 보내면 공격임을 들키게 된다

따라서 아래와 같이 Shorted URL을 이용해서 링크를 보내는 공격을 할 수 있다


[ 실습화면 3 ]


[ 실습화면 4 ]


기존 URL과는 다르지만 해당 웹페이지로 이동하는 것을 확인할 수 있다



3> XSS 방어 코드 작성


게시글 본문에 입력되는 자바스크립트 코드를 탐지해서 해당 게시글을 올릴 수 없도록 하겠습니다

" 192.168.6.123/zboard/write.php " 페이지에서 게시글을 작성하면,

" 192.168.6.123/zboard/write_ok.php "  페이지로 게시글이 변수에 저장되어 전송됩니다

" 192.168.6.123/zboard/write_ok.php " 페이지로 넘어온 입력값 중 자바스크립트코드가 있는지 확인하는 코드를 이용해 방어합니다


패턴매칭 함수이용 : preg_match 해당 패턴이 존재하는지? => 존재하면 참 없으면 거짓


$memo 라는 변수를 통해서 게시글을 입력한 내용이 저장되어 넘어옵니다 ( 아래 그림 참조 )

$memo변수에 " <script> " 문자열이 있다면 조건식에 걸립니다

경고창을 출력하고, 게시글이 작성되지 않고 이전 페이지로 넘어가도록 설계했습니다


" 192.168.6.123/zboard/write.php " 페이지 소스코드 입니다

게시글 입력 폼에서 textarea태그의 name=memo 가 확인됩니다


[ 실행결과 ]


자바 스크립트 코드를 게시글 내용에 추가시켜서 작성해보겠습니다



자바스크립트 코드가 게시글 내용에 있으므로 조건식에 걸려서 해당 게시글은 작성되지 않습니다 !

하지만 이런 방어코드를 작성했다고 해서 안전하다고 할 수 없습니다

아래와 같이 대문자를 이용한 방어코드 우회 방법이 있습니다


대문자로 스크립트 코드를 작성한 결과는 아래와 같습니다



게시글이 정상적으로 작성되었고, 게시글을 읽었더니 자바스크립트 코드가 실행되었습니다

XSS는 OWSAP10 에서 3위를 차지할 정도로 아주 강력한 공격기법입니다

방어코드를 우회할 수 있는 여러방법들이 있기때문에 패치를 통한 방어가 필수적입니다



4> XSS 취약점 점검

#1 블랙박스 테스팅

- 소스코드가 공개되어 있지 않은 상황에서 취약점이 있는지 조사한다

#2 화이트박스 테스팅

- 소스코드를 보며 직접 분석해서 취약점을 조사한다

ex) RFI 취약점 점검법

RFI ( Remote File Include ) : php의 Include를 통한 다른 파일을 불러와 사용하는 것을 악용하는 방법

#find . | grep "<?php include"

#find . "$.php" | xargs "require"

include 와 require 문자열이 포함된 파일을 찾고 취약점을 분석한다