XSS 的定义
跨站脚本攻击(cross-site scripting,简称 XSS),是黑客用来潜入 Web 应用程序的最普遍的应用程序层攻击之一。攻击者往Web页面里插入恶意html代码,当用户浏览该页面时,嵌入Web里的html代码会被执行,从而达到恶意攻击用户的特殊目的。
XSS 的目的
盗走客户端 cookies(相当于我们打开房间的钥匙),或者任何可以用于在 Web 站点确定客户身份的其他敏感信息。获取这些信息后,黑客就有了合法用户的身份,从而可以冒充用户与站点交互。
XSS 的危害
盗取各类用户帐号,如机器登录帐号、用户网银帐号、各类管理员帐号;
控制企业数据,包括读取、篡改、添加、删除企业敏感数据的能力;
盗窃企业重要的具有商业价值的资料;
非法转账;
强制发送电子邮件;
网站挂马;
控制受害者机器向其它网站发起攻击
常见的 XSS
反射型XSS、存储型XSS和DOM型XSS。
三种常见的XSS
反射型 XSS
反射型XSS,简单理解,即把用户输入的数据“反射”给浏览器。该类型只是简单地将用户输入的数据直接或未经过完善的安全过滤就在浏览器中进行输出,导致输出的数据中存在可被浏览器执行的代码数据。
攻击者通常需要诱使用户点击恶意构造的包含XSS代码URL才能攻击成功。当用户点击恶意构造的URL之后,在URL中的XSS代码作为输入提交到服务器端,服务器解析后响应,在响应内容中出现这段XSS代码,最终这段XSS代码被浏览器解析执行。
存储型 XSS
存储型XSS脚本攻击是指Web应用程序会将用户输入的数据信息保存在服务端的数据库或其他文件形式中,网页进行数据查询展示时,会从数据库中获取数据内容,并将数据内容在网页中进行输出展示,因此存储型XSS具有较强的稳定性。
存储型XSS脚本攻击最为常见的场景就是在博客或新闻发布系统中,黑客将包含有恶意代码的数据信息直接写入文章或文章评论中,所有浏览文章或评论的用户,都会在他们客户端浏览器环境中执行插入的恶意代码。
DOM型 XSS
DOM就是文档对象模型(Document Object Model),是在浏览器中展示文档的一种结构格式。DOM使用java script动态脚本来表示文档的结构,比如表单字段或会话cookie。DOM同样可以用作浏览器安全-例如,限制脚本获取其他领域的cookie值。基于DOM的XSS缺陷可能会发生在当前活动的界面,比如一个java script函数请求修改DOM元素,攻击者可以利用当前函数进行攻击。
常见的存储型和反射型的XSS攻击,需要将代码发送到服务器端,然后将结果返回到浏览器。此种利用方式的代码仅仅会在浏览器端执行,不会发送到服务器端。
对于DOM XSS攻击,通常不能进行黑盒测试,因为它需要的不是可以访问到源代码,而是根据客户端的代码进行攻击。自动化测试很少会发现基于DOM的XSS攻击,因为自动化测试是通过发送特定的字段来观察服务器的响应。
漏洞防御
在用户提交参数前,将提交的字符< 、>、&、" 、' 、+、/等进行转义,严格控制输出。
将输入转化为小写对比,若匹配则过滤。
将cookie设置为http-only,js脚本将无法读取到cookie信息。
纯前端渲染,明确innerText、setAttribute、style,将代码与数据分隔开。
避免不可信的数据拼接到字符串中传递给这些API,如DOM中的内联事件监听器,location、onclick、onerror、onload、onmouseover等,标签的href属性,java script的、setTimeout()、setInterval()等,都能把字符串作为代码运行。
对于不受信任的输入,都应该限定一个合理的长度。
严格的CSP,禁止加载外域代码,禁止外域提交,禁止内联脚本执行等较为严格的方式。