저장형 XSS (Stored Cross-Site-Scripting)🤔
저장형 XSS는 공격자가 악성 스크립트를 포함한 데이터를 서버에 보내 저장하고, 이후 사용자가 해당 데이터를 요청하면 서버에 저장된 악성 스크립트가 사용자 측에서 동작하는 패턴입니다.
악성 스크립트를 포함하는 데이터가 서버에 저장되므로 저장형 XSS라고 합니다. 저장형 XSS는 반사형 XSS와 달리 한 번의 공격으로 끝나는 것이 아니라 정상적인 요청을 하는 사용자에게도 피해를 줄 수 있어 지속형 XSS라고도 합니다.
서버에서 악성 스크립트를 제거하지 않으면 지속적인 공격이 발생하기 때문에 3가지 XSS 공격 패턴 중 가장 위험한 패턴이라고 볼 수 있습니다.
저장형 XSS 공격 시나리오
- 악성 사용자가 보안이 취약한 사이트에 악성 스크립트를 포함한 데이터를 전송합니다.
- 보안이 취약한 사이트는 악성 스크립트가 포함된 데이터를 DB에 저장합니다.
- 사용자는 악성 사용자가 전송한 데이터, 즉 악성 스크립트가 포함된 데이터를 서버에 요청합니다.
- 서버는 악성 스크립트가 포함된 응답 메시지를 브라우저에 전달합니다.
- 사용자의 브라우저에서 응답 메시지를 실행하면서 악성 스크립트가 실행됩니다.
- 악성 스크립트를 통해 사용자 정보가 악의적인 사용자에게 전달됩니다.
이 공격은 사용자가 별다른 행동을 하지 않아도 페이지 방문만으로 실행될 수 있어, 다른 유형의 XSS보다 더 위험합니다.
간단한 예제를 통해 확인해 보겠습니다.
저장형 XSS 시연 예제
서버는 Node.js와 Express를 이용해 간단하게 만들었습니다.
서버에서 가져온 데이터를 이용해 페이지를 동적으로 만들기 위해 EJS(Embedded JavaScript templates)를 사용했습니다.
악성 사용자가 유저의 정보를 탈취하는 시나리오를 구현하기 위해 localStorage에 임의로 userToken이라는 값을 저장해두었습니다.
악성 사용자가 input에 입력한 내용은 아래와 같습니다.
<img src="" onerror="alert(localStorage.getItem('userToken'))" />
src가 없는 이미지 태그를 서버에 전송해 임의로 onerror 이벤트가 발생하게 되어 /article을 조회할 때마다 로컬 스토리지의 userToken이 alert으로 나타나고 있네요👀
지금은 간단한 시연 예시를 위해 로컬 스토리지에 저장된 토큰을 alert으로 나타냈지만, 쿠키나 사용자의 입력을 탈취해 악성 유저에게 전송하는 코드가 있었다면 생각만 해도 아찔하죠..😱
저장형 XSS 공격 방지 기법
1. 문자열 필터링
XSS 공격은 스크립트를 삽입하는 방식으로 발생합니다. 따라서 스크립트 태그에 자주 사용되는 < , > 과 같은 문자를 필터링해주는 방법으로 방어할 수 있습니다.
예시
function filterInput(input) {
return input.replace(/[<>&"']/g, function(match) {
return {
'<': '<',
'>': '>',
'&': '&',
'"': '"',
"'": '''
}[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를 통한 쿠키 접근을 차단합니다.
Stored XSS는 데이터 저장소와 연계되어 있어, 공격자의 악성 스크립트가 여러 사용자에게 영향을 미칠 수 있는 치명적인 취약점이기 때문에 더욱 각별한 방어 전략이 필요해 보입니다❗
'개발 공부 일지 > CS' 카테고리의 다른 글
[CS] 반사형 XSS (Reflected Cross-Site-Scripting) (0) | 2025.01.10 |
---|---|
[CS] XSS(Cross Site Scripting)란? (0) | 2025.01.09 |
주소창에 www.google.com을 검색하면 일어나는 일 (4) | 2024.12.23 |