# Reflected XSS : LAB \[1]

## :exclamation:Reflected XSS into HTML context with nothing encoded

<figure><img src="https://991238191-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fem8pSZTq61ZQGbRcOJ8d%2Fuploads%2FLE7LNppoFBhprvspitWl%2Fimage.png?alt=media&#x26;token=992601bc-eee4-4026-8205-6e7ae7b85674" alt=""><figcaption></figcaption></figure>

LAB에서는 블로그를 찾아볼 수 있는 검색 기능을 제공하고 있다.

입력 칸이 보이면 뭐든 넣어보고 싶은 게 사람의 본능.. :smirk:

처음에 입력해본 키워드는 "hello"이다.&#x20;

<figure><img src="https://991238191-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fem8pSZTq61ZQGbRcOJ8d%2Fuploads%2FBjjIfGbqwVgyLuqVTIfa%2Fimage.png?alt=media&#x26;token=6badd3db-47d6-4f7f-a612-777d40d48c72" alt=""><figcaption></figcaption></figure>

아쉽게도 hello라는 블로그는 없는 듯하다. 여기서 주목할 점은&#x20;

**(1)** 사용자가 입력한 값이 search parameter로 전달되고 있는 동시에 (URL에서 확인)

**(2)** parameter를 포함하는 응답 페이지를 바로 받아볼 수 있다는 것이다.&#x20;

<figure><img src="https://991238191-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fem8pSZTq61ZQGbRcOJ8d%2Fuploads%2FvwDxPtFfF06jhwLIUh41%2Fimage.png?alt=media&#x26;token=014bc126-7e2e-4874-b967-5cf647469b07" alt=""><figcaption></figcaption></figure>

다시 한 번 확인해볼 겸, 이번엔 "bye"를 검색해보았다.&#x20;

이번에도 사용자가 입력한 내용을 문구에 출력해주고 있다.&#x20;

<figure><img src="https://991238191-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fem8pSZTq61ZQGbRcOJ8d%2Fuploads%2Fh0xvsthaJU4xmMpXyGAN%2Fimage.png?alt=media&#x26;token=552a9c90-bc86-4752-bdf5-814cf98d35d7" alt=""><figcaption></figcaption></figure>

Packet을 확인해보면 \<h1> tag로 검색 결과를 알려주는 문구를 다루고 있는데

```
0 search results for '____'
```

검색 결과가 없는 경우를 보면, 고정된 "0 search results for" 문구에&#x20;

사용자가 입력한 내용을 연결하는 형태인 듯하다.&#x20;

자.. 그럼 생각을 해보자. :thinking:

현재 사용자가 입력한 값은 <mark style="color:blue;">**HTML tag 안에**</mark> 있는 h1 tag로 들어가고 있다.&#x20;

그렇다면 임의의 태그를 작성해도 이 역시 HTML tag 안으로 들어가는 셈이 된다.

따라서 스크립트를 실행하기 위해 <mark style="background-color:blue;">**script tag를 적어 넣는다면**</mark>&#x20;

<mark style="background-color:blue;">**공격자가 원하는 스크립트를  실행할 수 있을 지**</mark>도 모른다..!

<mark style="color:blue;">**Proof Of Concept**</mark> 개념으로 XSS를 시도하기 위해서 아래와 같이 팝업 창을 띄우는 스크립트를 작성했다.

```
<script>alert(1)</script>
```

<figure><img src="https://991238191-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fem8pSZTq61ZQGbRcOJ8d%2Fuploads%2FcwsWHYF5zQoAE6BbeCaU%2Fimage.png?alt=media&#x26;token=38b831f1-1a2d-4c97-9f42-b850f437f138" alt=""><figcaption></figcaption></figure>

검색 바에 스크립트를 입력하게 되면 search parameter로 스크립트가 전달돼

```
<h1>0 search results for '<script>alert(1)</script>'</h1>
```

위와 같이 Response 속에 스크립트가 들어가게 된다.

스크립트가 포함된 Response가 사용자 브라우저로 전달되면&#x20;

script tag를 발견한 브라우저가 이를 실행하기 때문에

<figure><img src="https://991238191-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fem8pSZTq61ZQGbRcOJ8d%2Fuploads%2FIK68wd08edhXtG10Y5vq%2Fimage.png?alt=media&#x26;token=ca4150a7-d6de-435a-9895-6148b1754c6b" alt=""><figcaption></figcaption></figure>

성공적으로 스크립트가 실행된 결과를 볼 수 있게 되는 흐름임을 알아야 한다.&#x20;

사실 Reflected XSS 같은 경우는 일반 사용자가 스스로 스크립트를 작성하고 서버에 보내는 개념이 아니라

공격자가 준비해둔 URL을 클릭하도록 유도함으로써 발생하게 된다.&#x20;

즉, 이번 LAB을 통해 알아가야 하는 건 실제 Reflected XSS가 일어나는 공격 흐름이라기 보다는&#x20;

어떤 원리로 인해 <mark style="color:blue;">**스크립트를 서버로 보낸 당사자에게 다시 스크립트가 돌아오게 되는 지**</mark>를&#x20;

이해하기 위한 예시라 보는 게 적절할 듯하다.&#x20;
