挑战描述
在实际应用中,开发者通常会实施一些基础的过滤机制来防止XSS攻击。但是,不完善的过滤往往可以被绕过。这个挑战模拟了一个有基础过滤的搜索功能。
目标:绕过输入过滤机制,成功执行JavaScript代码并弹出包含"XSS"的警告框。
过滤机制分析
// 基础过滤函数
function basicFilter(input) {
// 过滤常见的XSS标签(不完善的过滤)
let filtered = input;
// 过滤script标签(仅小写)
filtered = filtered.replace(/<script>/gi, '');
filtered = filtered.replace(/<\/script>/gi, '');
// 过滤一些危险的事件(不完整)
filtered = filtered.replace(/javascript:/gi, '');
filtered = filtered.replace(/on\w+=/gi, '');
return filtered;
}
// 搜索处理函数
function handleSearch(query) {
// 应用基础过滤
const filteredQuery = basicFilter(query);
// 显示搜索结果(存在XSS漏洞)
document.getElementById('searchResult').innerHTML =
'搜索结果:' + filteredQuery;
}
// 过滤分析:
// 1. 只过滤了小写的script标签
// 2. 事件处理器过滤不完整
// 3. 没有考虑HTML实体编码
// 4. 没有过滤其他危险标签如img、svg等
// 5. 可以通过大小写混合、编码等方式绕过