关于XSS漏洞-简介
最早接触安全漏洞问题是在实习的时候,当时处于啥也不清楚的情况,师兄给了我一个应用安全团队扫描出安全问题列表,当时也没多想,就按照上面的说明把问题修复了,后来今年断断续续的出现了几次XSS的线上问题,这种漏洞如果被外部利用,都是很严重的问题,之前读《白帽子讲web安全》能够了解了一些XSS的知识,现在总结一下,好记性不如烂笔头啊。
(一)什么是XSS漏洞?
cross sitescript跨站脚本攻击,为了避免和css重复,就叫XSS了,是客户端脚本安全中的头号大敌。
(二)XSS有哪些类型?
反射型:简单的描述就是把用户输入的数据反射给浏览器,这个数据可能是Html代码或者js代码,反射后让浏览器去执行。
存储型:把用户输入的数据(比如恶意的js代码)存储在服务器端,具有很强的稳定性,危害时间长。
DOM Based XSS:这种不是按照存储在哪里来划分的,可以说是反射型,由于历史原因,归为一类,通过改变DOM结构形成的XSS称之为DOM Based。
(三)XSS的危害有哪些?
1、劫持Cookie,cookie中一般加密保存了用户的登录凭证,浏览器发起的所有请求都会自动带上,如果Cookie被盗取,也就是说用户不用通过密码而直接登录你的账户。
Cookie设置HttpOnly属性,能够起到四两拨千金的作用,另外cookie可以绑定用户客户端信息,例如ip或者umid信息。
2、构建Get和Post请求,如果cookie按照上述进行了设置,则无法直接劫持cookie来使用了,但是XSS可以在javascript中构建get或者post请求,来实现自己的攻击。
例如下面的一段代码:
var img =document.createElement(‘img’);
img.src=”http://blog.cccc.com?m=delete&id=212112”;
document.body.appendChild(img);
只要让用户执行这段脚本,就能发起get请求,攻击者通过XSS诱导用户来执行。
XSS的攻击过程都是在浏览器通过执行javascript脚本自动进行,缺少与用户交互的过程。例如在POST的请求中,如果需要输入验证码,Js代码无法解析验证码,攻击也就无法实现。但是针对验证码这种情况,如果XSS可以通过把验证码的图片发到远端攻击服务器,服务器解析验证码然后把结果返回给js代码,js获取后继续进行攻击,不过就是成本有点高。
3、XSS钓鱼
上面模拟用户的POST请求貌似成本有点高,攻击者可以将XSS和钓鱼结合在一起,例如通过javascript代码模拟出网站的登录框,用户输入用户名和密码后,XSS将这些信息发送到服务器端,用来进行攻击。
4、获取用户系统信息
此外XSS还可以识别用户的浏览器信息、用户安装的软件以及用户真实的IP等信息。
5、XSS Wrom
这是XSS的一种终极利用方式,破坏力和影响力是巨大的,一般来说,用户直接发生交互行为的页面,如果存在存储型XSS,则比较容易发起Wrom攻击。
(四)如何防御XSS呢?
1、给关键的Cookie设置HttpOnly属性
这样能够避免js读取Cookie信息(设置后有助于缓解XSS,但是XSS除了劫持Cookie之外,还可以模拟用户的身份进行操作)。
2、进行输入检查
如果仅仅在客户端通过JS来做输入校验,有可能会被攻击者绕过,WEB开发中的普遍做法是同时在客户端和服务端做校验。这种输入检查的方式也称之为XSS Filter。
3、输出检查
一般说来,除了富文本输出之外,在变量输出到HTML页面时,可以使用编码或者转义的方式来防御XSS攻击。
4、防御DOM BasedXSS
前面提到的集中方法,对于这种类型不太适用,需要特别对待,那如何才能防御呢?
首先是$var输出到<script>是,应该执行一次javasriptEncode,其次在doument.write输出到HTML页面时,如果是输出到事件或者脚本,可以再做一次javaScriptEncode,如果是输出到HTML内容或者属性,则可以做一次HtmlEncode。
上面提到的这些防御方法都属于安全生产的环节,也就是说实在开发同学写代码的时候要特别注意,这种是否做的规范,可以通过工具扫描代码的方式来实现,也就是白盒测试,如果代码没有做输入或者输出检查,则发报告提示开发来进行修改。但是有些场景白盒没法覆盖到,例如输出jsonp类型的接口,对于callback参数的原味输出,白盒有时候就扫不出来,这时候,可以通过黑盒测试工具,模拟入参的各种情况,也就是穷举,来构造,如果发生了XSS请求,则发出报告即可。