[Network] XSS

🕷️ XSS란?

alt text

XSS는 Cross-Site Scripting의 약자로, 웹 애플리케이션의 취약점을 이용해 악의적인 스크립트를 삽입해 그 스크립트가 다른 사용자의 브라우저에서 실행되도록 하는 기법이다. 공격자가 취약한 웹사이트에 악성 스크립트를 삽입하고 이 스크립트가 다른 사용자의 브라우저에서 실행되어 민감한 정보가 유출되거나, 사용자 세션이 탈취되는 등의 피해가 발생할 수 있다.


🎭 XSS 공격의 유형

🗄️ Stored XSS

Stored XSS(Persistent XSS)는 서버 측에 악성 스크립트가 영구적으로 저장되는 형태의 공격이다. 주로 게시글, 댓글, 프로필 정보 같은 사용자 입력을 처리할 때 발생한다. 이 유형은 공격자의 스크립트가 서버의 데이터베이스에 저장되며, 해당 데이터를 보는 모든 사용자가 공격 대상이 된다.

alt text

작동 방식:

  1. 공격자가 악성 스크립트가 포함된 데이터를 서버에 제출한다. (게시판에 스크립트가 포함된 댓글을 작성)
  2. 서버는 해당 데이터를 저장하고, 사용자들이 페이지를 볼 때마다 이 데이터를 불러와 화면에 렌더링한다.
  3. 스크립트가 사용자 브라우저에서 실행되면서 쿠키 탈취, 세션 하이재킹 등의 공격이 이루어진다.

세션 하이재킹이란?
공격자가 정상적인 사용자의 세션을 가로채 해당 사용자로 위장하는 공격 기법이다.

🪞 Reflected XSS

Reflected XSS(Non-persistent XSS)는 서버로부터 즉시 반환된 응답에서 발생하는 공격이다. 주로 URL 쿼리 파라미터, 폼 제출 데이터를 통해 전달된 값이 적절한 필터링 없이 그대로 반영될 때 발생한다. 공격 스크립트가 데이터베이스에 저장되지 않고 즉각적인 응답으로 전달되기 때문에 공격자가 특정 링크를 클릭하도록 유도하는 방식으로 주요 사용된다.

alt text

작동 방식:

  1. 공격자가 악성 스크립트가 포함된 URL을 생성해 타겟에게 보낸다.
  2. 사용자가 해당 URL을 클릭하면, 서버는 입력 값을 그대로 페이지에 반영해 응답한다.
  3. 브라우저는 서버의 응답을 실행해 이 과정에서 악성 스크립트가 실행된다.

🌳 DOM-based XSS

DOM-based XSS는 서버가 아닌 클라이언트 측에서 발생하는 공격이다. 이 공격은 주로 웹 애플리케이션의 JavaScript가 브라우저 DOM을 직접 조작할 때 발생한다. 공격자는 사용자 입력을 DOM에 직접 삽입할 수 있는 취약점을 이용해 악성 스크립트를 삽입한다.

alt text

작동 방식:

  1. 사용자가 악성 URL에 접근한다.
  2. 페이지의 JavaScript가 URL의 일부를 읽어 DOM을 조작한다.
  3. 이 과정에서 악성 스크립트가 DOM에 삽입되고 실행된다.

🛡️ XSS 공격 예방 방법

  1. 🧹 안전한 DOM 조작
    • innerHTML 대신 textContent 사용: innerHTML을 사용하면 HTML 태그나 스크립트가 렌더링되어 XSS 공격의 위험이 크다. textContent는 텍스트를 그대로 출력하며 스크립트 실행을 막는다.
    • 템플릿 엔진 사용: 서버 측 또는 클라이언트 측에서 템플릿 엔진을 사용해 HTML을 안전하게 렌더링하도록 한다. 템플릿 엔진들은 보통 기본적으로 XSS 공격을 방지하는 escaping 처리를 포함하고 있다.
  2. 🍪 HttpOnly 쿠키 사용
    • HttpOnly 옵션:쿠키에 HttpOnly 옵션을 활성화하면 JavaScript를 통한 쿠키 접근을 막을 수 있다.
    • 이는 XSS 공격으로 인한 세션 하이재킹을 예방하는 데 도움이 된다.
  3. 📜 Content Security Policy (CSP) 적용 CSP는 허용된 콘텐츠 소스를 지정해 XSS 공격의 위험을 줄일 수 있다.

  4. 🔍 입출력 값 검증 및 인코딩
    • 입력 값 검증: 사용자 입력 값을 항상 의심하고, 서버 또는 클라이언트에서 필터링 또는 인코딩을 통해 잠재적인 XSS 공격을 막는다.
    • 출력 값 인코딩: 사용자 입력을 HTML에서 사용할 때는 반드시 적절한 엔티티로 변환해야 한다. <&lt;로, >&gt;로 변환하여 스크립트가 실행되지 않도록 한다.

참고

Leave a comment