xss漏洞原因以及如何应对
Posted vieber
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了xss漏洞原因以及如何应对相关的知识,希望对你有一定的参考价值。
场景一:获取URL参数含有脚本执行
比如我们需要获取URL中某个参数,然后输出到页面当中
比如链接是http://xxx?search="><script>alert('xss')</script>
这种,我们解析search参数拼接html的之后直接用了这个参数,这个时候浏览器不知道是恶意代码,直接就执行了,
<div>
xxx: "><script>alert('xss')</script>
</div>
这样这个脚本就会在页面上执行,显示xss
如果是input属性,也会弹
<input type="text" value=""><script>alert('xss');</script>">
这是因为浏览器把参数当作脚本执行了,我么只需要告诉浏览器这个是文本就行了。
我们使用escapeHTML进行转义就可以了。这个方法原生没有,需要我们自己实现,转成html实体字符即可。
简单方法可以做一张实体转换表。
|&|&| |<|<| |>|>| |"|"| |'|'| |/|/|
经过转移后在html中成为这种形式,
"><script>alert('XSS');</script>
这样就可以在浏览器中显示了,也能不会当作脚本去执行。
总结如下:
- 通常页面中包含的用户输入内容都在固定的容器或者属性内,以文本的形式展示。
- 攻击者利用这些页面的用户输入片段,拼接特殊格式的字符串,突破原有的限制,形成了代码片段
- 攻击者通过在目标网站上注入脚本,使之在用户的浏览器上运行,从而引发潜在风险
- 通过html转义,就可以防范此类风险
场景2:html特殊属性、javascript API
我们如果拿URL中参数去设置到a的href属性,也会有安全风险。
比如
http://xxx?redirectTo=javascript:alert('xss')。
我们拿到这个redirectTo参数设置到了页面的a标签href属性,就成了
<a href="javascript:alert('XSS')">跳转...</a>
这样用户一点击a标签的时候就会弹出万恶的xss。
所以不仅仅是特殊字符script,连JavaScript这种也是,出现在特殊位置也会出现xss攻击。
如果我们URL判断如果不是JavaScript开头呢,但是如果输入的是JAvascript,也会中招,
我们可能会想着先小写在判断,但是攻击者往前面加了%20,其实是个空格的转义,这样又会执行被攻击。
所以最好的办法是采用白名单,判断是不是http开头或者https开头的才能通过,
场景3:JSON内嵌到html中
<script>
var initData = <%= data.toJSON() =%>
</script>
插入json的地方不能用html转义,因为json的"会被破坏,导致不能使用。
但是json也是不安全的
- 当json中包含U+2028或U+2029这两个字符的时候,不能作为JavaScript的字面量使用,否则会抛出语法错误。
- 当JSON中包含字符串
</script>
时,当前的script标签将会被闭合,后面的字符串内容浏览器会按照html进行解析,通过增加下一个<script>
标签等方法完成注入,
于是我们又要实现一个转义JSON的函数,对内联JSON进行转义。
|U+2028|\\u2028| |U+2029|\\u2029| |<|\\u003c|
利用这个表对特殊字符进行转义显示,
例如代码<script>var initData = <%= escapeEmbedJSON(data.toJSON()) %></script>
总结如下:
- html转义时比较复杂的,在不同情况下要使用不能的转移规则,
- 应当避免自己写转义库,而应当采用成熟,业界通用的转义库。
漏洞总结
我们总结一下xss有哪些注入的方法
- 在html中内嵌的文本中,恶意内容以script标签形成注入
- 在内联的Javascript中,拼接的数据突破了原本的限制(字符串,变量,方法名等)
- 在标签属性中,恶意内容包含引号,从而突破属性限制,注入其他属性或者标签
- 在标签的href、src等属性中,包含JavaScript:等可执行代码
- 在onload、onError、onClick等事件中,注入不受控制的代码
- 在style属性和标签中,包含类似
background-image: url("javascript:console.log(1)");
新版浏览器已经可以防范 - 在style属性和标签中,包含类似expression()的css表达式代码,新版浏览器已经可以防范
xss攻击的分类
什么是xss
cross-site Scripting(跨站脚本攻击)简称XSS,是一种代码攻击。攻击者通过在目标网站注入恶意脚本,使之在用户的浏览器上运行,利用这些恶意脚本,攻击者可获取用户的敏感信息如cookie、sessionId等,进而危害数据安全。
为了和CSS区分,我们把攻击的第一个字母改成了X,于是叫做XSS。
XSS的本质是:恶意代码未经过滤,与正常代码混在一起,浏览器无法分辨哪些脚本是可信的,导致恶意脚本被执行
而由于直接在用户的终端执行。恶意代码能够获取用户信息,或者利用这些信息冒充用户向网站发起攻击
在部分情况下,由于输入长度的限制,注入的恶意脚本比较短,但可以通过引入外部的脚本,并由浏览器执行,来完成比较复杂的攻击策略。
那么用户是通过哪种方式完成的注入呢?
不仅仅是用户ugc内容可以注入,包括url的参数都可以是攻击的来源。在处理时,以下内容都不可信
- 来自用户的ugc信息
- 来自第三方的链接
- URL参数
- POST参数
- Referer(可能来自不可信的来源)
- Cookie(可能来自其他子域注入)
xss分类
根据攻击的来源可以分为存储型、反射型和DOM型3种。
类型 | 存储区 | 插入点 |
---|---|---|
存储型 XSS | 后端数据库 | HTML |
反射型 XSS | URL | HTML |
DOM 型 XSS | 后端数据库/前端存储/URL | 前端 JavaScript |
- 存储区:恶意代码存放的位置
- 插入点:由谁取得恶意代码,并插入到网页上
存储型XSS
存储型XSS攻击步骤
- 攻击者将恶意代码提交到目标网站的数据库中
- 用户打开目标网站时,网站服务端将恶意代码从数据库中取出,并拼接在html中返回给浏览器
- 用户浏览器接收到影响后解析执行,混在其中的恶意代码也被执行
- 恶意代码窃取用户数据并发送到攻击者的网站,或者冒充用户的行为,调用目标接口执行攻击者指定的操作
这种攻击常见于带有用户保存数据的网站功能,如论坛发帖,商品评论,用户私信等。
反射型XSS
反射型XSS的攻击步骤:
- 攻击者构造出特殊的URL,其中包含恶意代码
- 用户打开带有恶意代码的URL时,网站服务端将恶意代码从URL中取出,拼接在html中返回给浏览器
- 用户浏览器接受到响应解析执行,混在其中的恶意代码也被执行
- 恶意代码窃取用户数据并发送到攻击者的网站,或者冒充用户的行为,调用目标网站接口执行攻击者指定的操作
反射型XSS和存储型XSS的区别是:存储型XSS的恶意代码存在数据库中,反射型XSS恶意代码存在URL中。
反射型XSS漏洞常见于通过URL传递参数的功能,如网站搜索,跳转等。
由于需要用户主动打开恶意的URL才能生效,攻击者往往会结合多种手段诱导用户点击。
POST的内容也可以触发发射型XSS,只不过其触发条件比较苛刻(需要构造表单,并引导用户提交)所以不常见
DOM型XSS
攻击步骤
- 攻击者构造出特殊的URL,其中包含恶意代码
- 用户打开带有恶意代码的URL
- 用户浏览器接受到响应后解析执行,前端JavaScript取出URL中的恶意代码并执行
- 恶意代码窃取用户数据并发送到攻击者的网站,或者冒充用户的行为,调用目标网站接口执行攻击者指定的操作
DOM型XSS和前两种的区别:DOM型XSS攻击中,取出和执行恶意代码由浏览器端完成,属于前端JavaScript自身的漏洞,而其他两种都属于服务端的安全漏洞
XSS攻击的预防
通过前面的介绍我们知道XSS攻击两大要素:
- 攻击者恶意提交代码
- 浏览器执行恶意代码
针对第一个要素,我们要在用户输入阶段进行过滤
以上是关于xss漏洞原因以及如何应对的主要内容,如果未能解决你的问题,请参考以下文章