1. XSS(Cross-Site Scripting) 란?
XSS는 웹 애플리케이션의 취약점을 이용해 악성 스크립트를 삽입하는 공격 기법입니다. 공격자가 삽입한 스크립트가 다른 사용자의 브라우저에서 실행되어 사용자의 정보를 탈취하거나 악의적인 행동을 수행할 수 있습니다.
2. XSS(Cross-Site Scripting) 주요 특징
- 웹사이트 관리자가 아닌 공격자가 웹 페이지에 스크립트를 삽입합니다.
- 주로 사용자 입력값을 제대로 검증하지 않고 사용할 때 발생합니다.
- 공격자는 사용자의 쿠키, 세션 등 중요 정보를 탈취하거나 비정상적인 기능을 수행하게 할 수 있습니다.
- SQL injection과 함께 가장 기초적인 웹 취약점 공격 방법 중 하나입니다.
3. XSS(Cross-Site Scripting) 공격 유형 및 시나리오
3.1 Stored XSS (저장형)
서버에 악성 스크립트를 저장하여 지속적으로 공격하는 방식입니다. 주로 게시판, 댓글 등에서 발생합니다.
- 예상 시나리오
- 공격자는 웹사이트의 게시판이나 댓글 기능을 통해 위와 같은 스크립트를 삽입합니다. 이 스크립트는 서버에 저장됩니다.
- 이후 해당 게시글이나 댓글을 방문하는 모든 사용자는 페이지가 로드될 때마다 자동으로 window.location.href를 통해 네이버(https://naver.com)로 리디렉션 됩니다.
<script>
window.onload = function() {
window.location.href = "https://naver.com";
};
</script>
3.2 Reflected XSS (반사형)
URL 파라미터 등을 통해 전달된 악성 스크립트가 즉시 실행되는 방식입니다.
- 예상 시나리오
- 사용자가 특정 링크(예: http://bigdwarf.blog/search?param=<script>alert('안녕하세요.')</script>)를 클릭하면, 서버는 param 파라미터의 값을 응답 페이지에 반사하여 사용자의 브라우저에서 악성 스크립트를 실행합니다.
- 결과적으로, alert(' 안녕하세요.')가 실행되어 브라우저에 경고창이 뜨게 됩니다.
http://bigdwarf.blog/search?param=<script>alert('안녕하세요.')</script>
3.3 DOM-based XSS
DOM-based XSS는 서버가 아닌 클라이언트 측 즉 브라우저에서 동적으로 생성된 DOM(Document Object Model) 요소에 의해 발생하는 XSS 공격입니다. 이 유형의 XSS는 서버와 상관없이 클라이언트 측 자바스크립트 코드가 잘못된 사용자 입력을 DOM에 직접 반영하면서 발생합니다.
- 예상 시나리오
- 사용자가 아래와 같은 URL을 방문합니다.
- 페이지 로드 시 클라이언트 측 자바스크립트 코드가 URL의 해시 값(#user=...)을 읽어 DOM에 반영하도록 되어 있다고 가정합니다.
- 자바스크립트 코드가 URL 해시 값에 포함된 <script> 태그를 DOM에 추가하면서 악성 스크립트가 브라우저에서 실행됩니다.
- 결과적으로 alert('DOM XSS')가 실행되어 경고창이 뜨게 됩니다.
URL: http://bigdwarf.blog#user=<script>alert('DOM 안녕하세요.')</script>
<script>
window.onload = function() {
// URL의 해시(#) 부분을 가져와서 userName이라는 ID를 가진 요소에 삽입
var userInput = window.location.hash.substring(1);
document.getElementById("userName").innerHTML = userInput;
};
</script>
4. XSS(Cross-Site Scripting) 방어 기법
4.1 입력 검증 및 필터링
- 사용자 입력을 받는 모든 곳에서 입력값을 철저히 검증하고 필터링해야 합니다. 필터링에는 화이트리스트 기반 접근 방식이 가장 효과적입니다. 예를 들어 사용자 이름에는 알파벳과 숫자만 허용하는 정규 표현식을 사용할 수 있습니다.
function validateInput(input) {
// 사용자 이름은 알파벳과 숫자만 허용
var regex = /^[a-zA-Z0-9]+$/;
if(!regex.test(input)) {
throw new Error('Invalid input');
}
return input;
}
- 또한, HTML 특수 문자를 이스케이프 하여 스크립트가 실행되지 않도록 해야 합니다.
function escapeHTML(str) {
return str.replace(/[&<>"']/g, function(match) {
return {
'&': '&',
'<': '<',
'>': '>',
'"': '"',
"'": '''
}[match];
});
}
4.2 출력 인코딩
- 서버에서 동적으로 생성된 콘텐츠를 클라이언트에 출력할 때는 반드시 적절한 인코딩을 적용해야 합니다. 예를 들어 HTML 콘텐츠를 출력할 때는 아래와 같은 방식으로 인코딩할 수 있습니다.
function encodeForHTML(content) {
return content.replace(/&/g, '&')
.replace(/</g, '<')
.replace(/>/g, '>')
.replace(/"/g, '"')
.replace(/'/g, ''');
}
이와 같은 방식으로 자바스크립트, CSS, URL 등의 다른 컨텍스트에서도 각각 적절한 인코딩 방식을 적용해야 합니다.
4.3 Content Security Policy (CSP) 사용
- CSP는 스크립트 소스, 스타일시트 소스, 이미지 소스 등을 제어하여 XSS 공격을 방지할 수 있는 강력한 도구입니다. 기본적으로 신뢰할 수 있는 소스만 실행하도록 제한할 수 있습니다.
Content-Security-Policy: default-src 'self'; script-src 'self' https://bigdwarf.blog;
이 정책은 스크립트가 'self' (현재 도메인)와 https://bigdwarf.blog에서만 로드될 수 있도록 허용합니다.
4.4 HttpOnly 쿠키 사용
- 쿠키에 HttpOnly 속성을 추가하면 클라이언트 측 스크립트에서 쿠키에 접근할 수 없게 됩니다. 이로 인해 XSS 공격으로부터 세션 쿠키가 보호됩니다.
Set-Cookie: sessionId=abc123; HttpOnly; Secure; SameSite=Strict;
- HttpOnly: 자바스크립트에서 쿠키 접근을 차단합니다.
- Secure: HTTPS를 통해서만 쿠키가 전송됩니다.
- SameSite=Strict: 동일한 사이트에서만 쿠키가 전송되도록 제한합니다.
4.5 그 외 여러 방법
- 템플릿 엔진 사용: 템플릿 엔진(예: Thymeleaf, Handlebars 등)을 사용할 때 기본적으로 XSS 공격을 예방하는 메커니즘이 적용되는 점을 설명할 수 있습니다.
- 프레임워크 레벨 보안 기능: 다양한 웹 프레임워크(Spring, Django 등)에서 제공하는 기본적인 XSS 방어 기능에 대해 설명하고, 이러한 기능을 활성화하는 방법을 다룰 수 있습니다.
- 도구를 사용한 정적 분석: SonarQube, Fortify 같은 정적 분석 도구를 사용하여 코드에서 잠재적인 XSS 취약점을 탐지하는 방법을 소개할 수 있습니다.
- 보안 테스트: OWASP ZAP, Burp Suite와 같은 도구를 사용해 XSS 취약점을 스캔하고 제거하는 방법을 설명할 수 있습니다.
5. 마무리
앞서 설명한 방법들은 XSS 공격을 방지하는 데 있어 강력한 방어 수단이 될 수 있으며, 이를 통해 여러분의 웹 애플리케이션을 보다 안전하게 보호할 수 있습니다. 하지만 보안은 한 번의 조치로 끝나는 것이 아니라, 지속적인 점검과 개선이 필요한 과정입니다. 따라서 정기적으로 보안 테스트를 실시하고, 최신 보안 동향을 파악하여 꾸준히 웹 애플리케이션의 보안을 강화하는 노력이 필요합니다. XSS 공격에 대한 철저한 대비를 통해, 신뢰할 수 있는 안전한 웹 환경을 구축하시기 바랍니다.
'지식 > Web' 카테고리의 다른 글
브라우저 저장소 : 로컬 스토리지, 세션 스토리지, 쿠키 (0) | 2024.09.16 |
---|