一、概述
XSS(Cross-site scripting):跨站脚本攻击是代码注入攻击的一种,将恶意的javascript代码注入到前端页面中,用户访问后会执行注入的代码,造成cookie,账号密码劫持,钓鱼攻击,水坑攻击,csrf,获取用户隐私信息甚至结合cve造成命令执行.
二、xss分类
1.Reflected XSS
反射型xss,非持续性的xss,用户点击后才能触发,常见于网站的搜索栏,用户的输入会显示在response中响应,Reflected XSS又可以分为post型和get型,get型可以直接访问触发,而post型如果没有csrf防护的话可以通过csrf+post型xss形成xsrf来触发.
2.Dom Based XSS
DOM(Document object model)型xss:不需要与后台进行交互的xss,在前端如果调用innerHTML,或者eval函数用url参数进行对页面的控制就很可能存在dom型xss
3.Stored XSS
储存型XSS,服务器可能将用户提交的数据存入数据库显示到前端界面中,如果前端界面没有进行过滤直接输出的话可能导致储存型XSS.如果其他用户也能随意访问这个页面,那么只要访问这个页面的用户都会被攻击
4.mxss
突变型xss,这种xss最早在2007年提出,主要利用浏览器渲染的一些缺陷,看似一些无害的html标签,经过浏览器解析后可能变成xss代码.
如:<img src="test.jpg" alt ="``onload=xss()" />被解析为
<IMG alt =``onload=xss() src ="test.jpg">
三、浏览器解析机制
1.编码机制:
1.HTML编码
如:'<':编码为:
1.<:实体名称不是所有符号都有实体名称
2. < 实体编号,就是ascii码的10进制,还可以$#000060来实现绕过一些waf
2.JS编码
在js中常见的传输中文或者非ascii码字符就会使用unicode编码,同样这种编码可以用来绕过一些waf
如 '<':编码为: '\u003c'(unicode编码),'a'->\x61
3.URL编码
url编码的主要作用是对用户的输入编码后无歧义的发送到后端,编码机制为:%+ascii的16进制,如#->%23
这3种编码是主要的绕waf的编码姿势,接下来将介绍一些浏览器解析机制.
2.浏览器解析机制
一般来说浏览器收到将会进行HTML解析,URL解析Javascript解析,CSS解析。 这一过程完成HTML解码并创建DOM树,接下来JavaScript解析器会介入对内联脚本进行解析,这一过程完成成JS的解码工作,如果浏览器遇到需要URL的上下文环境,这时URL解析器也会介入完成URL的解码工作, URL解析器的解码顺序会根据URL所在位置不同,可能在JavaScript解析器之前或之后解析。
浏览器的解析规则:浏览器收到HTML内容后,会从头开始解析。当遇到JS代码时,会使用JS解析器解析。当遇到URL时,会使用URL解析器解析。遇到CSS则用CSS解析器解析。尤其当遇到复杂代码时,可能该段代码会经过多个解析器解析。
如果想深入了解可以参考:https://www.attacker-domain.com/2013/04/deep-dive-into-browser-parsing-and-xss.html.这里主要介绍一下在xss中的应用的例子:
1.<a href="javascript:alert(1)">test</a>
1.对href进行HTML解码:
1.构建DOM树.
2.HTML解析.
2.对herf进行url解码:
1.正常情况为 http://xxx.com url解码就结束了,而这里是javascript:协议
2.URL解码不会对协议进行解码,只会对类似href,location进行解码,对href中的javascript:不会解码
3.对链接类的属性(href)才会解码
3.对href进行JS解码
1.对引号进行编码不会闭合 如alert('1u0027)不会执行
正确的用法:alert ->\u0061\u006c\u0065\u0072\u0074
2.触发JS解码的有:
< script>' , javascript:xxx , < script sr=... >,onload onerror eval ...
2.全部url编码:<a href="%6A%61%76%61%73%63%72%69%70%74:%61%6C%65%72%74%28%31%29">test</a>
不会执行,因为url解码不会把协议进行解码也就是javascrtipt:
3.HTML+url:<a href="javascript:%61%6c%65%72%74%28%31%29">test3</a>
1.javascrtipt: HTML编码为: ·javascrtipt:
2.alert(1) url编码为: %61%6c%65%72%74%28%31%29
所以具体过程:
1.HTML解析就解析出了javascrtipt:
2.URL解码出来alert(1)
3.js成功解析并执行
四、与XSS相关的HTTP header
1.CSP(Content-Security-Policy):
实质就是白名单制度,开发者明确告诉客户端,哪些外部资源可以加载和执行,等同于提供白名单。它的实现和执行全部由浏览器完成,开发者只需提供配置。接下来举几个例子:
1.Content-Security-Policy:script-src 'self'; object-src 'none'; style-src cdn.example.org third-party.org; child-src https;
意思就是:1.脚本:只信任当前域名 <object>标签:不信任任何URL,即不加载任何资源
2.样式表:只信任cdn.example.org和third-party.org
3.框架(frame):必须使用HTTPS协议加载
4.其他资源:没有限制,启用后不符合规则的就不能访问
2.Content-Security-Policy: default-src ':所有的外部资源,都只能从当前域名加载。
3.nonce:服务器可能会随机生成一个token,来标示那些脚本可以执行,类似的还有hash作为token.
如果返回的是这样的响应头的话那么页面中必须有这个token才能执行
2.X-XSS-Protection
作用:防范XSS攻击。 PS:这个是旧属性,基本上可以被CSP取代,但是仍可以为还没有支持CSP的浏览器提供一层保护。主流浏 览器默认都开启了XSS保护。 使用方式如下:
X-XSS-Protection : 1; mode=block; report=/_/http-sec-report
支持配置:
• 0:禁止XSS保护
• 1:启用XSS保护:启用XSS保护,浏览器检测到XSS攻击会自动过滤非安全部分内容
• 1;mode=block:启用XSS保护,并在检测到XSS攻击的时候停止渲染页面
• 1;report=:启用XSS保护,检测到XSS攻击的时候,浏览器会自动过滤非安全内容,同时上报到指定URI。
3.COOKIE
cookie是在web应用中最常见的一个http header,在xss攻击中也是攻击者最常见的利用点之一.
属性:
第一次访问一个浏览器时会返回一个Set-Cookie字段如:
Set-Cookie: ID=3337-22e0698d85b75a9; expires=Thu, 15-Oct-2020 07:16:44 GMT; domain:yhis.me;path=/; Secure
expires(耗尽):表示到Cookie什么时候过期,过期后浏览器清空.
domain:domain+path=URL,限制哪些URL能够访问这个cookie.说明:
在RFC 2109中,前面没点就是子域名不能使用该Cookie,而在RFC 6265中没点也能使用该Cookie,现在的 浏览器也都遵循RFC 6265,跨域xhr请xhr的请求是不会带上cookie的
secure:包含secure选项的cookie必须要要经过HTTPS才能发给服务器
HttpOnly:默认不会带HttpOnly,带了的话 js将不能对该条Cookie进行操作,js是不能设置HttpOnly的,只有服务端能设置.
五、总结
本文对XSS的一些基础知识进行了总结,根据笔者在实际的网站漏洞挖掘,和OWASP TOP10来看,XSS问题是普遍存在的一个网站安全问题.对于实际业务的影响也可能很大,对于xss防守这一块应该要严格控制输出,比如使用HTML编码进行输出,对双引号等特殊符号进行转义,单纯的使用waf很难防守这样的攻击,因为通过各种编码的变形,事件的变形,一般的WAF是很难防住的。后期将介绍一些安全学术界中对于XSS的一些前沿论文.