문제 링크
https://portswigger.net/web-security/cross-site-scripting/contexts/lab-javascript-string-angle-brackets-double-quotes-encoded-single-quotes-escaped
목표 & 사용 도구
목표: JavaScript 문자열을 탈출하여 `alert` 함수를 호출하는 XSS 공격을 수행하는 것.
사용도구: Burp Suite
문제 설명
해당 랩은 `search` 쿼리 tracking 기능에 Reflected XSS 취약점이 존재한다고 한다. 꺾쇠 기호와 더블 쿼터는 HTML 인코딩 처리가 되고 싱글 쿼터는 이스케이프 처리된다. 랩 문제를 해결하기 위해서는 JavaScript 문자열을 탈출해서 `alert` 함수를 호출하는 XSS 공격을 수행해야 한다.
문제 풀이
- 검색어 입력 시 사용자 입력 값 필터링 확인을 위해 특수문자 4개를 삽입하고 Search 버튼을 클릭함.

- 이때의 요청 및 응답을 확인해 보면 사용자 입력 값은 `searchTerms` 변수 값이 되고 꺾쇠 기호와 더블 쿼터는 HTML Entity로 치환되며 싱글 쿼터는 이스케이프 처리되고 있음을 알 수 있음.

- `search` 파라미터에 `test'test`를 삽입하여 요청을 보내면 싱글 쿼터가 이스케이프 처리되어 JavaScript 문자열을 탈출할 수 없음을 확인함.

| [설명] 싱글 쿼터를 삽입하여 기존의 JavaScript 문자열을 탈출한 뒤 이후 입력 값을 JavaScript 코드로 삽입하려고 시도했다. 하지만 싱글 쿼터는 이스케이프 처리되어 있기 때문에 사용자 입력 값은 기존 JavaScript 문자열 내부에 포함되어 임의의 JavaScript 구문을 삽입할 수 없었다. |
- `search` 파라미터에 `test\'test`를 입력하여 요청을 전송하면 싱글 쿼터에 적용된 이스케이프 처리를 우회하여 기존 JavaScript 문자열을 탈출할 수 있음을 확인함.

| [설명] 싱글 쿼터 앞에 이스케이프 처리 기호인 `\`을 추가하면 `\\'` 형태가 된다. 이때 JavaScript 엔진은 첫 번째 기호를 이스케이프 처리 문자로 해석하고 두 번째 `\` 기호를 일반 문자로 처리한다. 그렇기 때문에 두 번째 `\` 기호는 이스케이프 처리 문자가 아닌 일반 문자가 되어 싱글 쿼터는 이스케이프 처리되지 않고 JavaScript 문자열 종료의 의미를 가진다. 따라서 싱글 쿼터가 JavaScript 문자열의 종료 문자로 동작하여 기존 문자열을 탈출하고 이후에 입력 값들은 JavaScript 코드 영역에 삽입할 수 있게 된다. |
- 이스케이프 처리를 우회하는 페이로드를 `search` 파라미터에 삽입하여 요청을 전송하면 JavaScript 코드 영역에 `alert` 함수를 삽입할 수 있음.
[페이로드]
<!-- test는 Burp Suite에서
페이로드 삽입 부분을 빠르게 확인하기 위해서 삽입했습니다.-->
search=test\';alert(``xss``);//

| [설명] 이스케이프 처리 기호인 `\`을 이스케이프 처리함으로써 싱글 쿼터가 JavaScript 문자열 종료를 의미하는 싱글 쿼터가 되어 기존의 문자열 탈출이 가능했다. 이후에 입력되는 값들은 JavaScript 코드 영역에 삽입되므로 `alert` 함수를 호출하도록 했다. 마지막으로 `//`을 추가해서 페이로드를 입력했을 때 남는 `';`을 주석 처리하여 문법 오류를 방지하도록 처리했다. `alert` 함수를 보면 백틱( ` )을 사용한 것을 볼 수 있는데 이는 템플릿 리터럴이라고 부르며 JavaScript 문자열 표기법이다. 싱글 쿼터, 더블 쿼터는 이스케이프 처리와 HTML Entity 치환 때문에 사용이 불가능하지만 백틱은 별다른 필터링이 없어서 사용이 가능했다. |
- 위 페이로드를 복사한 뒤 검색어 입력창에 삽입하고 Search 버튼을 클릭함.

- 페이로드가 실행되면서 `alert` 함수가 호출되는 것을 볼 수 있으며 사용자의 입력 값으로 JavaScript 코드 실행이 가능하므로 XSS 공격에 취약하다는 것을 알 수 있음.

- 문제 요구대로 XSS 공격을 수행하여 `alert` 함수를 호출했으므로 랩 문제를 해결하게 됨.

'[WEB] CTF & Wargame > PortSwigger Web Security Academy' 카테고리의 다른 글
| Lab: DOM XSS in AngularJS expression with angle brackets and double quotes HTML-encoded (0) | 2026.07.26 |
|---|---|
| Lab: Stored DOM XSS (0) | 2026.07.25 |
| Lab: Reflected XSS with event handlers and href attributes blocked (0) | 2026.07.24 |
| Lab: File path traversal, traversal sequences blocked with absolute path bypass (0) | 2026.07.21 |
| Lab: File path traversal, simple case (0) | 2026.07.20 |
| Lab: DOM XSS in document.write sink using source location.search (0) | 2026.07.20 |







































































