深入理解XSS攻击与防御
深入理解XSS攻击与防御
What is XSS
首先可以先看一段英文原文介绍:
Cross-site scripting (XSS) is a type of injection security attack in which an attacker injects data, such as a malicious script, into content from otherwise trusted websites. Cross-site scripting attacks happen when an untrusted source is allowed to inject its own code into a web application, and that malicious code is included with dynamic content delivered to a victim’s browser.
跨站脚本攻击(Cross Site Scripting),为了不和层叠样式表(Cascading Style Sheets,CSS)缩写混淆,所以将跨站脚本攻击缩写为XSS。
恶意攻击者往Web页面里插入恶意javaScript代码,当用户浏览该页之时,嵌入其中Web里面的javaScript代码会被执行,从而达到恶意攻击用户的目的。
简而言之就是在网页里面埋入恶源代码劫持用户的信息投递到预设的网站上去的一种黑客攻击手段。
XSS攻击的类型
XSS一般分为三类,反射型XSS、存储型XSS、DOM Based XSS。
- 反射型XSS(也常被称为非持久型XSS)
反射型XSS只是简单的把用户输入的数据“反射”给浏览器,也就是说需要诱使用户“点击”一个恶意链接,才能攻击成功。
漏洞产生的原因是攻击者注入的数据反映在响应中。非持久型XSS攻击要求用户访问一个被攻击者篡改后的链接,用户访问该链接时,被植入的攻击脚本被用户游览器执行,从而达到攻击目的。
- 储存型XSS(也常被称为持久型XSS)
储存型XSS会把用户输入的数据“储存”在服务器端。这种XSS具有很强的稳定性。持久的XSS相比非持久性XSS攻击危害性更大,容易造成蠕虫,因为每当用户打开页面,查看内容时脚本将自动执行。
持久型XSS最大的危害在于可能在一个系统中的用户间互相感染,以致整个系统的用户沦陷。能够造成这种危害的脚本我们称之为XSS蠕虫。
- DOM Based XSS
实际上,这种类型的XSS并非按照“数据是否保存在服务器端”来划分的,从效果上来说也是反射型XSS单独划分出来的,因为DOM Based XSS 的形成原因比较特别。这是由于客户端脚本自身解析不正确导致的安全问题。
XSS攻击原理
- 反射型XSS攻击原理
反射型XSS通过给别人发送有恶意脚本代码参数的URL,当URL地址被打开时,特有的恶意代码参数被HTML解析、执行。
它的特点:是非持久化,必须用户点击带有特定参数的链接才能引起。
可通过下图所示的场景来理解反射型XSS攻击原理。
1、用户误点开了带攻击的url
2、网站给受害者的返回中包含了来自URL的的恶意文本
3、用户的浏览器收到文本后执行页面,会在网页中弹窗aaa(alert(‘aaa’))
反射型的攻击需要用户主动的去访问带攻击的链接,攻击者可以通过邮件、短信、甚至会放美女照片等形式,诱导受害者点开链接。
- 储存型XSS攻击原理
存储型的攻击脚本被存储到了数据库或者文件中,服务端在读取了存储的内容回显了。就是存储型。这种情况下用户直接打开正常的页面就会看到被注入
大致流程如下:
坏人把恶意的XSS代码提交网站—>网站把XSS代码存储进数据库—>当页面再次被其他正常用户请求时,服务器发送已经被植入XSS代码的数据给客户端—>客户端执行XSS代码
可通过下图所示的场景来理解储存型XSS攻击原理。
1、攻击者通过评论表单提交将恶意提交到网站
2、网站后端对提交的评论数据不做任何操作,直接存储到数据库中
3、其他用户访问正常访问网站,并且需要请求网站的评论数据
4、网站后端会从数据库中取出数据,直接返回给用户
5、用户得到页面后,直接运行攻击者提交的恶意代码,所有用户都会在网页中弹出aaa的弹窗(alert(‘aaa’)),完成攻击。
这种攻击方式恶意代码会被存储在数据库中,其他用户在正常访问的情况下,也有会被攻击,影响的范围比较大
- DOM Based XSS 攻击原理
基于 DOM 的跨站点脚本注入的方式是基于前面反射型XSS和储存型XSS方式的,只不过是注入的脚本是通过改变 DOM 来实施的。采用该种方式有一个好处就是从源代码中不易被发现而已。DOM-based XSS漏洞是基于文档对象模型Document Objeet Model 的一种漏洞。DOM是一个与平台、编程语言无关的借口,它允许程序或脚本动态的访问或者更新文档内容、结构和样式,处理后的结果能够成为显示页面的一部分。DOM中有很多对象,其中一些事用户可以操作的.客户端的脚本程序可以通过DOM动态地检查和修改页面内容,它不依赖于提交数据到服务器端,而从客户端获得DOM中的数据在本地执行,如果DOM中的数据没有经过严格的确认,就会产生DOM-based XSS漏洞。
可通过下图所示的场景来理解储存型DOM Based XSS 攻击原理。
1、用户误点开了带攻击的url
2、网站给受害者的返回中正常的网页
3、用户的浏览器收到文本后执行页面合法脚本,这时候页面恶意脚本会被执行,会在网页中弹窗aaa(alert(‘aaa’))
这种攻击方式发生在我们合法的js执行中,服务器无法检测我们的请求是否有攻击的危险。
XSS攻击危害
上面就是XSS攻击的三种基本类型。当然黑客不会像上面场景中弹出一个框框aaa给你,告诉你被攻击。他可以在用户不知情的情况下,盗取用户的cookie,改变网页业务逻辑等等。
攻击者把代码注入进了访问的页面,所以恶意脚本都在网站的上下文环境中执行,这就意味着恶意代码被当做网站提供的正常脚本一样对待:他有权访问页面与网站的关键数据(比如cookie),浏览器会认为他是网站的合法部分,允许他做任何事情。比如拿到用户的cookie信息,然后传送到攻击者自己的服务器,从cookie中提取敏感信息,拿到用户的登录信息,或者攻击者可以通过修改DOM在页面上插入一个假的登陆框,也可以把表单的action属性指向他自己的服务器地址,然后欺骗用户提交自己的敏感信息。
XSS攻击方法
1.绕过XSS-Filter,利用<>标签注入Html/JavaScript代码;
2.利用HTML标签的属性值进行xss攻击。(当然并不是所有的Web浏览器都支持Javascript伪协议,所以此类XSS攻击具有一定的局限性)
3. 空格、回车和Tab。如果XSS Filter仅仅将敏感的输入字符列入黑名单,比如javascript,用户可以利用空格、回车和Tab键来绕过过滤。
4. 利用事件来执行跨站脚本。
5. 利用CSS跨站。例如:Body {backgrund-image: url(“javascript:alert(‘xss’)”)};
6. 扰乱过滤规则。
7.利用字符编码,透过这种技巧,不仅能让XSS代码绕过服务端的过滤,还能更好地隐藏Shellcode;(JS支持unicode、eacapes、十六进制、十进制等编码形式)
8.拆分跨站法,将xss攻击的代码拆分开来,适用于应用程序没有过滤 XSS关键字符(如<、>)却对输入字符长度有限制的情况下;
9.DOM型的XSS主要是由客户端的脚本通过DOM动态地输出数据到页面上,它不依赖于提交数据到服务器,而是从客户端获得DOM中的数据在本地执行。
How to defense XSS
防御原则:永远不要相信用户的输入。
XSS攻击其实就是代码的注入。用户的输入被编译成恶意的程序代码。所以,为了防范这一类代码的注入,需要确保用户输入的安全性。
防御措施
对于XSS攻击,我们可以采用以下四种措施:
1、编码,就是转义用户的输入,把用户的输入解读为数据而不是代码
2、校验,对用户的输入及请求都进行过滤检查,如对特殊字符进行过滤,设置输入域的匹配规则等。
3、Content Security Policy(CSP)
4、HttpOnly Cookie
- 编码
对于验证输入,我们既可以在服务端验证,也可以在客户端验证。
对于持久性和反射型攻击,服务端的验证是必须的,而对于基于DOM的XSS攻击,验证输入在客户端必须执行,因为从服务端来说,所有发出的页面内容是正常的,只是在客户端JS代码执行的过程中才发生可攻击。
当需要将一个字符串输出到Web网页时,同时又不确定这个字符串中是否包括XSS特殊字符,为了确保输出内容的完整性和正确性,可以使用编码(HTMLEncode)进行处理。
- 校验
校验是一种过滤用户输入以至于让代码中恶意部分被移除的行为。校验都是通过一定的经验和规则,对用户的输入进行匹配,过滤,去除掉存在攻击风险的部分。
我们可以通过黑名单的方式和白名单的方式来设置我们的规则,对用户提交的数据进行有效性验证,仅接受符合我们期望格式的内容提交,阻止或者忽略除此外的其他任何数据。
1)黑名单
我们可以把某些危险的标签或者属性纳入黑名单,过滤掉它。
2)白名单
这种方式只允许部分标签和属性,不在这个白名单中的,一律过滤掉它。
- Content Security Policy(CSP)
CSP对你用于浏览页面的浏览器做出了限制,以确保它只能从可信赖来源下载的资源。资源可以是脚本,样式,图片,或者其他被页面引用的文件。
这意味着即使攻击者成功的在你的网站中注入了恶意内容,CSP也能免于它被执行。CSP也是采用白名单的方式来匹配网页的解析和代码的执行。
- HttpOnly Cookie
将重要的cookie标记为http only, 这样的话当浏览器向Web服务器发起请求的时就会带上cookie字段,但是在脚本中却不能访问这个cookie,这样就避免了XSS攻击利用JavaScript的document.cookie获取cookie。
部分参考资料
https://searchsecurity.techtarget.com/definition/cross-site-scripting
https://en.wikipedia.org/wiki/Cross-site_scripting
https://www.veracode.com/security/xss
https://www.netsparker.com/blog/web-security/cross-site-scripting-xss/
https://juejin.im/entry/58a598dc570c35006b5cd6b4
https://www.cnblogs.com/caizhenbo/p/6836390.html
http://julyaan.com/2017/09/06/xss-instance/
总结
本文主要是结合网上众多资料和自己所学知识,探讨了一些对XSS攻击与防御的一些理解。
希望能对大家有所帮助~ 有问题欢迎留言交流,不足之处还请多多指正。