2018/05/25 · JavaScript · 1 评论 · XSS
原文出处: 今日头条技术博客
1.CSRF
2.XSS基本概念
攻击原理
防御措施
跨站脚本攻击(Cross Site Scripting),为不和层叠样式表(Cascading Style Sheets, CSS)的缩写混淆,故将跨站脚本攻击缩写为XSS。恶意攻击者往Web页面里插入恶意Script代码,当用户浏览该页之时,嵌入其中Web里面的Script代码会被执行,从而达到恶意攻击用户的目的。
CSRF通常称为跨站请求伪造,英文名 Cross-site request forgery
用户--------->访问-------------------->网站A
用户<---------下发cookie<-----------网站A
用户--------->访问----------->网站B
用户<---------引诱点击<-----------网站B
用户--------->访问-------------------->网站A
前提:
1.网站中某一借口存在漏洞
2.用户在注册网站时登录过
反射型
这类攻击方式主要借助URL来实施。URL的构成分为协议、域名、端口、路径、查询几部分构成。如图所示:
存储型
存储型攻击方式和反射型最大的区别就是不通过URL来传播,而是利用站点本身合法的存储结构,比如评论。任何用户都可以通过站点提供的接口提交评论内容,这些评论内容都被存储到服务器的数据库。当用户访问这些评论的时候,服务器从数据库提取内容插入到页面反馈给用户。如果评论内容本身是具备攻击性内容,用户无一幸免。攻击流程图如下:
1.Token验证
2.Referer验证---->页面来源
3.隐藏令牌
区别:
不管是反射型还是存储型,服务端都会将JavaScript当做文本处理,这些文本在服务端被整合进html文档中,在浏览器解析这些文本的过程也就是XSS被执行的时候。
从攻击到执行分为以下几步:
http://www.freebuf.com/articles/web/40520.html
http://www.imooc.com/learn/812
XSS 跨域脚本攻击,英文名 cross-site scripting
hacker在发现站点对应的漏洞之后,基本可以确定是使用“反射型”或者“存储型”。对于反射型这个很简单了,执行类似代码:
大家知道很多站点都提供搜索服务,这里的item字段就是给服务端提供关键词。如果hacker将关键词修改成可执行的JavaScript语句,如果服务端不加处理直接将类似代码回显到页面,XSS代码就会被执行。
这段代码的含义是告诉浏览器加载一张图片,图片的地址是空,根据加载机制空图片的加载会触发Element的onerror事件,这段代码的onerror事件是将本地cookie传到指定的网站。
很明显,hacker可以拿到“中招”用户的cookie,利用这个身份就可以拿到很多隐私信息和做一些不当的行为了。
对于存储型直接通过读取数据库将内容打到接口上就可以了。
1.反射型
2.存储型
攻击手段:
1.盗用cookie,获取一些敏感信息。
2.破坏正常的页面结构,出入一些恶心内容。
3.利用植入flash(flash现在不常用,了解一下就好)。
4.实现分布式拒绝服务攻击(D-DOS攻击)(最难以防御)。
5.server-limit-dos:当HttpRequestHeader过长的时候,WebServer会产生400或者4开头的错误,如果这些超长的数据保存到cookie中,能让用户每次访问的时候造成http超长,会导致一些用户无法访问服务器。
*DOS:最基本的DOS是利用合理的客户端请求来占用过多的服务器资源,从而使合法用户无法得到服务器的响应。
*D-DOS:D-DOS攻击手段就是在传统的DOS之上产生的一类攻击方式。
反射性:发出请求时,XSS代码出现在URL中,作为输入提交到服务器端,服务器解析后响应,XSS代码随响应内容一起传回浏览器,最后浏览器解析XSS代码,这个过程像一次反射,故成反射性XSS。
1.明文的
2.有些参数是通过search传入的,服务器要解析search,而这个search的value部分就是XSS代码,从而导致服务端把攻击脚本做了解析。
3.服务端解析了XSS代码,然后下发给浏览器,下发的通常都是javascript,浏览器在解析DOM树的时候遇到这段代码会一并解析。
示例:
//服务端(node):
router.get('/',function(req,res,next){
res.render('index',{title:'Express',xss:req.query.xss})
})
//视图层
<div>
<%- xss %>
//=和-的区别:要不要对html进行转义,如果允许输出html这里不需要转义,就用-
</div>
//url
localhost:3000/?xss=这里可以写xss攻击的内容
//比如
localhost:3000/?xss=
//写完的img会加入到页面中,因为img的src为null,应该自动执行onerror,
//浏览器会自动帮你拦截,如果把浏览器的拦截关掉的话,会发生什么
//在服务端关闭拦截:
router.get('/',function(req,res,next){
res.set('X-XSS-Protection',0);//关掉浏览器拦截xss
res.render('index',{title:'Express',xss:req.query.xss})
})
//此时会成功执行
?xss=
//自动触发img src为null 上面有个onerror属性
?xss=<p onclick="alert('1')">点我</p>
//引诱触发
?xss=<iframe src="www.baidu.com"></iframe>
//页面中会嵌入一个页面,能实现各种广告的植入
存储型:存储型XSS和反射性XSS的差别在于,提交的代码会存储在服务端(数据库,内存,文件系统等),下次请求目标页面时不用再提交xss代码。(反射性是存储在url中)
//服务端(node):
router.get('/',function(req,res,next){
res.render('index',{title:'Express',xss:sql()})
//通过读缓存,读数据库,最后返回,这里的来源不一样,后面的都和反射性一样
})
存储型的攻击脚本是怎么到达服务端的存储系统里的?
我们以 Node.js 应用型框架express.js为例:
服务端代码(express.js)
ejs模板
这里列举了以反射型为主的服务端代码,通过获取URL的查询res.query.item
,最后在模板中输出内容。对于存储型的区别是通过数据库拿到对应内容,模板部分一致。
1.编码
2.过滤
3.矫正
编码:对用户输入的数据进行HTML Entity编码
Paste_Image.png
过滤:
1.移除用户上传的DOM属性,如onerror等(最好移除所有DOM事件属性)
2.移除用户上传的Style节点,Script节点,Iframe节点等。
矫正:
1.避免直接对HTML Entity解码
2.使用DOM Parse转换,矫正不配对的DOM标签
从这个图上来看浏览器解析主要做三件事:
在这个过程,XSS的代码从文本变的可执行。
对于反射型的代码,服务端代码要对查询进行编码,主要目的就是将查询文本化,避免在浏览器解析阶段转换成DOM和CSS规则及JavaScript解析。
常见的HTML实体编码如下:
除了编码和解码,还需要做额外的共奏来解决富文本内容的XSS攻击。
我们知道很多场景是允许用户输入富文本,而且也需要将富文本还原。这个时候就是hacker容易利用的点进行XSS攻击。
从XSS工作的原理可知,在服务端进行编码,在模板解码这个过程对于富文本的内容来说,完全可以被浏览器解析到并执行,进而给了XSS执行的可乘之机。
为了杜绝悲剧发生,我们需要在浏览器解析之后进行解码,得到的文本进行DOM parse拿到DOM Tree,对所有的不安全因素进行过滤,最后将内容交给浏览器,达到避免XSS感染的效果。
具体原理如下:
在此展示了部分代码,其中DOM Parse可以采用第三方的Js库来完成。
相信大家都对XSS了有一定的了解,下面列举几个XSS影响比较大的事件供参考,做到警钟长鸣。
微博遭受攻击案例
2011年6月28日晚,新浪微博遭遇到XSS蠕虫攻击侵袭,在不到一个小时的时间,超过3万微博用户受到该XSS蠕虫的攻击。此事件给严重依赖社交网络的网友们敲响了警钟。在此之前,国内多家著名的SNS网站和大型博客网站都曾遭遇过类似的攻击事件,只不过没有形成如此大规模传播。虽然此次XSS蠕虫攻击事 件中,恶意黑客攻击者并没有在恶意脚本中植入挂马代码或其他窃取用户账号密码信息的脚本,但是这至少说明,病毒木马等黑色产业已经将眼光投放到这个尚存漏洞的领域。
猫扑遭受攻击案例
曾经在猫扑大杂烩中存在这样一个XSS漏洞,在用户发表回复的时候,程序对用户发表的内容做了严格的过滤,但是我不知道为什么,当用户编辑回复内容再次发表的时候,他却采用了另外一种不同的过滤方式,而这种过滤方式显然是不严密的,因此导致了XSS漏洞的出现。试想一下,像猫扑这样的大型社区,如果在一篇热帖中,利用XSS漏洞来使所有的浏览这篇帖子的用户都在不知不觉之中访问到了另外一个站点,如果这个站点同样是大型站点还好,但如果是中小型站点那就悲剧了,这将会引来多大的流量啊!更可怕的是,这些流量全部都是真实有效的!
如果本文有描述不准确或错误,欢迎大家指正……,不胜感激。
1 赞 收藏 1 评论
本文由pc28.am发布于前端技术,转载请注明出处:前端安全