XSS简介

Cross-Site Scripting(跨站脚本攻击)简称 XSS,是一种代码注入攻击。攻击者通过在目标网站上注入恶意脚本,使之在用户的浏览器上运行。利用这些恶意脚本,攻击者可获取用户的敏感信息如 Cookie、SessionID 等,进而危害数据安全

其本质是用户输入的内容被执行,所以不应该信任用户的输入内容,大致包含以下几类

  • 来自用户的 UGC 信息
  • 来自第三方的链接
  • URL 参数
  • POST 参数
  • Referer (可能来自不可信的来源)
  • Cookie (可能来自其他子域注入)

XSS危害

  • 取用户Cookie,获取用户隐私,盗取用户账号。
  • 劫持用户(浏览器)会话,从而执行任意操作,例如进行非法转账、强制发表日志、发送电子邮件等。
  • 强制弹出广告页面,刷流量等。
  • 传播跨站脚本蠕虫,网页挂马等。
  • 结合其他漏洞,如 CSRF 漏洞,实施进一步的攻击

XSS分类

持续时间分为持久型XSS攻击非持久型xss攻击
攻击方式分为反射型XSSDOM型XSS存储型XSS

反射型、DOM型主要是通过构造url或者输入框,使其被后台返回或者被js执行,存储型主要是通过类似评论等被存入数据库返回

XSS检测

  1. 通过手动构造字符检测
  2. 通过工具检测

XSS预防

对用户输入进行转义

在 XSS 攻击中,攻击者主要是通过构造特殊字符来注入脚本,所以对用户的输入进行检测就很有必要,并且需要在客户端与服务端都进行输入检测,然后对用户输入的数据进行转义。主要就是对输入所包含的特殊字符进行转义,如 \<,\>,&,",',来防止 XSS 攻击。
function escapeHTML(str) {
    if (!str) return '';
    str = str.replace(/&/g, "&amp;");
    str = str.replace(/</g, "&lt;");
    str = str.replace(/>/g, "&gt;");
    str = str.replace(/"/g, "&quot;");
    str = str.replace(/'/g, "&#39;");
    return str;
};

设置白名单

针对需要保留html的用户输入,选择设置html白名单

内容安全策略(CSP)

两种方法可以启用 CSP,通过启用CSP,明确哪些外部资源可以加载执行。一种是通过 HTTP 头信息的 Content-Security-Policy 的字段。

# HTTP头
Content-Security-Policy: script-src 'self'; 
                         object-src 'none';
                         style-src cdn.example.org third-party.org; 
                         child-src https:
# meta
<meta http-equiv="Content-Security-Policy" content="script-src 'self'; object-src 'none'; style-src cdn.example.org third-party.org; child-src https:">
/* 脚本: 只信任当前域名
<object>标签: 不信任任何 URL,即不加载任何资源
样式表: 只信任 cdn.example.org 和 third-party.org
页面子内容,如 <frame>、<iframe>: 必须使用HTTPS协议加载
其他资源: 没有限制 */

一些增加难度和减少损失的方法

  • HTTP-only Cookie
  • 限制输入内容长度
  • 尽量避免使用eval
  • 验证码

浏览器自带防御(X-XSS-Protection )

HTTP X-XSS-Protection 响应头是 Internet Explorer,Chrome 和 Safari 的一个功能,当检测到跨站脚本攻击(XSS)时,浏览器将停止加载页面。
X-XSS-Protection: 0     
# 禁止XSS过滤。     

X-XSS-Protection: 1       
# 启用XSS过滤(通常浏览器是默认的)。 如果检测到跨站脚本攻击,浏览器将清除页面(删除不安全的部分)。  

X-XSS-Protection: 1; mode=block  
# 启用XSS过滤。 如果检测到攻击,浏览器将不会清除页面,而是阻止页面加载。  

X-XSS-Protection: 1; report=<reporting-uri>    
# 启用XSS过滤。 如果检测到跨站脚本攻击,浏览器将清除页面并使用CSP report-uri指令的功能发送违规报告。
Last modification:July 13, 2021
如果觉得我的文章对你有用,请随意赞赏