XSS (Cross Site Scripting)
最后更新于
最后更新于
如果您对黑客职业感兴趣并想要黑掉无法黑掉的东西 - 我们正在招聘!(需要流利的波兰语书面和口头表达能力)。
检查您控制的任何值(参数,路径,标头?,Cookie?)是否在 HTML 中反射或被 JS 代码使用。
找到它被反射/使用的上下文。
如果反射
检查您可以使用哪些符号,并根据此准备有效载荷:
在原始 HTML中:
您能创建新的 HTML 标签吗?
您能使用支持 javascript:
协议的事件或属性吗?
您能绕过保护措施吗?
HTML 内容是否由任何客户端 JS 引擎(AngularJS,VueJS,Mavo...)解释,您可以滥用客户端模板注入。
如果您无法创建执行 JS 代码的 HTML 标签,您能滥用悬挂标记 - HTML 无脚本注入吗?
在HTML 标签内:
您能退出到原始 HTML 上下文吗?
您能创建新的事件/属性来执行 JS 代码吗?
您被困在的属性是否支持 JS 执行吗?
您能绕过保护措施吗?
在JavaScript 代码内:
您能转义 <script>
标签吗?
您能转义字符串并执行不同的 JS 代码吗?
您的输入是否在模板文字中 ``?
您能绕过保护措施吗?
正在执行的 JavaScript 函数
您可以指定要执行的函数名称。例如:?callback=alert(1)
如果被使用:
您可以利用DOM XSS,注意您的输入如何受控以及您的受控输入是否被任何接收器使用。
在处理复杂的 XSS 时,您可能会发现以下内容很有趣:
要成功利用 XSS,您首先需要找到的是在网页中反映您控制的值。
中间反射:如果您发现参数的值甚至路径的值在网页中被反射,您可以利用反射型 XSS。
存储和反射:如果您发现您控制的值被保存在服务器中,并且每次访问页面时都被反射,您可以利用存储型 XSS。
通过 JS 访问:如果您发现您控制的值正在使用 JS 访问,您可以利用DOM XSS。
在尝试利用 XSS 时,您首先需要知道您的输入在哪里被反射。根据上下文,您将能够以不同的方式执行任意 JS 代码。
如果您的输入在原始 HTML页面上被反射,您需要滥用一些HTML 标签以执行 JS 代码:<img,<iframe,<svg,<script
... 这些只是您可以使用的许多可能的 HTML 标签。
此外,请记住客户端模板注入。
如果您的输入被反映在标签属性的值内部,您可以尝试:
从属性和标签中逃脱(然后您将处于原始 HTML 中)并创建新的 HTML 标签以滥用:"><img [...]
如果您可以从属性中逃脱但无法从标签中逃脱(>
被编码或删除),取决于标签,您可以创建一个事件来执行 JS 代码:" autofocus onfocus=alert(1) x="
如果您无法从属性中逃脱("
被编码或删除),则取决于您的值被反映在哪个属性以及您是否控制所有值或仅一部分,您将能够滥用它。例如,如果您控制像 onclick=
这样的事件,您将能够使其在单击时执行任意代码。另一个有趣的例子是属性 href
,您可以使用 javascript:
协议来执行任意代码:href="javascript:alert(1)"
如果您的输入被反映在“无法利用的标记”内,您可以尝试使用**accesskey
技巧来滥用漏洞(您需要某种社会工程师来利用此漏洞):" accesskey="x" onclick="alert(1)" x="
**
如果您控制类名,Angular 执行 XSS 的奇怪示例:
在这种情况下,您的输入被反射在 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 提升指的是在使用后声明函数、变量或类的机会,因此您可以利用 XSS 正在使用未声明的变量或函数的情况。 查看以下页面获取更多信息:
一些网页端点接受函数名称作为参数来执行。在实际中常见的示例是类似这样的:?callback=callbackFunc
。
要找出用户直接提供的内容是否尝试执行,一个好方法是修改参数值(例如为'Vulnerable'),并在控制台中查看是否有错误,如:
如果存在漏洞,您可以通过发送值**?callback=alert(1)
来触发警报**。然而,这些端点通常会验证内容,只允许字母、数字、点和下划线([\w\._]
)。
然而,即使有这种限制,仍然可以执行一些操作。这是因为您可以使用这些有效字符来访问 DOM 中的任何元素:
一些有用的函数包括:
您还可以尝试直接触发Javascript函数:obj.sales.delOrders
。
然而,通常执行指定函数的端点是没有太多有趣DOM的端点,同一源中的其他页面将具有更有趣的DOM以执行更多操作。
因此,为了在不同DOM中滥用此漏洞,开发了**同源方法执行(SOME)**利用:
有一些JS代码正在不安全地使用一些由攻击者控制的数据,如location.href
。攻击者可以利用这一点执行任意JS代码。
这种类型的XSS可以在任何地方找到。它们不仅仅依赖于对Web应用程序的客户端利用,而是依赖于任何 上下文。这种任意JavaScript执行甚至可以被滥用以获得RCE,在客户端和服务器上读取 任意 文件等。 一些示例:
当您的输入被反映在HTML页面中或者您可以转义并在此上下文中注入HTML代码时,第一件事是检查您是否可以滥用<
来创建新标签:尝试反映该字符并检查它是否被HTML编码或删除,或者是否未经更改地反映。只有在最后一种情况下,您才能利用这种情况。
对于这些情况,还要记住客户端模板注入。
注意:HTML注释可以使用**** -->
或 ****--!>
在这种情况下,如果没有使用黑名单/白名单,您可以使用如下有效负载:
但是,如果使用了标签/属性的黑名单/白名单,您将需要暴力破解可以创建的标签。 一旦您找到了允许的标签,您将需要暴力破解找到的有效标签内的属性/事件,以查看如何攻击上下文。
前往https://portswigger.net/web-security/cross-site-scripting/cheat-sheet并单击_将标签复制到剪贴板。然后,使用Burp Intruder发送所有标签,并检查WAF是否未将任何标签识别为恶意。一旦您发现可以使用哪些标签,您可以使用有效标签暴力破解所有事件(在同一网页上单击将事件复制到剪贴板_,然后按照之前的相同步骤操作)。