0x00 前言

参考自:autofocus属性的自创标签xss(xss)

仅限于Chrome,因为这是Chrome的一个bug

简单来说,就是在Chrome中autofocus可以与所有HTML标签一起使用。

0x01 使用已有的标签

下面两个标签是平时较为常用的,加上autofocus效果更佳。对于无法在没有用户交互的情况下无法转义元素上下文并需要XSS的情况很有用:

1
2
<iframe autofocus onfocus=alert(0)>
<a autofocus onfocus=alert(1) href=x>x</a>

本地测试x.php:

1
2
3
4
5
<?php
error_reporting(0);
$x = $_GET['x'];
echo "Your input: $x";
?>

在Chrome上直接注入即可弹框,这里a标签由于是点击链接因此会一直自动点击弹框:

0x02 tabindex与contenteditable

原文指出因为任何HTML元素都可以通过’tabindex’或’contenteditable’进行聚焦,所以它也会支持’autofocus’:

tabindex

tabindex全局属性指示其元素是否可以聚焦,以及它是否/在何处参与顺序键盘导航(通常使用Tab键,因此得名)。

它接受一个整数作为值,具有不同的结果,具体取决于整数的值:

  • tabindex=负值 (通常是tabindex=“-1”),表示元素是可聚焦的,但是不能通过键盘导航来访问到该元素,用JS做页面小组件内部键盘导航的时候非常有用。
  • tabindex="0" ,表示元素是可聚焦的,并且可以通过键盘导航来聚焦到该元素,它的相对顺序是当前处于的DOM结构来决定的。
  • tabindex=正值,表示元素是可聚焦的,并且可以通过键盘导航来访问到该元素;它的相对顺序按照tabindex 的数值递增而滞后获焦。如果多个元素拥有相同的 tabindex,它们的相对顺序按照他们在当前DOM中的先后顺序决定。

根据键盘序列导航的顺序,值为 0 、非法值、或者没有 tabindex 值的元素应该放置在 tabindex 值为正值的元素后面。

在这里我们使用tabindex必须有个值,无论正负或0都可以,构造如下的自创xss标签触发弹框:

1
<xss tabindex=1 onfocus=alert(/tabindex/) autofocus>

contenteditable

contenteditable全局属性是一个枚举属性,表示元素是否可被用户编辑。 如果可以,浏览器会修改元素的部件以允许编辑。

该属性必须是下面的值之一:

  • true 或空字符串,表示元素是可编辑的;
  • false 表示元素不是可编辑的。

如果没有设置该属性,其默认值继承自父元素。

该属性是一个枚举属性,而非布尔属性。这意味着必须显式设置其值为 truefalse 或空字符串中的一个,并且不允许简写为 <label contenteditable>Example Label</label>正确的用法是 <label contenteditable="true">Example Label</label>

在这里我们可以构造如下自mi1k7ea标签触发弹框:

1
<mi1k7ea onfocus=alert(/contenteditable/) autofocus contenteditable>

0x03 user-modify

user-modify属性是非标准的,在最初是用于确定元素的内容是否可以由用户编辑,在Firefox中无效。

属性值如下:

  • read-only:默认值。内容是只读的。
  • read-write:用户能够读取和写入内容。
  • read-write-plaintext-only:与相同read-write,但富文本格式将丢失。
  • write-only:用户可以编辑内容,但不能阅读。

在这里我们可以利用的属性值为read-write和read-write-plaintext-only,构造如下自mi1k7ea标签触发弹框:

1
2
3
<mi1k7ea style="-webkit-user-modify:read-write" onfocus=alert(/user-modify/) autofocus>

<mi1k7ea style="-webkit-user-modify:read-write-plaintext-only" onfocus=alert(/user-modify/) autofocus>