挑战描述
存储型XSS是最危险的XSS类型,恶意代码被永久存储在服务器上,每当用户访问包含恶意代码的页面时都会执行攻击。这种攻击影响所有访问该页面的用户。
目标:在留言板中提交恶意代码,使其被存储并在页面显示时执行,弹出包含"XSS"的警告框。
漏洞代码分析
// 模拟服务器端存储逻辑
function addComment(name, message) {
// 直接存储用户输入,没有任何过滤(存在XSS漏洞)
const comment = {
id: Date.now(),
name: name,
message: message, // 危险:直接存储原始输入
timestamp: new Date().toLocaleString()
};
// 存储到本地存储(模拟数据库)
let comments = JSON.parse(localStorage.getItem('comments') || '[]');
comments.push(comment);
localStorage.setItem('comments', JSON.stringify(comments));
return comment;
}
// 显示留言的函数
function displayComments() {
const comments = JSON.parse(localStorage.getItem('comments') || '[]');
const container = document.getElementById('comments');
container.innerHTML = '';
comments.forEach(comment => {
// 危险:直接使用innerHTML输出用户数据
container.innerHTML += `
<div class="comment">
<strong>${comment.name}</strong>
<span class="timestamp">${comment.timestamp}</span>
<p>${comment.message}</p> // XSS漏洞点
</div>
`;
});
}
// 漏洞分析:
// 1. 用户输入直接存储,没有验证或过滤
// 2. 显示时使用innerHTML,允许HTML/JS执行
// 3. 影响所有访问页面的用户(持久化攻击)