前端安全
分类:前端技术

Web 安全之 XSS

2018/05/25 · JavaScript · 1 评论 · XSS

原文出处: 今日头条技术博客   

1.CSRF
2.XSS

基本概念
攻击原理
防御措施

什么是XSS

跨站脚本攻击(Cross Site Scripting),为不和层叠样式表(Cascading Style Sheets, CSS)的缩写混淆,故将跨站脚本攻击缩写为XSS。恶意攻击者往Web页面里插入恶意Script代码,当用户浏览该页之时,嵌入其中Web里面的Script代码会被执行,从而达到恶意攻击用户的目的。

CSRF

  • ##### CSRF基本概念

CSRF通常称为跨站请求伪造,英文名 Cross-site request forgery

  • ##### CSRF攻击原理

用户--------->访问-------------------->网站A
用户<---------下发cookie<-----------网站A
用户--------->访问----------->网站B
用户<---------引诱点击<-----------网站B
用户--------->访问-------------------->网站A
前提:
1.网站中某一借口存在漏洞
2.用户在注册网站时登录过

XSS的攻击场景

  • 反射型

    这类攻击方式主要借助URL来实施。URL的构成分为协议、域名、端口、路径、查询几部分构成。如图所示:

图片 1

  • XSS往往在“查询”部分发现漏洞构造攻击代码实施攻击,所谓“反射”可以理解为hacker并不会直接攻击客户,而是通过URL植入代码通过服务器获取并植入到用户页面完成攻击。攻击流程图如下:

图片 2

  • 存储型

    存储型攻击方式和反射型最大的区别就是不通过URL来传播,而是利用站点本身合法的存储结构,比如评论。任何用户都可以通过站点提供的接口提交评论内容,这些评论内容都被存储到服务器的数据库。当用户访问这些评论的时候,服务器从数据库提取内容插入到页面反馈给用户。如果评论内容本身是具备攻击性内容,用户无一幸免。攻击流程图如下:

图片 3

  • 从上下两个流程图来看,反射型和存储型的攻击方式是本质不同的,前者需要借助各种社交渠道传播具备攻击的URL来实施,后者通过网站本身的存储漏洞,攻击成本低很多,而且伤害力更大。
CSRF防御措施

1.Token验证
2.Referer验证---->页面来源
3.隐藏令牌

区别:

  • XSS向页面注入JS,在JS函数体做他想做的事
  • CSRF利用本身漏洞,帮你自动执行那些借口,依赖于用户登录网站


XSS的工作原理

不管是反射型还是存储型,服务端都会将JavaScript当做文本处理,这些文本在服务端被整合进html文档中,在浏览器解析这些文本的过程也就是XSS被执行的时候。

从攻击到执行分为以下几步:

  1. 构造攻击代码
  2. 服务端提取并写入HTML
  3. 浏览器解析,XSS执行

XSS

http://www.freebuf.com/articles/web/40520.html
http://www.imooc.com/learn/812

  • ##### XSS基本概念

XSS 跨域脚本攻击,英文名 cross-site scripting

构造攻击代码

hacker在发现站点对应的漏洞之后,基本可以确定是使用“反射型”或者“存储型”。对于反射型这个很简单了,执行类似代码:

图片 4

大家知道很多站点都提供搜索服务,这里的item字段就是给服务端提供关键词。如果hacker将关键词修改成可执行的JavaScript语句,如果服务端不加处理直接将类似代码回显到页面,XSS代码就会被执行。

这段代码的含义是告诉浏览器加载一张图片,图片的地址是空,根据加载机制空图片的加载会触发Element的onerror事件,这段代码的onerror事件是将本地cookie传到指定的网站。

很明显,hacker可以拿到“中招”用户的cookie,利用这个身份就可以拿到很多隐私信息和做一些不当的行为了。

对于存储型直接通过读取数据库将内容打到接口上就可以了。

XSS攻击方式

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=![](null)
//写完的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})
})

//此时会成功执行
  1. xss脚本在url中
  2. 服务端要解析url的字段

?xss=![](null)//自动触发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()})
//通过读缓存,读数据库,最后返回,这里的来源不一样,后面的都和反射性一样
})

存储型的攻击脚本是怎么到达服务端的存储系统里的?


服务端提取并写入HTML

我们以 Node.js 应用型框架express.js为例:

服务端代码(express.js)

图片 5

ejs模板

图片 6

这里列举了以反射型为主的服务端代码,通过获取URL的查询res.query.item,最后在模板中输出内容。对于存储型的区别是通过数据库拿到对应内容,模板部分一致。

XSS防范措施

1.编码
2.过滤
3.矫正

  • 不能对所用用户的输入保持原样
  • 在原样显示用户内容时,要过滤
  • 破坏页面结构则通过矫正

编码:对用户输入的数据进行HTML Entity编码

图片 7

Paste_Image.png

过滤:
1.移除用户上传的DOM属性,如onerror等(最好移除所有DOM事件属性)
2.移除用户上传的Style节点,Script节点,Iframe节点等。

矫正:
1.避免直接对HTML Entity解码
2.使用DOM Parse转换,矫正不配对的DOM标签

  • 如果直接解码,那么过滤意义就不大了
  • DOM Parse把整个文本解析成DOM对象
浏览器解析,XSS执行

图片 8

从这个图上来看浏览器解析主要做三件事:

  • 将文档解析成DOM Tree
  • 解析CSS成规则树
  • Javascript解析

在这个过程,XSS的代码从文本变的可执行。

XSS的防范措施

编码

对于反射型的代码,服务端代码要对查询进行编码,主要目的就是将查询文本化,避免在浏览器解析阶段转换成DOM和CSS规则及JavaScript解析。

常见的HTML实体编码如下:

图片 9

除了编码和解码,还需要做额外的共奏来解决富文本内容的XSS攻击。

我们知道很多场景是允许用户输入富文本,而且也需要将富文本还原。这个时候就是hacker容易利用的点进行XSS攻击。

DOM Parse和过滤

从XSS工作的原理可知,在服务端进行编码,在模板解码这个过程对于富文本的内容来说,完全可以被浏览器解析到并执行,进而给了XSS执行的可乘之机。

为了杜绝悲剧发生,我们需要在浏览器解析之后进行解码,得到的文本进行DOM parse拿到DOM Tree,对所有的不安全因素进行过滤,最后将内容交给浏览器,达到避免XSS感染的效果。

具体原理如下:

图片 10

  • 解码

图片 11

  • DOM Parse和过滤

图片 12

在此展示了部分代码,其中DOM Parse可以采用第三方的Js库来完成。

XSS的危害

相信大家都对XSS了有一定的了解,下面列举几个XSS影响比较大的事件供参考,做到警钟长鸣。

  • 微博遭受攻击案例

    2011年6月28日晚,新浪微博遭遇到XSS蠕虫攻击侵袭,在不到一个小时的时间,超过3万微博用户受到该XSS蠕虫的攻击。此事件给严重依赖社交网络的网友们敲响了警钟。在此之前,国内多家著名的SNS网站和大型博客网站都曾遭遇过类似的攻击事件,只不过没有形成如此大规模传播。虽然此次XSS蠕虫攻击事 件中,恶意黑客攻击者并没有在恶意脚本中植入挂马代码或其他窃取用户账号密码信息的脚本,但是这至少说明,病毒木马等黑色产业已经将眼光投放到这个尚存漏洞的领域。

  • 猫扑遭受攻击案例

    曾经在猫扑大杂烩中存在这样一个XSS漏洞,在用户发表回复的时候,程序对用户发表的内容做了严格的过滤,但是我不知道为什么,当用户编辑回复内容再次发表的时候,他却采用了另外一种不同的过滤方式,而这种过滤方式显然是不严密的,因此导致了XSS漏洞的出现。试想一下,像猫扑这样的大型社区,如果在一篇热帖中,利用XSS漏洞来使所有的浏览这篇帖子的用户都在不知不觉之中访问到了另外一个站点,如果这个站点同样是大型站点还好,但如果是中小型站点那就悲剧了,这将会引来多大的流量啊!更可怕的是,这些流量全部都是真实有效的!

如果本文有描述不准确或错误,欢迎大家指正……,不胜感激。

1 赞 收藏 1 评论

图片 13

本文由pc28.am发布于前端技术,转载请注明出处:前端安全

上一篇:去何处跟随何人,前端手艺进步回看 下一篇:没有了
猜你喜欢
热门排行
精彩图文
  • 前端安全
    前端安全
    Web 安全之 XSS 2018/05/25 · JavaScript· 1 评论 ·XSS 原文出处:今日头条技术博客    1.CSRF 2.XSS 基本概念 攻击原理 防御措施 什么是XSS 跨站脚本攻击(Cross Site
  • 说说Float那个被埋没的志向,重新认识Box
    说说Float那个被埋没的志向,重新认识Box
    什么是BFC 2016/01/09 · CSS · 2评论 ·BFC 原文出处:大搜车前端团队博客    这是我10个月前写的一篇关于BFC的文章,因为接下来要写一篇关于FFC的文章了,然
  • 移动端布局解决方案,一篇真正教会你开发移动
    移动端布局解决方案,一篇真正教会你开发移动
    后生可畏篇真正教会你付出活动端页面的篇章(后生可畏) 2017/12/07 · 基础手艺 ·3 评论 ·移动端 原稿出处:HcySunYang)    三个运动端的时期 蓬蓬勃勃、像素
  • 行代码完毕一个总结的区块链,写一个区块链
    行代码完毕一个总结的区块链,写一个区块链
    用 JavaScript 写二个区块链 2018/04/09 · CSS ·区块链 原稿出处: XavierDecuyper   译文出处:百度外送食物前端/JeLewine    大致种种人都据悉过像比特币和以太
  • 前面三个跨域知识总结,详细明白JS跨域难题
    前面三个跨域知识总结,详细明白JS跨域难题
    详解JS跨域问题 2016/10/31 · JavaScript· Javascript,跨域 原文出处: trigkit4(@trigkit4)    前端跨域知识总结 2016/11/04 · JavaScript· 2 评论 ·Javascript,跨域 本文作者