【问题标题】:XSS without HTML tags没有 HTML 标签的 XSS
【发布时间】:2020-08-23 16:20:14
【问题描述】:

如果我的输入不允许 字符,是否可以进行 XSS 攻击?

Example: I enter <script>alert('this');</script> text

但是如果我删除 脚本不是文本:

I enter script alert('this'); script text

【问题讨论】:

  • 如何呈现用户的输入?又名,打印它的代码在哪里?
  • 用户输入呈现为纯文本(未转义),删除字符
  • 从我的头上看,仍然肯定会有 UTF-7 编码的 XSS 可能。然后它取决于文本渲染的上下文(即它是否仅在 标签内,或者在更具体的文本区域上下文中,或者在 html 标签内等等)

标签: html security xss


【解决方案1】:

是的,它仍然是可能的。

例如假设您的网站将用户输入注入到以下位置

<img src="http://example.com/img.jpg" alt="USER-INPUT" />

如果USER-INPUT" ONLOAD="alert('xss'),这将呈现

<img src="http://example.com/img.jpg" alt="" ONLOAD="alert('xss')" />

不需要尖括号。

另外,请查看OWASP XSS Experimental Minimal Encoding Rules

对于 HTML 正文:

HTML 实体编码

在元标记中指定字符集以避免 UTF7 XSS

对于 XHTML 正文:

HTML 实体编码

将输入限制为字符集http://www.w3.org/TR/2008/REC-xml-20081126/#charsets

因此,在正文中,您只需编码(或删除)通常推荐用于防止 XSS 的字符子集即可。但是,您不能在属性中执行此操作 - 完整的 XSS (Cross Site Scripting) Prevention Cheat Sheet 推荐以下内容,并且他们没有最小的替代方案:

除字母数字字符外,使用 HTML Entity &amp;#xHH; 格式转义所有字符,包括空格。 (HH = 十六进制值)

主要是涵盖了指定属性值的三种方式:

  • 未引用
  • 单引号
  • 双引号

以这种方式编码将在所有三种情况下防止属性值中出现 XSS。

还要注意UTF-7 攻击不需要尖括号字符。但是,除非字符集明确设置为 UTF-7,否则这种类型的攻击 isn't possible in modern browsers

+ADw-script+AD4-alert(document.location)+ADw-/script+AD4-

还要注意允许使用诸如 href 之类的 URL 的属性,并确保任何用户输入都是有效的 Web URL。强烈建议使用信誉良好的库来验证 URL,并使用允许列表方法(例如,如果协议不是 HTTPS,则拒绝)。试图阻止像javascript: 这样的序列是不够的。

【讨论】:

    【解决方案2】:

    如果用户提供的输入打印在 HTML 属性中,您还需要转义引号,否则您将成为以下易受攻击的输入:

    " onload="javascript-code" foobar="
    

    您还应该转义 & 字符,因为它通常需要在 HTML 文档中进行编码,否则可能会破坏您的布局。

    所以你应该注意以下字符: & ' "

    但是,您不应该完全去除它们,而是用正确的 HTML 代码替换它们,即 < > & ” '

    【讨论】:

      猜你喜欢
      • 2017-01-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-30
      • 2017-04-04
      • 2015-08-25
      • 1970-01-01
      相关资源
      最近更新 更多