XSS (Cross-Site Scripting)
1. XSS란?
크로스 사이트 스크립팅 공격은
공격자가 악의적인 스크립트를 웹 애플리케이션에 삽입한 후
웹 사용자의 웹 브라우저에서 해당 스크립트가 실행되도록 만드는 공격이다.
2. 다른 공격들과의 차이점
다른 공격들은 취약점을 갖고 있는 서버측을 공격하지만
XSS는 서버의 취약점을 이용하여 클라이언트측을 공격한다.
3. XSS의 종류
기준 : 공격자가 삽입한 스크립트 코드가 언제 실행되는지에 따라 구분된다.
Stored XSS : 서버에 저장
Reflected XSS : 서버에서 반사
Dom Based XSS : 클라이언트 측에서 조립
4. XSS의 주요 피해 사례
세션 쿠키 탈취
시스템 관리자 권한 탈취
악성코드 다운로드
5. XSS의 발생 가능 위치
사용자의 입력이 서버의 응답에 포함되는 모든 곳에서 발생 가능하다.
6. POC Script
alert(1) : 알림 띄우기
prompt(1) : 대화상자 띄우기
Stored XSS
1. 특징
스크립트가 웹 서버에 저장되었다가 실행된다.
웹 서버에 저장되기 때문에 피싱 과정이 필요 없다.
스크립트가 삽입되는 곳과 삽입한 스크립트가 실행되는 곳이 다르다.
해당 페이지를 접속하는 모든 사용자가 공격당할 수 있기 때문에 Reflected XSS 비해 더 심각하다.
2. Stored XSS 시나리오
공격자는 웹 사이트의 방명록 등에 악의적인 스크립트를 삽입한 글을 남긴다.
다른 사용자들이 방명록을 방문하여 공격자가 작성한 게시물을 읽는다.
이때 게시물에 저장되어 있던 스크립트가 사용자에게로 전달된다.
웹 브라우저는 스크립트를 실행하여 세션 쿠키가 공격자에게 전달된다.
공격자는 세션 쿠키를 이용하여 해당 사용자 권한으로 웹사이트를 접속한다.
3. Stored XSS 절차
삽입한 글자들이 출력되는 곳을 확인한다.
HTML 특수문자를 필터링하는지 확인한다.
POC Script를 삽입한다.
Reflected XSS
1. 특징
스크립트를 웹 서버에 저장하지 않는다.
웹 서버에서 반사되는 데이터를 활용한다.
피싱 과정을 필요로 한다.
스크립트를 삽입하는 곳과 삽입된 스크립트가 응답되는 곳이 같다.
URL을 통해 공격한다.
2. Reflected XSS
먼저, 공격자는 이메일 등을 이용하여 피해자를 피싱한다. 이메일 뿐만 아니라 게시판, SNS 등 공격자가 링크를 남길 수 있는 곳이면 어디든 피싱에 이용할 수 있다. 피싱 시, 세션 쿠키를 탈취하는 스크립트를 삽입한 HTTP 요청 링크를 포함시킨다.
피해자가 이 링크를 클릭하게 되면 스크립트가 삽입된 요청이 웹 사이트로 전송된다.
이때 Reflected XSS 취약점이 있는 웹 사이트는 입력된 스크립트를 반사하여 그대로 웹 페이지에 출력한다.
웹 페이지를 읽는 웹 브라우저는 자동으로 스크립트를 실행하게 되고, 그 결과 세션 쿠키를 공격자에게 전달한다.
공격자가 이 세션 쿠키를 사용하면 해당 피해자의 권한으로 접속할 수 있게 된다.
3. Reflected XSS 절차
삽입한 글자들이 출력되는 곳을 확인한다.
HTML 특수문자를 필터링하는지 확인한다.
POC Script를 삽입한다.
DOM Based XSS
1. 특징
클라이언트 측 브라우저에서 조립된다.
웹 서버와 관계없이 브라우저에서 발생한다.
웹 서버에서 전송된 HTTP 응답 값에는 공격자의 스크립트가 포함되어 있지 않다.
공격자의 스크립트는 DOM 객체 생성 시 클라이언트 측 스크립트에 포함된다.
URL을 통해 공격한다.
2. DOM Based XSS 시나리오
먼저, 공격자는 피해자를 피싱하여 DOM Based XSS 공격 페이로드가 포함된 링크를 클릭하도록 한다.
피해자가 해당 링크를 클릭하면, DOM Based XSS 취약점이 있는 브라우저는 해당 페이로드가 포함된 웹 페이지 요청을 웹 사이트에 전송한다.
웹 서버에서 해당 페이지로 응답하면 브라우저는 페이지에 대한 DOM 객체를 생성한다.
브라우저에 의해 공격자의 악성 스크립트가 실행된다.
3. DOM Based XSS 절차
삽입한 글자들이 조립되는지 확인한다.
HTML 특수문자를 필터링하는지 확인한다.
POC Script 또는 Event Handler를 삽입한다.
ex) <img src=x onerror=”alert(xss)”>
URL 인코딩을 고려하여 띄어쓰기는 %20으로 표기해준다.