본문 바로가기

교육 및 자격증/스터디

GH(NOB); XSS(크로스 사이트 스크립트)

728x90

 

1. XSS란?

 : 웹 애플리케이션 보안 취약점 중 하나로, 공격자가 웹 페이지에 악의적인 스크립트 코드를 삽입하여 사용자의 브라우저에서 실행되도록 하는 공격 기술이다.

 - 이 공격 기술을 이용하면 사용자의 세션 정보, 쿠키정보를 탈취하거나 사용자가 입력한 정보를 가로채거나, 웹 페이지의 내용을 조작할 수 있다.

 

#공격 방식 예)

<script>alert(1)</script> //이처럼 스크립트로 감싸는 것이 가장 기본적인 형태다

<script>alert(document.cookie)</script> //alert안에 값을 document.cookie로 바꾸면 자바스크립트 속성으로 해당 쿠키를 출력하는 것을 악용한 것이다.

다른 예로 <svg>, <iframe>, <audio>, <a> 등 다양한 태그를 활용하여 변형공격을 수행할 수 있다.

 

#PHPSESSID란?

 : PHP서버를 사용할 때 생성되는 세션 ID를 저장하는 쿠키의 이름으로 세션을 유지하기 위한 값이 저장된다.

 - XSS공격으로 쿠키값(document.cookie활용)을 얻을 때 나오는 값으로 다음과 같은 값을 얻는다.

PHPSESSID = didi12314.. 

document.cookie = "sessionid=123456789; domain=example.com; path=/";

-> 쿠키를 생성할 때 사용하는 코드로 해당 도메인에 대한 쿠키 값이란 것을 알 수 있다.

 

 이를 통해서 공격자는 세션 하이재킹 공격, CSRF 공격, 웹사이트 변조 등의 공격을 행한다.

 

2. 종류

□ Stored XSS(저장형 XSS)

 : 공격자가 취약한 웹 서버에 악성 스크립트를 저장(게시판)해 놓으면 희생자가 해당 자료를 요청할 때 해당 악성 스크립트가 삽입된 응답 페이지가 전달되어 클라이언트 측에서 동작하는 방식

 - 예)

1. 악성 스크립트를 DB에 저장[게시판 같은 곳에 악성 <script>문을 넣고 저장한다.]

2. 희생자가 악성스크립트인지 모르고 게시판에서 해당글을 클릭하여 웹서버에 읽기 요청

3. 웹서버가 악성 스크립트를 포함한 희생자의 요청에 응답

4. 감염

□ Reflected XSS(반사형 XSS)

 : 외부에 있는 악성 스크립트(외부 사이트 또는 이메일 등에 악성 스크립트가 포함된 링크 등)가 희생자 액션(예에서 2번에 해당)에 의해 취약한 웹서버로 전달되고, 웹서버의 응답 페이지에 해당 악성 스크립트가 삽입되어 희생자 측에서 동작하는 방식.

 - 악성 스크립트를 DB에 저장하지 않고 희생자가 요청하면 그 요청에 대한 반환값을 활용

□ DOM based XSS(DOM 기반 XSS)

 : DOM(Document Object Model)은 문서 객체 모델로 웹페이지(HTML, XML, SVG 등) 내에 있는 모든 객체들을 조작, 관리할 수 있는 계층 구조 형태의 모델을 말한다.

 즉, 희생자의 웹 브라우저에서 응답 페이지에 포함된 자바 스크립트(정상적인 스크립트)가 동작하면서 DOM 객체를 실행할 때 URL 등에 포함된 악성 스크립트가 동작하는 방식이다.

 

 - DOM은 웹 브라우저가 HTML 문서를 로드하면, 해당 문서의 모든 요소와 속성을 체로 생성하여 메모리에 저장

 - DOM을 통해서 HTML 문서를 계층적으로 보면서 컨텐츠를 동적으로 변경할 수 있다.

 

 

#Stored XSS vs DOM 기반 XSS

  • Stored XSS : 응답 페이지에 악성 스크리브가 포함되어 웹 브라우저로 전달되어 실행

vs

  •  DOM 기반의 XSS :  응답 페이지에 관계없이 웹 브라우저에서 발생(DB에 저장하지 않음)

 

# Reflected XSS vs DOM 기반 XSS

 - 비슷하지만 공격 방법과 발생하는 위치에서 차이가 있다.

공통점으로는 악성스크립트를 둘다 DB에 저장하지 않는다.

  • Reflected는 주로 입력 폼 등에서 사용자로부터 입력 받은 값을 서버로 전달할 때 발생한다.
  1. 공격자가 악성 스크립트 포함된 링크 메일을 희생자에게 전송
  2. 희생자가 메일을 클릭 시 서버가 클라이언트의 요청을 받음
  3. 서버는 악성 스크립트가 담긴 클라이언트의 요청을 검증 없이 그대로 응답
  4. 악성 스크립트 실행

 

  • DOM-based는 웹 페이지에서 동적으로 생성되는 HTML 문서에 악성 스크립트가 포함될 경우 발생한다.
  1. 공격자가 악성스크립트 포함 링크 삽입한 메일을 희생자에게 전송
  2. 희생자가 메일 클릭[url = 악성스크립트]하면 해당 url서버로 요청
  3. 악성 스크립트가 없는 응답페이지웹서버 응답(응답 페이지 자체는 악성 스크립트를 포함하지 않지만 자바스크립트가 DOM 객체를 통해 요청 URL을 default 파라미터를 참조하면서 악성 스크립트가 동작하게 된다.)
  4. URL 쿼리 스트링 상의 파라미터(악성 스크립트)를 응답 페이지의 자바스크립트가 로컬에서 동작하면서 참조하고 희생자측에서 악성 스크립트가 동작

즉,

Reflected는 서버에서 입력 값에 대한 검증이나 필터링이 부족한 경우에 발생하고

DOM-based는 클라이언트 측 자바스크립트 코드에서 입력 값을 그대로 출력하는 경우에 발생한다.

 

3. CSRF와의 공통점, 차이점

XSS와 CSRF는 모두 웹 보안 공격 방식이지만, 공격방법과 목적이 다르다.

CSRF 설명

https://choimungu.tistory.com/212

 

 - 공통점

둘다 웹 보안 취약점으로 사용자가 브라우저를 통해 웹 페이지와 상호작용할 때 발생한다.

둘다 같이 <script>나 입력 가능한 폼(img태그 src속성)을 활용하여 공격한다.

 

 - 차이점

  • CSRF는 서버를 공격하고 XSS는 클라이언트를 공격한다.
  • CSRF는 인증된 상태에서 악의적인 요청을 보내는 공격(권한 도용)이고, XSS는 웹 페이지에 스크립트를 삽입하여 사용자의 브라우저에서 실행되게 만드는 공격(쿠키, 세션 갈취, 웹사이트 변조..)이다.
  • CSRF 성공 조건으로 위조 요청을 전송하는 서비스에 희생자가 로그인 상태여야하고 희생자는 공격자가 만든 사이트에 접속해야 한다. 반면에 XSS는 공격 성공 조건이 없다.

 

4. 동향

OWASP TOP10을 보면 2017년에서 A7이였던 XSS가 2021년들어 Injection과 병합하여 A3로 올라왔다.

즉 위험성이 증가했다는 것이다.

https://choimungu.tistory.com/202

 

5. 대응책

1. 사용자 입력값에 대한 검증 "서버단에서" 실시

  사용자가 웹 프록시 툴을 활용하여 쉽게 우회가 가능하기 때문

  ex) <, >, ; 같은 문자들에 대한 검증

 

2. 사용자 입력 문자열에서 특수문자를 일반문자로 치환하여 처리(이스케이프처리)한다.

htmlspecialchars() 함수는 html 문법상 특별한 의미를 가지는 특수문자의 기능을 제거하고 일반문자(HTML Entity)로 처리해주는 함수로 HTML Entitiy로 변환하여 출력해준다.(치환)

HTML 특수문자 HTML Entity 의미
<, > &lt;, &gt; HTML 태그 기호
& &amp; HTML Entity 표현 기호
", ' &quot;, &#039; 속성값을 표현

XSS 공격이 의도하지 않은 HTML/스크립트 태그들을 사용하기 때문에 이를 제거하거나 치환해주는 함수를 사용하면 효과적으로 차단할 수 있다.

 

3. 출력값 처리

 - 입력값에 대한 검증과 마찬가지로 출력되는 값 역시 안전한 형태로 출력되도록 처리한다.

 

4. 보안 헤더 설정

웹 애플리케이션에서 HTTP 응답 헤더를 통해 보안 헤더를 설정할 수 있다. XSS 필터링 기능 활성화

 

5. Content Security Policy(CSP) 설정

 CSP는 웹 사이트에서 허용되는 리소스들을 명시하는 보안 기술이다.

CSP를 사용하면, 허용되지 않는 도메인의 스크립트 파일 실행을 차단할 수 있다.

 

6. 사용자 세션 관리

XSS 공격은 사용자 세션 탈취가 목표이기도 하므로 쿠키 보안 설정 같은 방법으로 사용자 세션관리를 한다.

 

 

 - 3줄요약

XSS는 악성스크립트를 삽입하는 공격으로 개발할 때 문자 필터링을 하면 웬만하면 막힌다.

그럼에도 위험해서 owasp top10 A3에 있다.

XSS와 CSRF는 공격 코드는 비슷하지만 공격방법과 목적이 다르다.

 

 - 참고

 chatGPT

정보보안기사 실기(알기사)책

https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=visioner7&logNo=120162406412

https://junhyunny.github.io/information/security/dom-based-cross-site-scripting/

https://lucete1230-cyberpolice.tistory.com/23