XSS(Cross Site Scripting)공격 설명

 

공격 설명

- 악성 스크립트를 통해 사용자의 의도와 상관없는 비 정상적인 동작을 발생시키는 공격  

  (: 쿠키값 노출, 피싱, 악성 코드가 실행 가능한 사이트로 리다이렉트 등)

 

공격 방식

- 공격 방식에는 stored 방식과 reflected 방식 두 가지가 존재함

 

stored 방식 설명

- 클라이언트 측에서 요청 값이 서버로 전달 -> 서버에서 데이터베이스에 저장

이후 클라이언트 측에서 저장된 값을 요청하게 될 때 서버에서 데이터베이스에 저장된 값을 응답 값으로 전달하여  클라이언트 측에서 실행되는 원리

(주로 게시판 글쓰기를 통하여 저장할 수 있는 곳을 공격포인트로 잡음)

 

reflected 방식 설명

- 클라이언트 측에서 요청한 값이 데이터베이스에 저장되지 않고 서버에서 바로 응답 값으로 전달 후

  클라이언트 측에서 실행되는 원리

 

* 차이점

- stored 방식은 클라이언트의 요청 값이 데이터베이스에 저장이 된 후 서버에서 응답 값을 통해 전달 

  refleted 방식은 클라이언트의 요청 값이 데이터베이스에 저장되지 않고 서버 측에서 곧바로 클라이언트    측으로 전달


 

실습

준비사항 : XSS 취약점이 존재하는 페이지, 프록시 툴

* 해당 실습은 진단을 위해 만들어진 페이지에서 진행되었으며, 일반 페이지에서 따라 하시면 안 됩니다.

 

1. 게시글 입력 시 내용에 악성 스크립트 삽입

입력 값에 악성 스크립트 삽입

 

2. 프록시를 이용하여 요청 값 패킷 확인하기

요청 값 패킷에 악성 스크립트 삽입 확인

3. 프록시 응답 값 내 패킷 확인하기

응답 값 패킷에 요청 악성스크립트 삽입 확인

 

4. 등록된 게시글 클릭

악성스크립트가 삽입된 게시글 클릭

 

5. 악성 스크립트 동작 확인

쿠키 값 노출 확인

 

XSS를 이용한 추가 공격법

- 이렇게 노출된 쿠키 값을 세션하이제킹 공격을 통해 타 사용자가 얻게 되었을 경우 획득한 쿠키 값의 계정 권한으로

  페이지를 이용할 수 있다.

 

해결방안 

- XSS의 가장 근본적인 문제점은 입/출력 값 검증이 제대로 이루어지지 않았다는 점이다. 요청 패킷 내 모든 입력값에 대해 악성 스크립트가 삽입될 수 없도록 특수문자, 키워드 필터링이 적용되어야 하며 어떠한 우회 방식을 통해 스크립트가 삽입이 되더라도 실행될 수 없도록 출력 값 검증 또한 이루어져야 한다. 중요한 점은 모든 검증은 우회할 수 없도록 클라이언트 측이 아닌 서버측에서 이루어져야 한다는 점이다.

(요청 패킷 모든 입/출력 값 검증이 필요하다. 쿠키 헤더 부분에서도 발생될 수 있음, 또한 대/소문자, 인코딩 등 까지도 고려하여 검증이 이루어져 우회 되지않도록 해야 함)

 

필터링 

 - 특수문자 : < , >, (, ) 등  / 키워드 : script, onclick 등 스크립트 실행을 위한 키워드

 

악성 스크립트는 cheat sheet를 통해 쉽게 찾아 실습을 해볼 수 있다.

 

세션하이제킹 실습

- xss 공격이 어떠한 공격과 연계가 되는지 확인하기 위해 준비하였다.

위의 글만 보았을 경우 게시글 클릭 시 노출되는 쿠키값을 공격자가 어떻게 탈취해 갈 것인지 의문이 들었을 것입니다.

이를 위해 간단한 세션하이제킹 시나리오를 추가하여 보여주겠습니다.

 

환경 구성

준비물 : 파이썬 설치 (3.~ 대 버전 다운로드), 취약한 페이지

 

1. 파이썬을 이용해 포트를 열고 들어오는 값을 확인

python -m 옵션 이용하여 포트 열기

2. 열어놓은 포트로 쿠키값 보내는 스크립트 등록

자신이 열어 놓은 포트로 접속하는 스크립트 작성

3. 악성 스크립트 게시글 확인

악성 스크립트가 등록된 게시글 확인

4. 게시글 클릭 

게시글 클릭 시 아무 현상 발생 하지 않음

 

5. 넘어오는 쿠키 값 확인

넘어온 쿠키 값 확인

6. 타 사용자 게시글 클릭 시 쿠키 값 확인

타 사용자 쿠키 값 확인 가능

 

이렇게 얻게 된 타 사용자의 쿠키 값을 통해 타 사용자의 권한으로 페이지 접속 가능.


취약점 진단 시 공격 벡터, 진단 방법 

 

1. XSS 공격 벡터 찾기

- XSS 공격 벡터가 되기 위해서는 요청 값의 파라미터 값이 응답 값의 파라미터에 포함이 되는지 확인을 해주셔야 합니다.

요청 값에 asdf 요청

 

응답 값에 asdf 확인

 

요청 값 내 파라미터가 응답 값에 포함되어야 XSS 가능합니다.

 

2. 이후 특수문자, 키워드 필터링 확인

필터링 적용 확인

 

요청 값과 응답 값을 확인하며, 적용되어있는 필터링을 확인해야 합니다.

 

3. 우회할 수 있는 공격 구문을 찾기

 

응답 값을 통해 어떤 식으로 필터링 적용이 되어있는지 확인 후 우회할 수 있는 공격 구문을 찾는 것입니다.

우회 방법은 특수문자 인코딩, fake 파라미터, 페이크 디렉터리, 주석처리 등 다양한 방법이 있기에 시간이 있다면 모두 적용해보면 됩니다. 

 

 

 

 

복사했습니다!