XSS 개념 정리
DATE : 2023/12/28
Last updated
DATE : 2023/12/28
Last updated
이번 POST에서는 에 이어 한 번 더 XSS에 대한 개념을 정리해볼까 한다.
XSS는 client를 대상으로 하는 공격임에도 서버 위주의 서술이 개념을 헷갈리게 할 수 있기 때문에
XSS가 무엇이고, 공격 방법이 어떻게 수행되는 지 다시 한 번 정리하고 넘어가도록 하자.
XSS는 Cross Site Scripting의 준말로 Client 측 Script를 삽입하는 공격이다.
이때 Client 측 Script는 서버가 아닌, Browser에서 실행되는 스크립트로
javascript가 대표적인 예시라 할 수 있다.
Browser에서 실행되는 스크립트를 삽입하는 공격이라 함은
최종적인 피해 대상이 Browser를 이용하는 사용자임을 의미한다.
헷갈려서는 안되는 게 XSS 공격을 수행하는 방법이 Stored, Reflected로
서버에 저장한다는 둥, 서버에서 바로 튕겨 나오는 응답을 활용한다는 둥 얘기를 하더라도
이는 말 그대로 공격 방법을 얘기하는 것이지, XSS 공격의 대상이 서버라는 말이 절대 아니다.
첫 번째로 살펴보았던 공격 방식은 Stored XSS이다.
Stored 라는 이름답게 스크립트를 사용자의 Browser에서 실행되도록 만들기 위해서
서버에 스크립트를 저장해두는 방식이다.
사용자가 서버에게 어떤 페이지를 요청하고 그에 대한 응답을 받는 과정에서
응답 속에 <script> tag가 들어 있다면 Browser가 이를 찾아 실행하게 된다.
이러한 Browser의 동작 방식을 이용해 응답 속에 스크립트가 들어가도록 미리 스크립트를 서버에 넣어두고
스크립트가 들어있는 지도 모른 채 사용자는 해당 페이지를 요청하게 되는 것이다.
그렇기 때문에 Stored XSS는 데이터를 저장하는 포인트와 (스크립트를 서버에 삽입을 위해)
저장했던 데이터를 출력하는 포인트가 존재해야 한다. (스크립트 실행을 위해)
여기까지 정리한 Stored XSS 내용을 토대로 다시 한 번 말하지만,
스크립트를 사용자의 Browser에서 실행시키기 위해 몰래 서버에 스크립트를 심어두는 거 처럼
XSS는 서버를 이용해서 client를 공격하는 방식임을 알아야 한다.
Reflected XSS는 Stored XSS와 달리 스크립트를 서버에 저장해두지 않아도 되는 유형의 XSS이다.
Reflected라는 말은 서버에 보낸 요청이 그대로 반사 되어 되돌아온다는 느낌을 표현하고 있는데
이는 사용자가 parameter로 보낸 데이터가 응답에 바로 포함되어 돌아오는 로직을 활용하기 때문이다.
따라서 Reflected XSS는 parameter를 이용하는 포인트와 (스크립트를 응답에 삽입하기 위해)
parameter를 포함하는 즉각적인 응답이 제공되어야 한다. (스크립트 실행을 위해)
Reflected XSS는 parameter를 통해 데이터를 즉, 스크립트를 전달해야 하기 때문에
Get method를 실행하는 부분이 잠재적인 공격 포인트가 될 수 있다.
이때 스크립트를 포함하는 요청, 다른 말로 URL을 사용자 스스로 서버에게 보내야 하기 때문에
링크를 클릭하도록 유도하는 것이다.
(서버는 요청을 보낸 사람한테 스크립트가 포함된 응답을 보내주기 때문에)
이 과정에서도 서버는 자신에게 온 요청을 처리해서 보내주는 것일 뿐,
스크립트가 실행되는 위치는 응답을 받는 사용자임을 명심해야 한다.
위에서 다룬 Stored XSS와 Reflected XSS는 완전히 다른 스타일의 공격 유형인데
개념만 보자면 조금 헷갈릴 수 있을 것이다.
헷갈리는 이유를 생각해봤을 때,
각각의 공격이 스크립트를 실행하는 과정이 어떻게 되는 지를 고민해보면 도움이 될 듯하다.
Stored XSS는 사용자가 요청을 보냈을 때
해당 요청 속에 스크립트가 들어있게 하기 위해서 스크립트를 미리 서버에 심어두는 것이다.
따라서 스크립트가 포함된 요청을 서버에게 미리 보내야 할 필요가 있고 (공격자)
아무것도 모른 채 스크립트가 포함된 응답을 달라고 요청하는 주체가 사용자(피해자)인 것이다.
이와 달리 Reflected XSS는 요청을 보내면 parameter가 응답 속에 그대로 되돌아오는 걸 이용하기 때문에
스크립트가 포함된 요청을 사용자가 서버에게 직접 보내는 것이다.
"스크립트를 자기가 작성해서 서버에게 보내는 것도 아닐 텐데, 어떻게 그러지?" 싶겠지만
이를 위해 링크를 만들어두고 클릭하도록 유도하는 것이다.
이렇게 스크립트가 들어있는 응답을 요청하는 것이냐, 스크립트가 들어있는 요청을 직접 보내는 것이냐 의
차이가 미세하지만 완전히 다른 스타일의 공격 방식으로 활용될 수 있음을 이해할 필요가 있어 보인다!