XSS : Cross Site Scripting
DATE : 2023/12/21
Last updated
DATE : 2023/12/21
Last updated
XSS란 Cross Site Scripting의 약자로 간단히 말하자면 스크립트를 삽입하는 공격이다.
하지만 이렇게 표현하면 개념을 오해할 소지가 있기 때문에 좀 더 사족을 붙여보자면,
XSS란
공격자가 실행시키고자 하는 악성 스크립트를 페이지에 삽입해
해당 페이지에 접속한 이용자의 브라우저에서 스크립트가 실행되도록 하는 공격을 말한다.
이때 중요한 포인트는 스크립트가 실행되는 위치이다. 💡
공격자가 하는 행위를 봤을 때는 스크립트를 페이지, 즉 서버 어딘가에 숨겨둔다는 느낌 때문에
"이거 서버를 대상으로 하는 공격 아니야?"라고 생각할 수 있지만
사실상 서버는 XSS 공격을 위한 매개체와 같은 역할일 뿐,
삽입해둔 스크립트가 실행됨으로써 피해를 받는, 근본적인 공격 대상은 Client이다.
XSS는 "스크립트를 삽입"함으로써 이루어지는 공격이라 정의했는데
여기서 말하는 "스크립트"란 무엇일까??
흔히 말하는 client, server 측 스크립트란 다음과 같이 예시를 들어볼 수 있다.
XSS를 수행하고자 하는 공격자의 입장이라면, 이 둘 중 어느 스크립트를 사용하는 것이 적절한 선택일까?
XSS의 개념을 다시 되새겨보면
삽입한 스크립트가 사용자의 브라우저에서 실행되도록 하는 걸 목표로 하는 공격이었다.
즉 서버를 통해 삽입된 스크립트가 전달되는 것이고 실행은 브라우저에서 되어야 한다. 💡
그렇다면 서버 측에서 처리되는 스크립트가 아닌,
CLIENT 측에서 실행되는 스크립트를 선택하는 게 적절한 판단일 것이다.
지금 얘기하고자 하는 건 script이지, 프로그래밍 언어가 아니다.
브라우저 입장에서는 HTML로 <input>을 작성하면 이를 해석해서 화면에 작성란을 만들어주고
CSS로 color를 지정하면 글자 색상을 변경해준다.
이처럼 브라우저가 읽고 해석하는 과정을 거쳐 화면에 띄워주는 액션을 취하게 하기 때문에
브라우저 입장에서는 HTML, CSS도 하나의 스크립트라 할 수 있다.
다음으로 알아볼 내용은 "XSS를 어느 포인트에서 수행할 수 있느냐"이다.
SQLi에서는 당연한 얘기지만, SQL 질의문을 사용하는 곳에서 SQLi 공격을 수행할 수 있었다.
다만 SQL 질의문을 사용하는 포인트가 우리가 생각하는 거 처럼
사용자가 어떤 정보를 입력하는 위치에만 있는 건 아니라는 걸 확인했었다.
이처럼 XSS도 공격을 수행하기 위한 조건이 있는데 바로,
공격자가 입력한 데이터(스크립트)가 서버의 Response에 나와야 한다는 것이다.
XSS의 정의를 조금 더 자세히 생각해보면
공격자가 스크립트를 페이지에 삽입한다는 행위는 스크립트를 포함한 요청을 서버에게 보낸다는 의미이고
해당 페이지에 접속한 사용자의 브라우저에서 스크립트가 실행된다는 건,
공격자가 서버로 보낸 요청에 따라 스크립트가 페이지의 일부로 들어가 있다가
아무것도 모르고 그 페이지를 요청한 사용자에게 서버가 응답을 보내줄 때
그 안에 들어가 있던 스크립트 또한 전달됨으로써 가능하다.
이때 스크립트는 위에서 말했듯이 Client 측 스크립트이기 때문에
서버가 응답을 보내주면 사용자의 브라우저는 응답 속에 들어있는 Client 측 스크립트 또한 받게 되고
결과적으로 페이지에 접속한 사용자의 브라우저에서 스크립트가 실행될 수 있는 것이다.
이런 과정을 살펴보았을 때, XSS 공격이 이루어지기 위해서는
공격자가 삽입한 스크립트가(request) 다른 사용자에게 잘 전달되어야 하기 때문에 (response)
(1) 스크립트를 삽입할 수 있는지 ( = 서버에 저장할 수 있는지)
(2) 삽입한 스크립트가 response에서 확인이 가능한지 따져볼 필요가 있는 것이다.