XSS绕过之autofocus属性的自创标签(Chrome)
/0x00 前言
仅限于Chrome,因为这是Chrome的一个bug。
简单来说,就是在Chrome中autofocus可以与所有HTML标签一起使用。
0x01 使用已有的标签
下面两个标签是平时较为常用的,加上autofocus效果更佳。对于无法在没有用户交互的情况下无法转义元素上下文并需要XSS的情况很有用:
1 | <iframe autofocus onfocus=alert(0)> |
本地测试x.php:
1 |
|
在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
表示元素不是可编辑的。
如果没有设置该属性,其默认值继承自父元素。
该属性是一个枚举属性,而非布尔属性。这意味着必须显式设置其值为 true
、false
或空字符串中的一个,并且不允许简写为 <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 | <mi1k7ea style="-webkit-user-modify:read-write" onfocus=alert(/user-modify/) autofocus> |