Reflected XSS

DATE : 2023/12/21

앞선 POST에서는 XSS를 수행하기 위해 서버에 스크립트를 저장해두는 Stored XSS에 대해 알아봤다.

이번에는 XSS를 수행하기 위한 두 번째 방법, Reflected XSS에 대해 살펴보자.

Reflected XSS

Reflected XSS는 서버에 스크립트를 저장해두는 Stored XSS와는 방식이 조금 다르다.

Reflected"반사"라는 의미로 사용되었다고 보면 된다. 이때 반사란,

사용자가 보낸 parameter가 서버 응답에 그대로 삽입되어 되돌아오는 걸 의미한다.

이게 무슨 말이지? 싶을 수 있는데 예를 들어 검색 창에 "reflected xss"라 입력하면

https://www.google.com/search?q=reflected+xss&oq=reflected+xss&gs_lcrp=~~~&sourceid=chrome&ie=UTF-8

parameter q(or oq)로 사용자가 입력한 값이 전달되면서

"reflected xss"가 포함된 결과들을 받아볼 수 있다.

이는 사용자가 입력한 검색어가 parameter로 전달되었고

전달된 parameter가 서버 응답에 포함되고 있는 예시라 볼 수 있을 것이다.

위의 예시는 Reflected의 개념을 이해하기 위한 예시이지, Reflected XSS를 수행하기 위한

적절한 환경이라 하기엔 어렵다.

사용자가 검색 창에 입력한 내용이 그대로 화면에 출력 되는 게 아니라 사용자가 입력한 내용과

관련된 다른 사람이 작성해 둔 글을 보여주고 있는 것이기 때문에 위 예시를 통해서는

Reflected가 어떤 개념인지 이해하기 위한 예시로 보는 게 적절하다.

Reflected XSS는 위의 과정과 동일하지만 검색어가 아닌 다른 데이터,

스크립트를 전달함으로써 이루어지는 XSS 공격 유형이라 보면 된다.

Stored XSS스크립트가 들어있는 응답을 요청하게 되는 것이고

Reflected XSS스크립트가 들어있는 요청을 보내게 됨으로써 이루어진다.

잘 생각해보면 "스크립트가 들어있는 요청을 보낸다?"

Stored XSS에서는 이 행위를 공격자가 했었기 때문에

"그럼 Reflected XSS는 공격자가 누워서 침 뱉기 하는 거 아니야?"라고 생각할 수 있지만

공격자는 parameter로 스크립트를 전달하는 링크를 사용자가 클릭하게 함으로써

parameter를 통해 서버로 날아간 스크립트가 다시 돌아오게 되면서

서버로부터 스크립트를 받게 된 브라우저가 스크립트를 실행하게 되는 흐름이다.

이 흐름을 이해하기 위해 예시를 하나 살펴보자.

사용자 이름을 중복 체크하는 페이지에서 아래와 같이 parameter를 보내게 되면

searchUser=hanhxx

이름이 중복되는 경우, "hanhxx는 이미 사용 중인 이름입니다."와 같이

사용자가 입력한 값을 포함하는 문구가 출력 된다고 한다.

이때 다음과 같이 script를 포함하는 parameter를 보내면 (request)

searchUser=hanhxx<script>alert(1)</script>

서버에서는 <script> tag로 작성된 부분은 처리하지 않기 때문에

브라우저에게 그대로 스크립트 내용이 전달되고 (response)

<script>alert(1)</script>

이를 해석해 alert(1)를 실행하기 때문에 사용자는 자신이 보낸 parameter를

되돌려 받음으로써 스크립트가 실행되는 것이다.

이때 스스로 parameter에 악의적인 스크립트를 작성해 보낼 사용자는 없을 것이기 때문에

공격자가 대신 악의적인 스크립트를 담은 링크를 만들어두고 이를 클릭하도록 유도하는 것이다.

따라서, Reflected XSS는

(1) 스크립트를 서버에 저장해둘 필요가 없으며

(2) 링크로 parameter를 전달해야 하기 때문에 Get Method를 사용한다는 특징이 있는 동시에

(3) Stored XSS와 달리 스크립트를 삽입한 곳과 출력 되는 곳이 무.조.건 동일하다.

(3)번 내용을 보충 설명하자면,

Stored XSS 같은 경우에는 만약 댓글을 작성하는 페이지에 스크립트를 삽입했다면 (댓글로)

이 스크립트가 실행되는 위치는 저장된 댓글을 보여주는 페이지지, 댓글을 작성하는 페이지가 아니다.

이렇게 Stored XSS는 스크립트를 삽입하는 위치와 스크립트가 응답으로 출력 되는 위치가 다를 수 있지만,

Reflected XSS는 말 그대로 반사! 이기 때문에

스크립트를 삽입한 페이지의 응답에서 바로 스크립트가 출력된다.

이는 Reflected XSS의 한 가지 특징인 동시에 Reflected XSS를 실행하기 위한 조건 중 하나라 할 수 있다!


이렇게 해서 XSS에 대해서 전반적으로 살펴보았다.

서버에 스크립트를 저장해둠으로써 해당 페이지에 들어가는 모든 사용자에게 스크립트가 실행되도록,

상대적으로 넓은 공격 범위를 가지는 Stored XSS와 달리

링크를 클릭하는 사용자만 스크립트가 실행되는 Reflected XSS는 공격 범위가 비교적 좁다고 할 수 있다.

같은 XSS 공격이라고는 하지만 완전히 다른 차이점을 가지고 있기 때문에

Last updated