前言
记得有个人说过:“一家互联网公司没有信息安全团队,就像在“裸奔”!”。虽然国内大多数公司都没有信息安全团队,甚至做的东西完全没研究过安全策略,但是丝毫不妨碍我们认为信息安全是个很重要的东西。信息安全是个非常宽广的领域,作为一个前端,我们的主要攻防方向就是在我们的网页了。所以我们接下来主要聊一下网页的安全,而网页最常见的攻击分类就是XSS和CSRF了。
一、危险来自哪里
其实危险无处不在,一张网页下来,主要经过的几个部分全都有可能带来危险:浏览器、HTTP、HTML、JavaScript、css。
- 浏览器插件,病毒
- HTTP refer暴露地址、数据被监听
- HTML注入
- JavaScript 注入,引入第三方文件
- css 样式被换成接口请求 ......
网页的危险来源远远不止以上那些,事实上,攻击的手段是层出不穷的,新技术的到来也会带来攻击的突破口。
二、网页攻击的主角XSS
XSS即跨站脚本攻击,发生在目标网站中目标用户的浏览器层面上,当用户浏览器熏染整个HTML文档的过程中出现了不被预期的脚本指令并执行时,XSS就会发生。
这句话的关键点有以下三个:
- 目标网站的目标用户:这里强调了场景。
- 浏览器:因为这类攻击是由浏览器来解析执行的。浏览器当然不 会看到什么就解析什么,它们会严格执行共同约定的同源策略,不符合约定的就不会执行。
- 不被预期的:那么就很可能是攻击者在输入时提交了可控的脚本 内容,然后在输出后被浏览器解析执行。 这个过程其实是包括XSS漏洞挖掘与漏洞利用的,这两个同等重要。
跨站脚本的重点不在“跨站”上,而应该在“脚本”上。绝大多数的攻击都是有输入一段编码前或编码后的代码而导致的。例如:
<script>
eval(location.hash.substr(1));
</script>
假如攻击者在访问这个网址的时候输入是以下这个这样的,那么就成功实施了xss,网页将会被弹窗
www.test.com/index.html#alert(1)
事实上攻击者当然不会这么傻傻地弹个窗就完事了,他可以做的东西更多,比如植入一段代码,一个远程的JavaScript脚本,发出一次获取个人信息的请求等等等等。一旦口子打开了,这个网页基本上就跟是他自己家的一样了。
三、xss攻击的类型
-
反射型XSS
XSS代码出现在URL中,作为输入提交到服务端,服务端解析后响应,在响应内容中出现这段XSS代码,最后浏览器解析执行。这个过程就像一次反射,故称为反射型XSS。 -
存储型XSS
存储型XSS和反射型XSS的差别仅在于:提交的XSS代码会存储在 服务端(不管是数据库、内存还是文件系统等),下次请求目标页面时不用再提交XSS代码。最典型的例子是留言板XSS,用户提交一条包含XSS代码的留言存储到数据库,目标用户查看留言板时,那些留言的内容会从数据库查询出来并显示,浏览器发现有XSS代码,就当做正常的HTML与JS解析执行,于是就触发了XSS攻击。
存储型XSS的攻击是最隐蔽的。
-
DOM XSS
它和反射型XSS、存储型XSS的差别在于,DOM XSS的XSS代码并不需要服务器解析响应的直接参与,触发XSS靠的就是浏览器端的DOM解析,可以认为完全是客户端的事情。在现在前端后端分离的年代,dom xss是最为常见的。
四、xss攻击的输入
xss的切入口主要是那些能够输入的地方
- URL 一个最普通的URL如下:
http://www.foo.com/path/f.php?id=1&type=cool#new
对应的关系就是<scheme>//<netloc>/<path>?<query>#<fragment>
对这个URL来说,攻击者可控的输入点有<path>、<query>、 <fragment>三个部分。
- 表单 表单不用多说了,本身就是可以输入的。
五、xss的输出(可攻击的地方)
在有输入的地方,那么这个输入一定是需要输出的,不然填来干什么呢。那么根据输出地方的不同,就有非常多的攻击方法。
例如这个URL
http://www.foo.com/xss.php?id=1
那么输出的地方就有可能是:
-
HTML标签之间,比如:出现在
<div id="body">[输出]</div>位置。
HTML之间的xss主要是通过输入将上一个标签闭合,然后引入攻击的第三方脚本id=1<script>alert(1)</script>当然,有几类标签是不具备执行脚本的能力的:title、textarea、xmp、iframe、noscript、noframes、plaintext。
-
HTML标签之内,比如:出现在
<input type="text" value="[输出]" />位置。
html标签之内主要是体现在属性上,一种做法是闭合属性然后添加事件监听,另一种做法是闭合属性并闭合标签,然后开新的标签在<input type="text" value="[输出]" /> 提交payload:" onmouseover=alert(1) x=",这种是闭合属性,然 后使用on事件来触发脚本。 提交payload:"><script>alert(1)</script>,这种是闭合属性后又闭 合标签,然后直接执行脚本。 -
成为JavaScript代码的值,比如:
<script>a="[输出]";...</script>位置。
在这个场景中,假如我们的输入是</script><script>alert(1)//这个是
<script>标签的闭合机制,它会优先寻找最近的一个 闭合,无论这个出现在哪里,都会导致这样的payload可以成功。 -
成为CSS代码的值,比如:
<style>body{font-size:[输出]px;...} </style>位置。
css 的做法与其他的类似,一种做法是闭合标签,另一种做法是将内容注入到image 的URL里面,还有一种针对IE的,在style中执行脚本已经是IE浏览器独有的特性。比如注入:1;xss:expression(if(!window.x){alert(1);window.x=1;})
综上,我相信大家已经对xss攻击有了大概的认识。总的来说,xss一定会有个输入的地方,这个地方你是开发网站的时候留下的,比如你需要在URL里面传递参数,或者你需要在表单里面填写内容,那么这就有了输入的地方。如果你把输入的内容没有正确使用的话,那么就有可能会构成危险,给了人家xss攻击的缺口。
六、xss攻击的危害
基本上来说,xss攻击成功之后的利用空间是非常大的,因为她不但是可以破坏你的结构,或者你的数据,他甚至还可以重新做一个假的页面展示出来,这都是可以的。毕竟当人家植入的是一个第三方的JavaScript脚本后,这个脚本可以做的东西就非常多了。下面简单列举一些,仅用于发散思维:
- 获取用户表单数据
- 获取cookies
- 构造假的请求
- 用户用户账号密码
- 修改用户数据
- 制造蠕虫,类似于用网站分享功能,将病毒发散出去
- 界面劫持,做一个隐形的假界面让你操作
- 内网渗透,获取内网的IP地址
七、xss攻击的防御
关于xss的防御策略,大家可以参考入OWASP的XSS防御方案。假定一切输入都是有害的,对策一般如下:
-
输入校验
长度限制、值类型是否正确、是否包含特殊字符(如 <>'"等)。其实校验是对数据无害的,满足就放行,不满足就阻 止。这个过程一般不建议进行任何过滤操作,这样能保证数据的原生态。 -
输出编码
根据输出的位置进行相应的编码,如HTML编码、 JavaScript编码、URL编码。原则就是:该数据不要超出自己所在的区域,也不要被当做指令执行。对输出的内容进行转换,比如,在<div></div>之间,HTML编码转换规则如下:& -->& < -->< > -->> " -->" ' -->' / -->/ 包含斜杆是因为它是HTML结束标签里的符号 -
使用csp策略
CSP策略可以使得页面的html/css/javascript分离,使得html不再具备执行JavaScript的能力,一切脚本都放在js文件中,并且文件来源设置白名单,这就避免了许多xss攻击了。W3C CSP 策略
结语
以上就是本篇关于xss的全部内容了。xss其实有着非常多的攻击方式,除了上面说到的之外还有利用html 字节码的,利用字符集缺陷的,还有flash xss的,内容十分多这里就不展开了。web安全还有一块是关于CSRF,后面的文章会说这个。