PortSwigger靶场之Reflected-XSS-in-canonical-link-tag通关秘籍
PortSwigger靶场之Reflected XSS in canonical link tag通关秘籍
一、题目分析
该靶场规范链接标签中用户输入并转义尖括号,由于尖括号<>被编码,无法注入标签,不能注入像 <script>
或 <img src=x onerror=alert(1)>
这样的新标签。
所以我们需要利用页面中已存在的标签,通过其属性事件或内容触发脚本执行。我们可以发现注入点在<link>
标签内,但是由于<link>
标签本身是一个“不可见”也“不可交互”的元素。用户不会去点击它,鼠标也无法悬停(hover)在上面。这就意味着,即使我们成功注入了像 onclick
、onmouseover
、onfocus
这样的事件处理器,也没有常规的办法去触发它们。用户不会去点击一个看不见的 <link>
标签。
本靶场我们利用的accesskey
属性就是解决这个“无法触发”问题的关键。
accesskey
的作用:它是一个HTML全局属性,功能是为页面上的一个元素创建一个键盘快捷键。攻击思路:通过注入
accesskey='x'
,您就等于给那个原本无法交互的<link>
标签赋予了一个快捷键x
。当用户按下与该快捷键匹配的组合键时(比如Alt+X
),浏览器会执行两件事:- 聚焦 (focus) 到这个
<link>
元素上。 - 激活 (activate) 这个元素,这通常等同于模拟一次鼠标点击(click)事件。
- 聚焦 (focus) 到这个
因此,当您同时注入 accesskey='x'
和 onclick='alert(1)'
时,整个攻击链就形成了:
accesskey='x'
负责提供【触发器】,而 onclick='alert(1)'
负责提供【攻击载荷】。
没有 accesskey
,onclick
就是个空有威力的炸弹但没有引信;没有 onclick
,accesskey
就只是个无害的快捷键。两者结合,才能完成攻击。
ps:这就体现了提示告诉我们的可以假设模拟用户将按下以下组合键:
不同的操作系统和浏览器激活 accesskey
的方式不同(提示的X就是我们的key):
- Chrome/Edge (Windows/Linux):
Alt
+[key]
- Firefox (Windows/Linux):
Alt
+Shift
+[key]
- Chrome/Firefox (Mac):
Ctrl
+Alt
+[key]
二、攻击过程
1、初步尝试
一般来说,反射型 XSS 的注入点在 URL 参数或者表单提交等会被服务器直接返回给浏览器的地方。
一般我们可以尝试在页面上的各种输入框中输入测试字符,进入页面发现没有搜索框,进入帖子发现是评论区。此时查看代码发现随着打开帖子的不同,postId 参数的值在改变。
尝试修改 postId 的值,发现 **“Invalid blog post ID” ,**页面不存在。
既然无法修改参数内容,那我们尝试修改参数名,发现页面有响应,且被写入 标签 ,通过参数赋值写入尖括号<>发现如题目所说被编码,尝试利用页面中已存在的 标签,通过其属性事件或内容触发脚本执行。
2、构造payload
accesskey 是 HTML 元素的一个全局属性,用于定义快捷键。当用户按下对应的快捷键,浏览器会聚焦到该元素,方便键盘导航。如我们上面的题目分析
Payload:?'accesskey='x'onclick='alert(1)
//此处不能加空格:?'accesskey='x' onclick='alert(1)不然空格可能会被错误地编码(如变成+或%20)或导致参数解析中断
利用第一个单引号闭合 **href ,**跳出 href
属性的限制,注入新的属性,当用户访问这个链接就相当于按下对应的快捷键,浏览器会执行 alert(1),弹出提示框。
ps:Chrome 中用Alt+X快捷键
3、攻击流程
- 我们将这个构造好的恶意URL提交给靶场。
- 靶场的模拟用户机器人访问该URL。
- 机器人自动按下
Alt+X
组合键。 - 浏览器检测到这个快捷键,激活了
<link>
元素,并模拟了一次click
事件。