개발 공부 일지/CS

[CS] 반사형 XSS (Reflected Cross-Site-Scripting)

dev-hpk 2025. 1. 10. 14:23

반사형 XSS 이미지

반사형 XSS (Reflected Cross-Site-Scripting)🤔

악성 사용자가 악성 스크립트가 담긴 URL을 만들어 일반 사용자에게 전달하는 패턴입니다. 

악성 사용자는 URL 주소 뒤에 붙은 쿼리에 악성 스크립트를 작성하여 전달합니다.

반사형 XSS는 URL 주소에 포함된 코드를 응답 HTML에 그대로 출력하기 때문에 반사형 XSS라고 합니다.

URL 주소에 악성 스크립트가 포함된 경우에만 발생하기 때문에 지속성이 없어 비지속성 XSS라고도 합니다.

 

반사형 XSS  공격 시나리오

반사형 xss 공격 시나리오

  1. 악성 사용자가 보안이 취약한 사이트에서 사용자 정보를 빼돌릴 수 있는 스크립트가 담긴 URL을 만들어 일반 사용자에게 메일로 전달합니다.
  2. 사용자는 메일을 통해 전달받은 URL 링크를 클릭합니다.
  3. 사용자 브라우저에서 보안이 취약한 사이트로 요청을 전달합니다.
  4. 사용자의 브라우저에서 응답 메시지를 실행하면서 악성 스크립트가 실행됩니다.
  5. 악성 스크립트를 통해 사용자 정보가 악의적인 사용자에게 전달됩니다.

 

이 공격은 사용자가 URL을 누른 것 만으로 실행될 수 있어 위험하지만, 그 피해가 URL을 클릭한 사용자에게만 제한되며 URL을 클릭하지 않으면 지속성이 없습니다.

 

간단한 예제를 통해 확인해 보겠습니다.

 

저장형 XSS  시연 예제

서버는 Node.js와 Express를 이용해 간단하게 만들었습니다.

 

악성 사용자가 유저의 정보를 탈취하는 시나리오를 구현하기 위해 localStorage에 임의로 userToken이라는 값을 저장해 두었습니다.

localStorage에 저장된 유저 토큰

 

악성 유저가 보안이 취약한 사이트에 로컬 스토리지의 userToken을 alert하는 코드를 전송합니다.

<img src="" onerror="alert(localStorage.getItem('userToken'))" />

 

src가 없는 이미지 태그를 서버에 전송해 임의로 onerror 이벤트가 발생하게 되어 로컬 스토리지의 userToken이 alert 하도록 하는 코드네요👀

 

로컬 스토리지의 토큰을 alert하는 URL

 

사용자의 로컬 스토리지에 저장된 토큰을 alert하는 스크립트를 포함한 URL을 만들었습니다.

해당 URL은 query에 script가 노출되어 있으니 사용자가 알아보지 못하게 간단한 주소로 바꿔 볼게요❗

 

URL 단축 전
단축 후 URL

 

Reflect XSS 시연

링크를 클릭해 사이트로 이동하면 userToken이 alert으로 나타나고 있네요👀

 

지금은 간단한 시연 예시를 위해 로컬 스토리지에 저장된 토큰을 alert으로 나타냈지만, 쿠키나 사용자의 입력을 탈취해 악성 유저에게 전송하는 코드가 있었다면 생각만 해도 아찔하죠..😱

 

XSS  공격 방지 기법

1. 문자열 필터링

XSS 공격은 스크립트를 삽입하는 방식으로 발생합니다. 따라서 스크립트 태그에 자주 사용되는 < , > 과 같은 문자를 필터링해 주는 방법으로 방어할 수 있습니다.

 

예시

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

 

2. 콘텐츠 보안 정책 (CSP) 적용

CSP (Content Security Policy)를 설정하여 외부 스크립트나 인라인 스크립트의 실행을 제한합니다. 이를 통해 악성 스크립트가 실행되지 않도록 방어할 수 있습니다.

 

HTTP 헤더를 사용한 CSP 지정

/* 사이트 자체의 출처(하위 도메인 제외) 콘텐츠만 허용 */
Content-Security-Policy: default-src 'self'
/* 신뢰할 수 있는 도메인 및 모든 하위 도메인의 콘텐츠를 허용 */
Content-Security-Policy: default-src 'self' example.com *.example.com

meta 태그를 사용한 CSP 지정

<meta
  http-equiv="Content-Security-Policy"
  content="default-src 'self'; img-src https://*; child-src 'none';" />

3. 데이터베이스 필터링

데이터베이스에 저장하기 전에 입력값을 정규화하거나 필터링하여 악성 코드가 저장되지 않도록 방지합니다.

4. HttpOnly 쿠키 사용

세션 쿠키에 HttpOnly 속성을 설정하여 JavaScript를 통한 쿠키 접근을 차단합니다.

 

 

 

[CS] XSS(Cross Site Scripting)란?

XSS(Cross Site Scripting)는 웹 해킹 공격 중 하나입니다. 웹 서버 사용자에 대한 입력값 검증이 미흡할 때 발생하는 취약점으로, 주로 여러 사용자가 보는 게시판이나 메일 등을 통해 악성 스크립트(Ja

dev-hpk.tistory.com

 

 

[CS] 저장형 XSS (Stored Cross-Site-Scripting)

저장형 XSS (Stored Cross-Site-Scripting)🤔저장형 XSS는 공격자가 악성 스크립트를 포함한 데이터를 서버에 보내 저장하고, 이후 사용자가 해당 데이터를 요청하면 서버에 저장된 악성 스크립트가 사

dev-hpk.tistory.com