1、跨站脚本漏洞
由于程序员在编写程序时对用户输入的可控数据没有做充分的过滤或转义,直接把用展现在页面中。当用户提交构造的脚本或html标签时,便会执行,这就是跨站脚本攻击。
-
存储型跨站
用户可控数据内容长期存储于页面中,当用户输入脚本或HTML标签时,输入的数据长期展示在页面中,也就形成了储型跨站脚本攻击。
-
反射型跨站
在用户可控数据中,未长久保存于数据库中的数据,例如URL提交的参数,开发人员未对参数做过滤或转码,导致前端直接展示相关数据,这样便形成了反射型跨站脚本漏洞。
-
Dom型跨站
当使用文档对象模型来创建文档的时候,对用户可控数据没有做正确的编码输出,便会出现DOM型跨站脚本漏洞
恶意用户可以利用跨站脚本可以做到:
-
盗取用户cookie,伪造用户身份登录。
-
控制用户浏览器。
-
结合浏览器及其插件漏洞,下载病毒木马到浏览者的计算机上执行。
-
修改页面内容,产生钓鱼攻击效果。
-
蠕虫攻击。
在三种跨站脚本漏洞中影响相对最大的是存储型跨站脚本漏洞。
HTML跨站脚本漏洞
当用户可控数据未经转义或过滤输出到HTML中时,用户提交恶意数据后形成HTML跨站脚本攻击,HTML跨站分为反射型和存储型两种,反射型跨站需要被动诱骗点击,而存储型只需要打开页面即可触发危害较大,常见的出现此类问题的主要有留言板,论坛发帖回帖,博客系统,评论系统
解决方案:
在HTML中展示用户可控数据,应该进行htmlescape转义
转义符号:
& -->&
< --><
> -->>
"-->"
JavaScript跨站脚本漏洞
当用户可控数据未经转义或过滤输出到HTML中时,用户提交恶意数据后形成HTML跨站脚本攻击,JavaScript跨站与HTML跨站很多人会搞混,两者的区别在于HTML跨站插入恶意脚本必须带有HTML标签或者带有HTML伪协议标签,过滤起来要比JavaScript跨站简单,JavaScript跨站只需要插入鼠标事件即可触发此类漏洞。
JavaScript跨站也分为存储型和反射型,造成的影响也不同,反射型跨站需要被动诱 骗点击,而存储型只需要打开页面即可触发危害较大
解决方案:
在JavaScript中展示用户可控数据,需要对用户可控数据做JavaScript escape转义。
转义字符:
/ --> \/
| --> \|
"--> \"
\ --> \\
JSON跨站脚本漏洞
Json回传数据自定义函数名时,函数名可以通过UTF-7编码或其他编码造成跨站脚本攻击
Json跨站与普通跨站区域别于格式,json格式的匹配利用普通跨站代码很难实现,如 果http传输设定为json必须通过UTF-7传输才能触发跨站漏洞所以此类漏洞利用较难。
解决方案:
-
Java代码:
response.setContentType("appliaction/json");
按照以上设置,http返回头为appliaction/json
-
对callback:函数名做正则过滤
String.replaceAll("[A\w\_","");对函数名做严格过滤,只允许数字、大小写字母、下划线 以上方法可以彻底防御jsoncallback跨站脚本攻击
注:特殊情况下的json可在正则中放宽相关字符,但是对于以下字符是严格禁止使用 '":;=|V&%#{}[]?#$@!() + -.
URL跨站脚本漏洞
当系统把用户可控数据放入URL中,并且把URL直接输出到前端HTML页面或页面 JavaScript时,用户可控数据便可以构造攻击脚本,这种攻击我们叫做URL跨站脚本攻击。
URL跨站和HTML、JavaScript跨站有很多相似的地方,因为最终用户可控URL还是会输出到HTML和JavaScript中,但是URL跨站和HTML、JavaScript跨站的解决方法是不同的。
解决方案:
URL跨站脚本攻击不能过滤用户输入数据因为过滤用户输入数据可能导致URL无法访问,必须转义用户可控URL,主要遵循以下转义方式
< =%3C > =%3E / = %2F ? = %3F @ =%40'=%27 "=%22 \ = %5C
CSS样式跨站脚本漏洞
在用户与服务器交互访问的情况下,当页面样式CSS中展示用户可控数据时,攻击者会在所提交的CSS中插入脚本,导致浏览此页面的用户浏览器会执行插入的JavaScript脚 本。CSS跨站出现场景一般多在博客系统、文章发布系统、公告系统、留言系统中出现, CSS多现于存储型跨站,危害较大。
解决方案:
同样是要对用户数可控输入中style内容做CSS escape转义
富文本跨站脚本漏洞
web应用程序在一些场合需要允许一些Html标签,和一些标签里的一些属性,如一些日志发表的地方,书写文章的地方,由于开发者对安全认识的局限或者在自己进行的安全过滤时考虑不周,都容易带来跨站脚本攻击,在一些web2.0站点甚至引发Xss Worm。常 规的一些检测措施包括黑名单,白名单等等,但是都因为过滤得并不全面,很容易被绕过。其实有另外一种过滤相对严格的方法,就是基于Html语法分析的filter, 在满足应用的同时可以最大限度保证程序的安全,一些过滤比较严谨的如YahooMail,Gmail等等就是基于该原理进行的过滤。
解决方案:
-
白名单模式过滤相关恶意跨站脚本
-
黑名单模式过滤相关恶意跨站脚本
2、URL跳转漏洞
由于应用越来越多的需要和其他的第三方应用交互,以及在自身应用内部根据不同的逻辑将用户引向到不同的页面,所以URL跳转便出现在我们的应用中,当对所跳转的连接没 有做验证的情况下可能跳到任何_个网站,导致了安全问题的产生,这种问题就是URL跳转漏洞
解决方案:
-
对跳转地址进行检测,当跳转地址非本域地址,强制跳转到主站
-
在控制页面转向的地方校验传入的URL是否为可信域名
-
对传入跳〖转URL中字符‘@'进行过滤
3、JSON挟持漏洞
JSON(JavaScriptObjectNotation)是一种轻量级的数据交换格式,JSON传输的数据在两个不同的域,譬如对于大的互联网公司,代表了A应用的A域名想获取代表B应用的B域名的数据时,由于在javascript里无法跨域获取数据,所以一般采取script标签的方式获取数据,传入一些callback来获取最终的数据。这样导致非法网站也会调用相关接 口来实现数据的读取,导致了json传输数据的挟持
解决方案:
-
验证referer来源,当非白名单域名,返回空信息
-
改变JSON传输格式,彻底杜绝此类漏洞(这种解决方案改动较大,对业务影响较大, 但是非常彻底);
4、XSIO攻击
XSIO产生的原因是因为没有限制图片的position属性为absolute绝对定位图片的位置,这就导致了可以把张图插入到整个页面的任意位置,包括网站的banner,包括一个link、 一个button,覆盖页面的连接,甚至覆盖整体页面,很显然这样的漏洞对安全造成了极大的风险,例如网络钓鱼,非法广告,点击挟持等被诸多攻击方法。
解决方案:
-
如果对效果要求不高,建议过滤图片标签中position属性absolute
-
如果对效果要求较高,不允许position属性设置为absolute
5、CSRF
CSRF的全称是Cross-site request forgery,即跨站请求伪造,我们可以简单的理解这种漏洞为,攻击者利用被攻击者的身份发起了某些被攻击者原本不知情的网络请求。包括以 被攻击者的身份发布一条微博,以被攻击者的身份发布一条留言,以被攻击者的身份关注 某个用户的微博等。著名的微博蠕虫就是利用这种漏洞,造成了较大的影响
解决方案:
方法一(长久有效,彻底防御)
在与用户交互时,设置一个csrf的随机token,种植在用户的cookie中。当用户提交表单时,生成隐藏域,值为cookie中随机token, 用户提交表单后验证两处token值,来判断是否为用户提交
方法二(临时防御,可以绕过)
验证用户提交数据的refere信息,当为提交页时,说明为用户提交,当为其他页面时,说明为csrf攻击。