XSS-哪些HTML标记和属性可以触发Javascript事件?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (4)
  • 关注 (0)
  • 查看 (290)

我正试图编码一个安全和轻量级的基于白名单的HTML净化器,它将使用DOMDocument。为了避免不必要的复杂性,我愿意作出以下妥协:

  • HTML注释被删除
  • scriptstyle标签一起被剥去
  • body对象的子节点标记将被返回。
  • 所有能够触发Javascript事件的HTML属性都将被验证或删除

问题是,我不确定其他标记和属性(在任何XHTML版本和/或浏览器版本/实现)可以触发Javascript事件,此外默认Javascript事件属性:

  • onAbort
  • onBlur
  • onChange
  • onClick
  • onDblClick
  • onDragDrop
  • onError
  • onFocus
  • onKeyDown
  • onKeyPress
  • onKeyUp
  • onLoad
  • onMouseDown
  • onMouseMove
  • onMouseOut
  • onMouseOver
  • onMouseUp
  • onMove
  • onReset
  • onResize
  • onSelect
  • onSubmit
  • onUnload

是否还有其他非默认或专有事件属性可以触发Javascript(或VBScript等)事件或代码执行?我能想到hrefstyleaction,例如:

<a href="javascript:alert(document.location);">XSS</a> // or
<b style="width: expression(alert(document.location));">XSS</b> // or
<form action="javascript:alert(document.location);"><input type="submit" /></form>

我可能会把任何style属性在HTML标记中,actionhref属性带来了更大的挑战:

$value = $attribute->value;

if ((strpos($value, ':') !== false) && (preg_match('~^(?:(?:s?f|ht)tps?|mailto):~i', $value) == 0))
{
    $node->removeAttributeNode($attribute);
}

所以,我的两个明显的问题是:

  1. 我是否遗漏了任何可以触发事件的标记或属性?
  2. 是否有这些规则没有涵盖的攻击向量?

经过大量的测试、思考和研究,我想出了以下(相当简单)实现似乎对任何XSS攻击矢量都免疫。

提问于
用户回答回答于

你提到hrefactionjavascript的地方:URLs可以出现,但是你在一堆其他URL加载属性中缺少src属性。

OWASP Java HTMLPolicyBuilder第399行是白色列表HTML清洗剂中URL属性的定义。

private static final Set <String> URL_ATTRIBUTE_NAMES = ImmutableSet.of(“action”,“archive”,“background”,“cite”,“classid”,“codebase”,“data”,“dsync”,“formaction” href“,”icon“,”longdesc“,”manifest“,”poster“,”profile“,”src“,”usemap“);

HTML5索引包含属性类型的摘要。 它没有提及像<input type = URL value = ...>这样的有条件的东西,但是如果你扫描该列表中的有效URL和朋友,你应该对HTML5增加的内容有一个体面的想法。 类型为%URI的HTML 4属性集也是有用的。

协议白名单与OWASP清理程序非常相似。 ftpsftp的加入看起来足够无害。

与HTML元素和属性相关的安全相关模式信息的一个很好的来源是Caja JS消毒器使用的Caja JSON白名单

你打算如何渲染生成的DOM? 如果你不小心,那么即使你去掉了所有的<script>元素,攻击者也可能会得到一个错误的渲染器来生成浏览器解释为包含<script>元素的内容。 考虑不包含脚本元素的有效HTML。

<textarea><&#47;textarea><script>alert(1337)</script></textarea>

一个bug的渲染器可以输出这些内容如下:

<textarea></textarea><script>alert(1337)</script></textarea>

它确实包含一个脚本元素。

用户回答回答于

检查这两个链接以获得其他参考:

http://adamcecc.blogpot.com/2011/01/javascript.html(这只适用于当被“过滤”输入时,它会在页面上的脚本标记之间找到自己)

http://ha.ckers.org/xss.html(其中列出了许多特定于浏览器的事件触发器)

我已经使用了HTML Purifier,因为这个原因也与一个wysiwyg编辑器结合使用。 我所做的不同之处在于使用非常严格的白名单,并提供了几个基本的标记标记和属性,并在需要出现时对其进行扩展。 这样可以避免受到非常晦涩难懂的矢量(如上面的第一个链接)的攻击,可以逐个挖掘新需要的标记/属性。

用户回答回答于

在html和ecmascript规范中日益增长的功能的这个时代,避免脚本注入和其他html中的这些漏洞变得越来越困难。 随着每一个新的添加,介绍了可能的注射整个世界。 这是因为不同的浏览器可能对实现这些规范的方式有不同的想法,所以会遇到更多可能的漏洞。

请看一张简短的HTML 5向量列表。

最好的解决方案是选择你会允许的,而不是你会否认的。 说“这些标签和这些给定标签的属性是允许的,其他的一切都会相应地消毒或者丢弃”。

事实上,可能有许多注射载体甚至不被黑帽子或白帽子所知。 正如ha.ckers网站所述,脚本注入实际上只受到头脑的限制。

我想至少回答一下你的具体问题,下面是你的黑名单中一些明显的遗漏:

  • imgsrc属性。我认为重要的是要注意src是其他元素的有效属性,可能会造成潜在的危害。imgdynsrclowsrc甚至更多。
  • typelanguage属性
  • CDATA除了html注释。
  • 不正确地净化输入值。这可能不是一个问题,取决于您的html解析有多严格。
  • 任何模棱两可的特殊字符。在我看来,即使是毫不含糊的,也可能应该被编码。
  • 属性上缺少或不正确的引号(如“坟墓引号”)。
  • 文本框标记过早关闭。
  • 脚本中的utf-8(和7)编码字符
  • 即使只返回Body标记的子节点,许多浏览器仍然会计算head,和html的内部元素body,而且大多数head-仅在body总之,这可能帮不了什么忙。
  • css表达式,背景图像表达式
  • frameS和iframe
  • embed而且很可能objectapplet
  • 服务器端
  • PHP标签
  • 任何其他注入(SQL注入、可执行注入等)

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励