개요

  • 취약점 설명 주소: https://portswigger.net/web-security/cross-site-scripting/contexts#xss-into-javascript
  • 문제 주소: https://portswigger.net/web-security/cross-site-scripting/contexts/lab-javascript-string-angle-brackets-html-encoded
  • 난이도: APPRENTICE (쉬움)

취약점 개요 (Breaking out of a JavaScript string)

XSS 컨텍스트가 인용된 문자열 리터럴 내부에 있는 경우, 종종 문자열에서 벗어나 JavaScript를 직접 실행할 수 있다. XSS 컨텍스트 다음에 스크립트를 복구하는 것이 필수적이다. 거기에 구문 오류가 있으면 전체 스크립트가 실행되지 않기 때문이다.

문자열 리터럴을 벗어나는 데 유용한 방법은 다음과 같다.

'-alert(document.domain)-'
';alert(document.domain)//

랩 개요

  • 이 랩에는 꺽쇠(<>)를 인코드하는 검색 쿼리 추적기능에 반사형 XSS 취약점이 있다.
  • XSS는 Javascript 문자열 내에서 발생한다.
  • 랩을 퓰려면 Javascript 문자열을 부수는 XSS를 수행해서 alert함수를 호출하면 된다.
This lab contains a reflected cross-site scripting vulnerability in the search query tracking functionality where angle brackets are encoded. The reflection occurs inside a JavaScript string. To solve this lab, perform a cross-site scripting attack that breaks out of the JavaScript string and calls the alert function.

도전

  1. 랩을 살펴본다. "/><script>alert(1);</script>로 검색해봤다. 이번에는 꺽쇠가 HTML인코딩된 상태로 들어간다!

  1. 작음따옴표를 테스트해본다. ';를 검색해본다. 그러면 HTML인코딩된(혹은 이스케이프된) 상태가 아니라 그대로 들어가는 것을 알 수 있다. Javascript의 문자열을 벗어날 수 있게 되었다.

  1. 다음 페이로드를 검색어로 입력해서 검색해본다.
';alert(1);//

그러면 다음과 같이 Javascript내에 삽입되고 얼럿창이 뜨는 것을 볼 수 있다.

  1. 랩이 풀렸다.