为什么你的XSS过滤形同虚设?
很多开发者以为对输入做了过滤就能防住XSS,但攻击者早已演化出多种XSS绕过技巧,让看似严密的过滤形同虚设。比如,过滤了<script>标签,攻击者可以用<img src=x onerror=alert(1)>绕过;过滤了关键字,还可以用HTML实体编码、Unicode编码、十六进制编码等方式混淆。这些XSS绕过技巧在真实攻击中极为常见,而防护策略也需要随之升级,不能停留在简单的黑名单过滤层面。
常见的XSS绕过技巧盘点
标签与事件属性绕过
当<script>被过滤时,攻击者会转向其他标签和事件属性,例如<img onerror>、<svg onload>、<body onload>等。这些标签在浏览器中同样可以执行JavaScript,而很多过滤规则只针对script标签,导致绕过。
编码混淆绕过
攻击者利用HTML实体、URL编码、Unicode编码、Base64等对payload进行编码,使过滤规则无法匹配到原始字符串。例如,<img src=x onerror=alert(1)>,其中a是字母a的HTML实体编码,浏览器解析后仍会执行。
大小写与空白字符绕过
某些过滤规则区分大小写,攻击者可以混合大小写,如<ScRiPt>;或者利用换行符、制表符等空白字符插入到标签中,如<imgn src=x>,绕过基于正则的过滤。
协议与语法变体绕过
在URL中,攻击者可以使用javascript:协议,但过滤规则可能只检查http或https。此外,还可以利用<iframe src=javascript:alert(1)>等变体。
防护策略升级:从源头到边缘
面对这些XSS绕过技巧,传统的输入过滤和输出编码是基础,但不够。我们需要从应用层到基础设施层构建纵深防御。以下策略结合Cloudflare官方文档提供的能力,帮助你将防护提升到新的水平。
输入过滤与输出编码的强化
首先,必须坚持对用户输入进行严格的验证和过滤,白名单优于黑名单。同时,在输出到HTML、JavaScript、CSS、URL等不同上下文时,采用对应的编码函数。但要注意,任何过滤都可能被绕过,因此不能只依赖这一层。
利用CDN缓存降低攻击面
根据Cloudflare缓存文档,CDN可以缓存静态资源,减轻源服务器压力。但这与XSS防护有何关系?实际上,通过合理的缓存配置,可以缓存经过安全处理的页面版本,减少动态生成的漏洞点。例如,对于不常变化的页面,可以设置较长的缓存时间,降低攻击者触发漏洞的频率。但要注意,缓存不能缓存包含用户个性化数据的页面,否则可能导致信息泄露。
边缘计算:在请求到达源站前拦截
Cloudflare Workers允许你在边缘运行代码,根据Workers文档,你可以编写自定义逻辑来检查请求和响应。例如,在Workers中实现输入过滤规则,对请求参数进行实时检测,拦截可疑的XSS payload。由于Workers运行在全球网络边缘,可以在攻击到达源站之前将其阻断,显著提升防护效率。
// 示例:Workers中简单过滤XSS关键字
addEventListener('fetch', event => {
event.respondWith(handleRequest(event.request))
})
async function handleRequest(request) {
const url = new URL(request.url)
const params = url.searchParams
for (const value of params.values()) {
if (/<script|onerror|javascript:/i.test(value)) {
return new Response('Blocked', { status: 403 })
}
}
return fetch(request)
}
需要注意的是,这只是一个示例,实际防护规则需要更全面,避免误伤。
DDoS防护与XSS的关联
XSS攻击有时会与DDoS结合,攻击者通过XSS注入脚本,让受害者浏览器向目标发送大量请求,形成反射型DDoS。根据Cloudflare DDoS防护文档,Cloudflare的自动DDoS防护系统可以检测并缓解网络层和应用层的DDoS攻击。启用DDoS防护可以减轻这类攻击的影响,但要注意,这并不能直接阻止XSS,而是降低XSS被利用后的危害。
实战:排查与升级你的防护体系
第一步:审计现有过滤规则
列出你当前所有的输入过滤和输出编码规则,尝试用上述绕过技巧进行测试。例如,使用<img src=x onerror=alert(1)>、编码变体等,看是否能突破。
第二步:引入边缘防护
考虑在Cloudflare Workers中实现针对XSS的实时检测。你可以从简单的关键字过滤开始,逐步完善规则库。利用Workers的灵活性,可以动态更新规则,而不需要修改源站代码。
第三步:配置CDN缓存策略
根据网站内容类型,设置合理的缓存规则。对于静态资源,如JS、CSS、图片,可以缓存较长时间;对于动态页面,设置适当的缓存时间,并确保不被缓存。
第四步:启用DDoS防护
在Cloudflare控制面板中,确保DDoS防护处于启用状态。根据文档,Cloudflare自动检测并缓解DDoS攻击,你可以自定义规则来适应特定场景。
常见误区与失败条件
很多团队在防护升级中会犯以下错误:
- 只依赖单一防护层,比如只做输入过滤,忽略输出编码。
- 使用不完整的黑名单,导致绕过。
- 在边缘计算中设置过于严格的规则,导致误杀正常请求。
- 忽略缓存与动态内容的冲突,导致用户数据泄露。
升级防护是一个持续过程,没有一劳永逸的解决方案。你需要定期测试、更新规则,并关注最新的XSS绕过技术。
参考资料
延伸阅读
