Cross-site scripting contexts:XSS评论区漏洞

HTML 标签属性中的 XSS

当 XSS 上下文进入 HTML 标记属性值时,您有时可能能够终止属性值、关闭标记并引入一个新标记。例如:

"><script>alert(document.domain)</script>

在这种情况下更常见的是,尖括号被阻止或编码,因此您的输入不能脱离它出现的标签。如果您可以终止属性值,您通常可以引入一个新属性来创建可编写脚本的上下文,例如事件处理程序。例如:

" autofocus onfocus=alert(document.domain) x="

上面的payload创建了一个onfocus事件,当元素接收到焦点时将执行JavaScript,并且还添加了autofocus属性来尝试在onfocus没有任何用户交互的情况下自动触发事件。最后,它添加x="以优雅地修复以下标记。

有时 XSS 上下文是一种 HTML 标签属性,它本身可以创建一个可编写脚本的上下文。在这里,您可以在不需要终止属性值的情况下执行 JavaScript。例如,如果 XSS 上下文进入href锚标记的属性,则可以使用javascript伪协议来执行脚本。例如:

<a href="javascript:alert(document.domain)">

您可能会遇到对尖括号进行编码但仍允许您注入属性的网站。有时,即使在通常不会自动触发事件的标签(例如规范标签)中,这些注入也是可能的。您可以在 Chrome 上使用访问键和用户交互来利用此行为。访问键允许您提供引用特定元素的键盘快捷键。该accesskey属性允许您定义一个字母,当与其他键(这些键因不同平台而异)组合按下时,将导致事件触发。在下一个实验中,您可以试验访问密钥并利用规范标签。

XSS 转换成 JavaScript

当 XSS 上下文是响应中的一些现有 JavaScript 时,可能会出现各种各样的情况,需要不同的技术来执行成功的利用。

终止现有脚本

在最简单的情况下,可以简单地关闭包含现有 JavaScript 的脚本标记,并引入一些将触发 JavaScript 执行的新 HTML 标记。例如,如果 XSS 上下文如下:

然后您可以使用以下有效负载来突破现有的 JavaScript 并执行您自己的:

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

这样做的原因是浏览器首先执行 HTML 解析来识别页面元素,包括脚本块,然后才执行 JavaScript 解析来理解和执行嵌入的脚本。上述有效负载使原始脚本损坏,并带有未终止的字符串文字。但这并不能阻止后续脚本以正常方式解析和执行。

跳出 JavaScript 字符串

在 XSS 上下文位于带引号的字符串文字内的情况下,通常可以跳出字符串并直接执行 JavaScript。必须在 XSS 上下文之后修复脚本,因为那里的任何语法错误都会阻止整个脚本执行。

打破字符串文字的一些有用方法是:

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

一些应用程序试图通过使用反斜杠转义任何单引号字符来防止输入超出 JavaScript 字符串。字符前的反斜杠告诉 JavaScript 解析器该字符应该按字面解释,而不是像字符串终止符这样的特殊字符。在这种情况下,应用程序经常会犯错误,未能转义反斜杠字符本身。这意味着攻击者可以使用自己的反斜杠字符来抵消应用程序添加的反斜杠。

例如,假设输入:

';alert(document.domain)//

转换为:

\';alert(document.domain)//

您现在可以使用替代有效负载:

\';alert(document.domain)//

转换为:

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

这里,第一个反斜杠意味着第二个反斜杠按字面解释,而不是作为特殊字符。这意味着引号现在被解释为字符串终止符,因此攻击成功。

一些网站通过限制您可以使用的字符使 XSS 变得更加困难。这可以在网站级别进行,也可以通过部署 WAF 来阻止您的请求到达网站。在这些情况下,您需要尝试其他方法来调用绕过这些安全措施的函数。一种方法是使用throw带有异常处理程序的语句。这使您可以在不使用括号的情况下将参数传递给函数。以下代码将alert()函数分配给全局异常处理程序,并且该throw语句将 传递1给异常处理程序(在本例中为alert)。最终结果是该alert()函数1作为参数被调用。

onerror=alert;throw 1

下一个实验演示了一个过滤某些字符的网站。您必须使用与上述技术类似的技术来解决它。

使用 HTML 编码

当 XSS 上下文是引用标记属性中的一些现有 JavaScript(例如事件处理程序)时,可以使用 HTML 编码来绕过某些输入过滤器。

当浏览器解析出响应中的 HTML 标签和属性时,它将在进一步处理标签属性值之前对它们进行 HTML 解码。如果服务器端应用程序阻止或清理成功利用 XSS 所需的某些字符,您通常可以通过对这些字符进行 HTML 编码来绕过输入验证。

例如,如果 XSS 上下文如下:

<a href="#" onclick="... var input='controllable data here'; ...">

并且应用程序阻止或转义单引号字符,您可以使用以下有效负载来突破 JavaScript 字符串并执行您自己的脚本:

&apos;-alert(document.domain)-&apos;

该'序列是一个表示撇号或单引号的 HTML 实体。由于浏览器onclick在解释 JavaScript 之前对属性值进行 HTML 解码,因此实体被解码为引号,成为字符串分隔符,因此攻击成功。

JavaScript 模板文字中的 XSS

JavaScript 模板文字是允许嵌入 JavaScript 表达式的字符串文字。嵌入的表达式会被计算并通常连接到周围的文本中。模板文字被封装在反引号中而不是普通的引号中,并且使用${...}语法标识嵌入的表达式。

例如,以下脚本将打印一条包含用户显示名称的欢迎消息:

document.getElementById('message').innerText = `Welcome, ${user.displayName}.`;

当 XSS 上下文进入 JavaScript 模板文字时,不需要终止文字。相反,您只需使用${...}语法嵌入一个 JavaScript 表达式,该表达式将在处理文字时执行。例如,如果 XSS 上下文如下:

<script>
...
var input = `controllable data here`;
...
</script>

那么您可以使用以下有效负载来执行 JavaScript,而无需终止模板文字:

${alert(document.domain)}

AngularJS 沙箱上下文中的 XSS

有时,在 AngularJS 沙箱的上下文中会出现 XSS 漏洞。这给开发带来了额外的障碍,通常可以通过足够的独创性来规避。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Zeker62

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值