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事件。
三、成功通关
