본문 바로가기
정보보안/Web Hacking

[Web hacking] XSS(Cross-Site Scripting)

by Yoonsoo Park 2025. 1. 10.

1. XSS(Cross-Site Scripting)의 정의 

 XSS(Cross-Site Script)는 웹 애플리케이션의 취약점을 이용해 공격자가 악성 스크립트를 삽입하고, 이를 통해 사용자의 브라우저에서 해당 스크립트가 실행되도록 하는 공격 기법이다. 이를 통해 공격자는 사용자의 세션 쿠키, 개인 정보 등을 탈하거나, 웹 페이지를 변조하는 등의 악의적인 행위를 수행할 수 있다. 

 

**세션 쿠키를 탈취하면 어떻게 악용할 수 있을까?

먼저 쿠키란 웹 사이트가 사용자의 인터넷 브라우저에 저장하는 작은 텍스트 파일로, 이 쿠키는 웹 사이트가 사용자 선호 설정, 로그인 정보 등을 기억하게 도와준다. 세션 쿠키는 웹 사이트에서 로그인 상태와 같은 세션 정보를 유지하는데 사용된다. 세션 쿠키를 탈취할 경우 다음과 같이 사용자를 가장하여 여러 악의적인 행위를 수행할 수 있다. 

 

1) 사용자 가장

  • 탈취한 세션 쿠키를 이용해 해당 사용자인 것처럼 웹 사이트에 접근할 수 있다. 이를 통해 개인 정보 열람, 민감한 데이터 수정, 금전적 거래 등을 수행할 수 있다

2) 권한 상승

  • 특정 사용자의 세션 쿠키를 탈취해 관리자 권한을 획득하면, 웹 사이트 전체에 피해를 제어하거나, 타 사용자의 정보를 열람 할 수 있다

 

 

2. XSS(Cross-Site Scripting)의 특징

1) 웹 애플리케이션이 사용자 입력을 제대로 검증하지 않거나 필터링하지 않을 때 발생한다

 

2) 웹 사이트의 관리자가 아닌 공격자가 이러한 취약점을 이용해 웹 페이지에 스크립트를 삽입한다

 

3) 불특정 다수가 공격 받을 수 있고, 서버가 직접적으로 공격 받는 것이 아니기 때문에 관리자가 인지하는 데까지 오랜 시간이 소요되는 경우가 생겨 피해 규모가 대규모로 발생할 수 있다

 

 

3.  XSS(Cross-Site Script)의 공격 유형

1) Stored XSS

  • 공격자가 악성 스크립트를 서버에 저장하고, 해당 스크립트가 다른 사용자들에게 전달되어 실행되는 형태
  • 주로 게시판, 댓글 등에 악성 스크립트 삽입
게시물에 다음의 스크립트를 저장
#기본적인 스크립트 삽입
<script>
    alert('이 웹사이트는 취약합니다!');
</script>

#링크를 이용하는 방법
<a href ="javascript:alert('XSS')"> XSS </a>

#이미지 오류를 이용하는 방법
<img src="#" onerror="alert('xss 공격');">

 

2) Reflected XSS

  • 사용자가 입력한 데이터가 서버를 거쳐 다시 사용자에게 반사되어 반환될 때 발생
  • URL 파라미터 등을 통해 전달된 악성 스크립트가 즉시 실행되는 방식
URL에 악의적인 코드가 포함된 링크를 생성 => 클릭하면 스크립트 실행
http://example.com/search?query= <script>alert('XSS')</script>

 

3) DOM-based XSS

  • 서버가 아닌 클라이언트 측, 즉 브라우저에서 동적으로 생성된 DOM(Document Object Model) 요소에 의해 발생하는 공격이다. 이 유형의 XSS는 서버와 상관없이 클라이언트 측 자바스크립트 코드가 잘못된 사용자 입력을 DOM에 직접 반영하면서 발생한다. 
피해자가 아래 URL을 클릭하면, 클라이언트 측 코드가 innerHTML을 통해 DOM에 스크립트를 삽입하여 실행
http://example.com?username=<script>alert('XSS')</script>

#클라이언트 측 Javascript 코드의 일부
document.getElementbyId("query").innerHTML = userInput

 

 

4. XSS(Cross-site Script) 방어 기법

1) 사용자 입력 검증 및 필터링

  • 사용자 입력을 받는 모든 곳에 화이트리스트 기반 접근 방식(허용한 것 제외 모두 차단)을 통해 철저히 검증 및 필터링
  •  HTML 특수문자를 이스케이프(텍스트 처리)하여 스크립트가 실행되지 않게 한다
function validateInput(input){
	var regex = /^[a-zA-Z0-9]+$/;
    if(!regex.test(input)){
    	throw new Error('Invalid input');
    }
	return input;
}

 

2) 출력 시 특수 문자 이스케이프

function escapeHTML(str){
	return str.replace(/[&<>"']/g, function(match){
    	return {
        '&': '&amp;',
        '<': '&lt;',
        '>': '&gt;',
        '"': '&quot;',
        "'": '&#39;',
        }[match];
    });
}

 

 

3) 콘텐츠 보안 정책(Content Security Policy, CSP) 사용

  • CSP는 브라우저가 신뢰할 수 있는 소스만 실행할 수 있도록 제한하여 XSS공격을 방지하는 도구이다
#해당 정책은 스크립트가 'self'(현재 도메인)에서만 로드될 수 있도록 허용한다
Content-Security-Policy: script-src 'self';

 

4) HTTPOnly 쿠키 및 Secure 쿠키 사용

  • 쿠키에 HTTPOnly 속성을 추가하여 클라이언트 측 Javascript에서 쿠키에 접근할 수 없게 한다
  • Secure 쿠키를 설정하면 HTTPS를 통해서만 쿠키가 전송된다 
Set-Cookie: sessionId=abc123; HttpOnly; Secure;

 

5) WAF(Web Application Firewall) 사용

  • XSS 패턴을 탐지하고 차단하도록 WAF 구성 

 

 

 

**궁금한 점 

1. 악성 스크립트가 저장된 게시물을 열기만 해도 악성 스크립트가 실행되는 이유

  • 브라우저는 서버로부터 HTML 문서를 로드하고 랜더링하는 과정에서 <script> 태그를 만나면 자바스크립트를 실행한다 

2. 랜더링이란?

  • 브라우저가 웹 페이지의 코드를 사용자에게 보이는 화면으로 변환하는 과정 
  • 랜더링 과정은 다음과 같은 단계를 거친다 
    • 1) HTML 파싱(parsing): HTML 파일을 분석하여 DOM이라는 트리 구조를 생성
    • 2) CSS 파싱: CSS 파일을 분석하여 CSSOM(CSS Object Model)을 생성한다
    • 3) Javascript 실행: JS는  DOM을 조작하거나, 동적으로 콘텐츠를 추가할 수 있음
    • 4) DOM과 CSSOM을 결합해 화면에 실제로 표현할 요소를 담은 랜더 트리를 생성
    • 5) 레이아웃: 랜더 트리의 각 요소의 위치와 크기를 계산
    • 6) 페인팅: 계산된 요소를 화면에 표현

3. DOM(Document Object Model)이란?

  • HTML 문서를 브라우저가 이해할 수 있는 계층적 트리 구조로 표현하는 것이다. 
html
<html>
  <body>
    <h1>안녕하세요!</h1>
  </body>
</html>
DOM
- html
  - body
    - h1: "안녕하세요!"

 

 

 

 

##XSS 필터링 우회 기법 정리##

https://www.dohyeoneom.com/2023/01/18/xss-bypass-menual/

 

XSS(Cross-Site Script) 필터링 우회기법 정리

해당 내용은 Dreamhack Web Hacking 로드맵의 “XSS Filtering Bypass” 내용을 정리한 것 입니다.

www.dohyeoneom.com

 

##XSS 취약점이 존재하는지 확인하는 쉬운 방법##
검색창 등에 스크립트를 삽입해서 적용되는지 확인해본다                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                

 

 

 

'정보보안 > Web Hacking' 카테고리의 다른 글

[Web Hacking] SQL Injection  (0) 2025.01.09