1. XSS(Cross-Site Scripting)의 정의
XSS(Cross-Site Script)는 웹 애플리케이션의 취약점을 이용해 공격자가 악성 스크립트를 삽입하고, 이를 통해 사용자의 브라우저에서 해당 스크립트가 실행되도록 하는 공격 기법이다. 이를 통해 공격자는 사용자의 세션 쿠키, 개인 정보 등을 탈하거나, 웹 페이지를 변조하는 등의 악의적인 행위를 수행할 수 있다.
**세션 쿠키를 탈취하면 어떻게 악용할 수 있을까?
먼저 쿠키란 웹 사이트가 사용자의 인터넷 브라우저에 저장하는 작은 텍스트 파일로, 이 쿠키는 웹 사이트가 사용자 선호 설정, 로그인 정보 등을 기억하게 도와준다. 세션 쿠키는 웹 사이트에서 로그인 상태와 같은 세션 정보를 유지하는데 사용된다. 세션 쿠키를 탈취할 경우 다음과 같이 사용자를 가장하여 여러 악의적인 행위를 수행할 수 있다.
1) 사용자 가장
- 탈취한 세션 쿠키를 이용해 해당 사용자인 것처럼 웹 사이트에 접근할 수 있다. 이를 통해 개인 정보 열람, 민감한 데이터 수정, 금전적 거래 등을 수행할 수 있다
2) 권한 상승
- 특정 사용자의 세션 쿠키를 탈취해 관리자 권한을 획득하면, 웹 사이트 전체에 피해를 제어하거나, 타 사용자의 정보를 열람 할 수 있다
2. XSS(Cross-Site Scripting)의 특징
1) 웹 애플리케이션이 사용자 입력을 제대로 검증하지 않거나 필터링하지 않을 때 발생한다
2) 웹 사이트의 관리자가 아닌 공격자가 이러한 취약점을 이용해 웹 페이지에 스크립트를 삽입한다
3) 불특정 다수가 공격 받을 수 있고, 서버가 직접적으로 공격 받는 것이 아니기 때문에 관리자가 인지하는 데까지 오랜 시간이 소요되는 경우가 생겨 피해 규모가 대규모로 발생할 수 있다
3. XSS(Cross-Site Script)의 공격 유형
1) Stored XSS
- 공격자가 악성 스크립트를 서버에 저장하고, 해당 스크립트가 다른 사용자들에게 전달되어 실행되는 형태
- 주로 게시판, 댓글 등에 악성 스크립트 삽입
게시물에 다음의 스크립트를 저장 |
#기본적인 스크립트 삽입 <script> alert('이 웹사이트는 취약합니다!'); </script> #링크를 이용하는 방법 <a href ="javascript:alert('XSS')"> XSS </a> #이미지 오류를 이용하는 방법 <img src="#" onerror="alert('xss 공격');"> |
2) Reflected XSS
- 사용자가 입력한 데이터가 서버를 거쳐 다시 사용자에게 반사되어 반환될 때 발생
- URL 파라미터 등을 통해 전달된 악성 스크립트가 즉시 실행되는 방식
URL에 악의적인 코드가 포함된 링크를 생성 => 클릭하면 스크립트 실행 |
http://example.com/search?query= <script>alert('XSS')</script> |
3) DOM-based XSS
- 서버가 아닌 클라이언트 측, 즉 브라우저에서 동적으로 생성된 DOM(Document Object Model) 요소에 의해 발생하는 공격이다. 이 유형의 XSS는 서버와 상관없이 클라이언트 측 자바스크립트 코드가 잘못된 사용자 입력을 DOM에 직접 반영하면서 발생한다.
피해자가 아래 URL을 클릭하면, 클라이언트 측 코드가 innerHTML을 통해 DOM에 스크립트를 삽입하여 실행 |
http://example.com?username=<script>alert('XSS')</script> #클라이언트 측 Javascript 코드의 일부 document.getElementbyId("query").innerHTML = userInput |
4. XSS(Cross-site Script) 방어 기법
1) 사용자 입력 검증 및 필터링
- 사용자 입력을 받는 모든 곳에 화이트리스트 기반 접근 방식(허용한 것 제외 모두 차단)을 통해 철저히 검증 및 필터링
- HTML 특수문자를 이스케이프(텍스트 처리)하여 스크립트가 실행되지 않게 한다
function validateInput(input){
var regex = /^[a-zA-Z0-9]+$/;
if(!regex.test(input)){
throw new Error('Invalid input');
}
return input;
}
2) 출력 시 특수 문자 이스케이프
function escapeHTML(str){
return str.replace(/[&<>"']/g, function(match){
return {
'&': '&',
'<': '<',
'>': '>',
'"': '"',
"'": ''',
}[match];
});
}
3) 콘텐츠 보안 정책(Content Security Policy, CSP) 사용
- CSP는 브라우저가 신뢰할 수 있는 소스만 실행할 수 있도록 제한하여 XSS공격을 방지하는 도구이다
#해당 정책은 스크립트가 'self'(현재 도메인)에서만 로드될 수 있도록 허용한다
Content-Security-Policy: script-src 'self';
4) HTTPOnly 쿠키 및 Secure 쿠키 사용
- 쿠키에 HTTPOnly 속성을 추가하여 클라이언트 측 Javascript에서 쿠키에 접근할 수 없게 한다
- Secure 쿠키를 설정하면 HTTPS를 통해서만 쿠키가 전송된다
Set-Cookie: sessionId=abc123; HttpOnly; Secure;
5) WAF(Web Application Firewall) 사용
- XSS 패턴을 탐지하고 차단하도록 WAF 구성
**궁금한 점
1. 악성 스크립트가 저장된 게시물을 열기만 해도 악성 스크립트가 실행되는 이유
- 브라우저는 서버로부터 HTML 문서를 로드하고 랜더링하는 과정에서 <script> 태그를 만나면 자바스크립트를 실행한다
2. 랜더링이란?
- 브라우저가 웹 페이지의 코드를 사용자에게 보이는 화면으로 변환하는 과정
- 랜더링 과정은 다음과 같은 단계를 거친다
- 1) HTML 파싱(parsing): HTML 파일을 분석하여 DOM이라는 트리 구조를 생성
- 2) CSS 파싱: CSS 파일을 분석하여 CSSOM(CSS Object Model)을 생성한다
- 3) Javascript 실행: JS는 DOM을 조작하거나, 동적으로 콘텐츠를 추가할 수 있음
- 4) DOM과 CSSOM을 결합해 화면에 실제로 표현할 요소를 담은 랜더 트리를 생성
- 5) 레이아웃: 랜더 트리의 각 요소의 위치와 크기를 계산
- 6) 페인팅: 계산된 요소를 화면에 표현
3. DOM(Document Object Model)이란?
- HTML 문서를 브라우저가 이해할 수 있는 계층적 트리 구조로 표현하는 것이다.
html |
<html> <body> <h1>안녕하세요!</h1> </body> </html> |
DOM |
- html - body - h1: "안녕하세요!" |
##XSS 필터링 우회 기법 정리##
https://www.dohyeoneom.com/2023/01/18/xss-bypass-menual/
XSS(Cross-Site Script) 필터링 우회기법 정리
해당 내용은 Dreamhack Web Hacking 로드맵의 “XSS Filtering Bypass” 내용을 정리한 것 입니다.
www.dohyeoneom.com
##XSS 취약점이 존재하는지 확인하는 쉬운 방법##
검색창 등에 스크립트를 삽입해서 적용되는지 확인해본다
'정보보안 > Web Hacking' 카테고리의 다른 글
[Web Hacking] SQL Injection (0) | 2025.01.09 |
---|