XSS (Cross Site Scripting)

如果您对黑客职业感兴趣并想要黑掉无法黑掉的东西 - 我们正在招聘!(需要流利的波兰语书面和口头表达能力)。

方法论

  1. 检查您控制的任何值参数路径标头?,Cookie?)是否在 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 的奇怪示例:

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)}`

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

Javascript 提升

Javascript 提升指的是在使用后声明函数、变量或类的机会,因此您可以利用 XSS 正在使用未声明的变量或函数的情况。 查看以下页面获取更多信息:

JS Hoisting

Javascript 函数

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

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

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

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

一些有用的函数包括:

您还可以尝试直接触发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绕过编码图像

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

在原始HTML中注入

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

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

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

标签/事件的暴力破解

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

自定义标签

如果您找不到任何有效的HTML标签,您可以尝试创建自定义标签并使用onfocus属性执行JS代码。在XSS请求中,您需要以#结束URL,使页面聚焦在该对象上执行代码:

黑名单绕过

如果使用了某种黑名单,您可以尝试使用一些愚蠢的技巧来绕过它:

长度绕过(小型XSS)

更多针对不同环境的微型XSS 负载可以在这里找到这里

最后一个是使用2个Unicode字符,扩展为5个:telsr 更多这些字符可以在这里找到。 要检查哪些字符被分解,请查看这里

点击XSS - 点击劫持

如果为了利用漏洞,您需要用户点击一个带有预填数据的链接或表单,您可以尝试滥用点击劫持(如果页面存在漏洞)。

不可能 - 悬挂标记

如果您认为不可能创建一个带有执行JS代码属性的HTML标记,您应该检查悬挂标记,因为您可以利用漏洞而无需执行JS代码。

在HTML标记内注入

在标记内部/从属性值中逃逸

如果您在HTML标记内部,您可以尝试首先从标记中逃逸,并使用前一节中提到的一些技术来执行JS代码。 如果您无法从标记中逃逸,您可以在标记内创建新属性,尝试执行JS代码,例如使用一些有效载荷(请注意,在此示例中,双引号用于从属性中逃逸,如果您的输入直接反映在标记内,则不需要它们):

样式事件

在XSS攻击中,可以利用样式事件来执行恶意脚本。例如,可以通过<img>标签的onerror事件来触发恶意脚本。

在属性中

即使无法从属性中逃脱"被编码或删除),取决于值被反映在哪个属性中,如果您控制所有值或只是一部分,您将能够滥用它。例如,如果您控制像onclick=这样的事件,您将能够使其在被点击时执行任意代码。 另一个有趣的例子是属性href,您可以使用javascript:协议来执行任意代码:href="javascript:alert(1)"

在事件内部使用HTML编码/URL编码绕过

HTML标签属性值中的HTML编码字符在运行时会被解码。因此,类似以下内容将是有效的(payload以粗体显示):<a id="author" href="http://none" onclick="var tracker='http://foo?&apos;-alert(1)-&apos;';">Go Back </a>

请注意任何类型的HTML编码都是有效的

请注意,URL 编码也可以起作用:

使用Unicode编码绕过内部事件

在属性中使用特殊协议

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

可以注入这些协议的位置

一般来说javascript: 协议可以用于接受属性 href 的任何标签中,并且可以用于大多数接受属性 src 的标签中(但不包括 <img

其他混淆技巧

在这种情况下,HTML编码和前一节中的Unicode编码技巧同样有效,因为您位于属性内部。

此外,对于这些情况还有另一个不错的技巧即使你在javascript:...中的输入被URL编码,它在执行之前会被URL解码。因此,如果你需要使用单引号字符串转义,并且发现它被URL编码,请记住这并不重要,在执行时它将被解释为单引号

请注意,如果您尝试以任何顺序使用URLencode + HTMLencode来编码payload,它不会起作用,但您可以在payload混合使用它们

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

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

反向标签窃取

如果您可以在包含**target="_blank"rel="opener"属性的任意<a href=标签中注入任何URL,请检查以下页面以利用此行为**:

Reverse Tab Nabbing

on Event Handlers Bypass

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

在“无法利用的标签”中的 XSS(隐藏输入、链接、规范、元标记)

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

并且在元标签中:

这里:您可以在隐藏属性中执行XSS有效负载,只要您能说服 受害者按下键组合。在Firefox Windows/Linux上,键组合是ALT+SHIFT+X,在OS X上是CTRL+ALT+X。您可以使用访问键属性中的不同键指定不同的键组合。以下是向量:

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正在过滤style属性,您可以使用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代码中,或者在可以执行JS代码的HTML事件之间,或者在接受javascript:协议的属性之间。

转义<script>标记

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

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

在JS代码内部

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

模板文字 ``

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

这可以通过以下方式滥用

编码代码执行

Unicode编码JS执行

JavaScript绕过黑名单技术

字符串

特殊转义

JS代码中的空格替换

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

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

JavaScript空白字符

注释中的Javascript

没有括号的JavaScript

调用任意函数(alert)

DOM漏洞

存在使用由攻击者控制的不安全数据的JS代码,如location.href。攻击者可以利用这一点执行任意JS代码。 由于对DOM漏洞的解释进行了扩展已将其移至此页面

DOM XSS

在那里,您将找到关于DOM漏洞是什么,它们是如何引发的以及如何利用它们的详细解释。 此外,不要忘记在上述帖子的末尾可以找到有关DOM篡改攻击的解释。

其他绕过方式

规范化的Unicode

您可以检查反射值是否在服务器(或客户端)中进行了Unicode规范化,并利用此功能绕过保护。在此处找到一个示例

PHP FILTER_VALIDATE_EMAIL标志绕过

Ruby-On-Rails绕过

由于RoR大量分配,引号被插入HTML,然后绕过引号限制,可以在标签内添加额外字段(onfocus)。 表单示例(来自此报告),如果发送有效载荷:

配对 "Key","Value" 将会被回显如下:

特殊组合

然后,将插入onfocus属性,从而发生XSS。

在 302 响应中进行头部注入的 XSS

如果您发现可以在 302 重定向响应中注入头部,您可以尝试让浏览器执行任意 JavaScript。这并不是简单的,因为现代浏览器在 HTTP 响应状态码为 302 时不会解释 HTTP 响应主体,因此仅跨站脚本有效负载是无效的。

这份报告这篇文章中,您可以了解如何测试 Location 头中的多个协议,并查看是否有任何协议允许浏览器检查和执行主体内的 XSS 负载。 已知的协议包括:mailto:////x:1/ws://wss://空 Location 头resource://

仅限字母、数字和点号

如果您能指示回调将要执行的 JavaScript 仅限于这些字符。阅读本文的此部分以了解如何滥用这种行为。

有效的 <script> 内容类型用于 XSS

(来自这里) 如果尝试加载一个带有 application/octet-stream内容类型的脚本,Chrome 将抛出以下错误:

Refused to execute script from ‘https://uploader.c.hc.lc/uploads/xxx' because its MIME type (‘application/octet-stream’) is not executable, and strict MIME type checking is enabled.

唯一支持 Chrome 运行加载的脚本内容类型是位于https://chromium.googlesource.com/chromium/src.git/+/refs/tags/103.0.5012.1/third_party/blink/common/mime_util/mime_util.cc中的常量**kSupportedJavascriptTypes**。

XSS中的脚本类型

(来源这里) 那么,哪些类型可以用来加载脚本呢?

答案是:

  • module(默认,无需解释)

  • webbundle: Web Bundles 是一个功能,您可以将一堆数据(HTML、CSS、JS 等)打包到一个 .wbn 文件中。

这种行为被用于这篇解决方案中,将一个库重新映射到eval上,以滥用它来触发XSS。

  • speculationrules 这个功能主要是为了解决预渲染造成的一些问题。它的工作原理如下:

用于 XSS 的 Web 内容类型

(来源这里) 以下内容类型可以在所有浏览器中执行 XSS:

  • text/html

  • application/xhtml+xml

  • application/xml

  • text/xml

  • image/svg+xml

  • text/plain (?? 不在列表中,但我记得在一个 CTF 中看到过)

  • application/rss+xml (关闭)

  • application/atom+xml (关闭)

在其他浏览器中,其他 Content-Types 可用于执行任意 JS,请查看:https://github.com/BlackFan/content-type-research/blob/master/XSS.md

xml 内容类型

如果页面返回 text/xml 内容类型,则可以指定一个命名空间并执行任意 JS:

特殊替换模式

当类似 "some {{template}} data".replace("{{template}}", <user_input>) 这样的代码被使用时,攻击者可以使用特殊字符串替换来尝试绕过某些保护措施:"123 {{template}} 456".replace("{{template}}", JSON.stringify({"name": "$'$`alert(1)//"}))

例如,在这篇文章中,这种方法被用来转义脚本中的 JSON 字符串并执行任意代码。

Chrome缓存到XSS

Chrome Cache to XSS

XS Jails逃逸

如果你只能使用有限的字符集,可以查看这些其他有效的 XSJail 问题解决方案:

如果在执行不受信任的代码之前一切都是未定义的(就像在这篇文章中所述),可以使用以下方法生成有用的对象,从而滥用执行任意不受信任代码的过程:

  • 使用 import()

  • 间接访问 require

根据这个 在 Node.js 中,模块被包裹在一个函数内,就像这样:

因此,如果我们可以从该模块调用另一个函数,就可以在该函数中使用arguments.callee.caller.arguments[1]来访问**require**:

以类似的方式,可以使用错误处理程序来访问模块的包装器并获取 require 函数:

混淆和高级绕过

XSS常见有效载荷

多个有效载荷合集

Steal Info JS

检索Cookies

如果 cookie 中设置了 HTTPOnly 标志,您将无法从 JavaScript 中访问 cookie。但是,如果您足够幸运,在这里有一些绕过此保护的方法

窃取页面内容

查找内部IP地址

端口扫描器 (fetch)

端口扫描器(Websockets)

短时间表示有响应的端口 较长时间表示无响应。

查看Chrome中禁止的端口列表这里,以及Firefox中的这里

用于请求凭据的框

自动填充密码捕获

当在密码字段中输入任何数据时,用户名和密码将被发送到攻击者的服务器,即使客户端选择了保存的密码并且没有输入任何内容,凭据也将被外泄。

键盘记录器

仅在 GitHub 上搜索,我找到了一些不同的:

窃取 CSRF 令牌

窃取 PostMessage 消息

  • 在目标网站上注入恶意脚本,以便窃取通过 PostMessage 传递的敏感信息。

  • 使用恶意脚本监听 message 事件,并将接收到的消息发送到攻击者控制的服务器。

滥用 Service Workers

Abusing Service Workers

访问 Shadow DOM

Shadow DOM

Polyglots

盲 XSS 负载

您也可以使用:https://xsshunter.com/

正则表达式 - 访问隐藏内容

这篇文章中可以了解到,即使某些值从 JS 中消失了,仍然可以在不同对象的 JS 属性中找到它们。例如,即使正则表达式的输入值被删除,仍然可以在正则表达式的输入值中找到它。

暴力破解列表

利用其他漏洞的 XSS

Markdown 中的 XSS

可以注入 Markdown 代码来渲染吗?也许你可以获得 XSS!检查:

XSS in Markdown

XSS 到 SSRF

使用缓存的网站上获得 XSS?尝试使用以下负载将其升级为 SSRF,通过边缘包含注入(Edge Side Include Injection):

用它来绕过cookie限制、XSS过滤器等等! 有关此技术的更多信息,请参阅:XSLT

动态创建PDF中的XSS

如果一个网页正在使用用户控制的输入创建PDF,您可以尝试欺骗创建PDF的机器人执行任意JS代码。 因此,如果PDF创建机器人发现某种HTML标签,它将解释它们,您可以滥用这种行为来引发服务器XSS

Server Side XSS (Dynamic PDF)

如果无法注入HTML标签,可以尝试注入PDF数据

PDF Injection

在Amp4Email中的XSS

AMP旨在加速移动设备上的网页性能,结合了HTML标签和JavaScript,以确保功能性,并强调速度和安全性。它支持各种功能的一系列组件,可通过AMP组件访问。

AMP for Email格式将特定AMP组件扩展到电子邮件,使收件人能够直接在其电子邮件中与内容交互。

示例Gmail中Amp4Email中的XSS写作

上传文件中的XSS(svg)

将以下文件作为图像上传(来自http://ghostlulz.com/xss-svg/):

https://github.com/allanlw/svg-cheatsheet中查找更多SVG有效载荷

其他JS技巧和相关信息

Misc JS Tricks & Relevant Info

XSS资源

如果您对黑客职业感兴趣并想要攻破不可能的 - 我们正在招聘!(需要流利的波兰语书面和口头表达能力)。

从零开始学习AWS黑客技术,成为专家 htARTE(HackTricks AWS红队专家)

支持HackTricks的其他方式:

最后更新于