黑客入门——XSS攻击与防御

黑客入门——XSS攻击与防御
最新回答
奶茶

2026-05-23 13:17:09

XSS(跨站脚本攻击)是一种通过在网页中注入恶意脚本实现攻击的技术,常见攻击方法包括绕过过滤、利用标签属性、事件、CSS、字符编码等,防御需遵循输入过滤与输出编码原则,结合XSS Filter、HTML实体编码、JavaScript编码及HttpOnly Cookie等措施。

XSS常见攻击方法
  • 绕过XSS-Filter:攻击者利用<>标签注入Html/JavaScript代码,例如直接插入<script>alert('XSS')</script>。若服务器未严格过滤用户输入,恶意代码可能被执行。

  • 利用HTML标签属性值:通过标签属性(如src、href)嵌入JavaScript伪协议,例如:<img src="javascript:alert('xss')"/>。此类攻击依赖浏览器对伪协议的支持,存在局限性。

  • 利用空格、回车和Tab绕过过滤:若XSS Filter仅黑名单敏感字符(如javascript),攻击者可插入空格或换行符拆分关键词,例如:<img src="javas cript:alert(/xss/);"/>。

  • 利用事件执行脚本:通过触发错误事件(如onerror)执行恶意代码,例如:<img src="#" onerror="alert(1)"/>。当src加载失败时,onerror事件被触发。

  • 利用CSS跨站:在CSS样式中嵌入JavaScript伪协议,例如:body {background-image: url("javascript:alert('xss')")}。需用户交互(如鼠标悬停)才可能触发。

  • 扰乱过滤规则:通过大小写混合或变形关键词绕过过滤,例如:<IMG SRC="javaSCript:alert(/xss/);"/>。

  • 利用字符编码:使用Unicode、十六进制或十进制编码隐藏恶意代码,例如:<img src="&#x6A;&#x61;&#x76;&#x61..."(对应javascript:alert(1))。此类攻击可绕过基于关键词的过滤。

  • 拆分跨站法:将代码拆分为多部分绕过长度限制,例如:<a href="javas" onclick="alert(1)">click</a><script>cript:...</script>。适用于未过滤<>但限制输入长度的场景。

  • DOM型XSS:通过客户端脚本动态输出数据到页面,无需提交至服务器。常见输入源包括:Document.URL、Location.href、Document.cookie、localStorage等。例如:<script>document.body.innerHTML=location.hash.slice(1)</script>。

图:XSS攻击代码嵌入网页的示意图XSS防御措施
  • 使用XSS Filter

    验证输入数据类型:例如限制年龄为整数、姓名为字母数字组合。

    过滤特殊标签:移除<script>、<iframe>等危险标签。

    移除事件属性:过滤onclick、onerror等事件处理属性。

    示例:使用正则表达式匹配并过滤<script.*?>.*?</script>。

  • HTML实体编码

    对插入HTML标签间的不可信数据进行编码,将特殊字符转换为实体编号,例如:< → &lt;,> → &gt;,& → &amp;。

    避免直接解析用户输入,防止恶意脚本执行。

  • JavaScript编码

    对动态生成的JavaScript代码中的不可信数据进行编码,例如: → ,/ → /,; → ;(全角分号)。

    严格模式下,对非字母数字字符使用十六进制xhh编码。

    确保变量值在引号内部,例如:<script>var data = "x3Cscriptx3E...";</script>。

  • HttpOnly Cookie

    将重要Cookie(如会话ID)标记为HttpOnly,禁止JavaScript通过document.cookie访问。

    示例:Set-Cookie: sessionId=abc123; HttpOnly; Secure。

  • 内容安全策略(CSP)

    通过HTTP头Content-Security-Policy限制资源加载来源,例如:Content-Security-Policy: default-src 'self'; script-src 'self'

    https://trusted.cdn.com
    。

    禁止内联脚本执行,减少攻击面。

  • 输入长度限制与白名单

    限制用户输入长度,防止代码拆分攻击。

    使用白名单允许特定字符(如仅字母、数字),拒绝其他输入。

  • DOM型XSS防御

    对动态输出的DOM数据进行编码,避免直接使用innerHTML。

    使用textContent替代innerHTML,或对输入进行严格过滤。

总结

XSS攻击的核心是利用未过滤的用户输入执行恶意脚本,防御需结合输入验证、输出编码、安全配置(如HttpOnly、CSP)及开发者安全意识。定期安全测试与代码审计可进一步降低风险。