Web安全是一个系统性工程,从架构到编码,从前端到服务器。
一、前端
1、跨站脚本攻击(XSS)
跨站脚本攻击(Cross Site Scripting),为不和层叠样式表(Cascading Style Sheets, CSS)的缩写混淆,故缩写为XSS。
跨域(或者叫跨站),应该怎么理解?之所以叫跨域,是因为这种攻击或漏洞在刚开始的时候,是试图获取别的站点的机密信息的,导致浏览器推出同源策略,仅允许来自相同域名和使用相同协议的对象与网页之间有交互;而今时今日,是否跨域已经不重要,不过名称就一直保留了下来。
既然是脚本攻击,主角当然就是JS脚本了。原理是攻击者通过各种途径向网站输入含JS代码的信息,然后网站在页面上输出了这些信息,其中的JS代码被执行。
类型上可分为:
1)持久型 XSS (Persistent型)
持久化,攻击代码存储到了服务器。比如在个人信息或发表博客、使用富文本编辑器等地方,加入脚本代码,如果没有过滤或过滤不严,那么这些代码将储存到服务器中,当用户访问相关展示页面的时候就被触发执行。这种XSS比较常见和危险,容易造成蠕虫,盗窃cookie等。
2)反射型 XSS (Non-persistent型)
在URL参数中带脚本,然后显示在页面上。
3)Dom-based型
因为历史的原因,有安全专家单独提出这种类型,所以被单独划归一类,其实是利用了DOM来进行攻击,持久型、反射型都有可能。以下例子算反射型也没问题。
<?php
error_reporting(0);
$name = $_GET["name"];
?>
<input id="text" type="text" value="<?php echo $name;?>" />
<div id="print"></div>
<script type="text/javascript">
var text = document.getElementById("text");
var print = document.getElementById("print");
print.innerHTML = text.value; // 获取 text的值,并且输出在print内。这里是导致xss的主要原因。
</script>
作者:梧桐雨
链接:https://www.zhihu.com/question/26628342/answer/33504799
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
【防御方法】
尽量避免直接显示用户提交的数据,应进行一定的过滤,比如对于数据中存在的 < 和 > 等符号需要进行编码,这样就可以防止脚本攻击。
按照《白帽子讲WEB安全》所讲,XSS还包含伪造表单请求。防御办法是使用验证码。当然验证码早就不是什么绝对的安全策略。
2、跨站点请求伪造(CSRF)
Cross-site request forgery,通常缩写为 CSRF 或者 XSRF。
在网站外(比如其他站点或邮件)伪造一个网站请求,诱使网站用户点击或运行,从而达到攻击的目的。
为啥要诱使用户点击?因为用户是该网站的合法用户,只有通过他点击或运行,才有相关权限。
有时候也许并不需要用户点击,只需浏览即可。比如,设置一个<img>
,其src就是一个该死的请求。
这个请求这么厉害,能被攻击?是的,比如说,这是一个删除啥东东的请求。
【防御方法】
检查Referer字段
HTTP头中有一个Referer字段,这个字段用以标明请求来源于哪个地址。
添加校验token
token由服务器输出,然后浏览器请求时一起提交,并不保存在cookie。
3、点击劫持(ClickJacking)
将透明的图片或frame覆盖在正常页面上,误导用户进行点击。又被称为界面伪装。
问题是,如何做到将图片或frame覆盖?答案是黑客在自己站点用iframe来显示被攻击站点,然后再将透明图片或另一个透明的iframe覆盖其上。
【防御方法】
拒绝别的站点用iframe来显示自己站点的内容。
在服务器端设置 X-FRAME-OPTIONS
网页上设置用于防止加载iFrame的Javascript代码,比如检测自己如果不处于top,马上跳出来。
此方法适用于不支持X-FRAME-OPTIONS的版本较老的浏览器。
4、HTML5安全
HTML5在安全方面进行了增强,但新特性,带来新的安全问题。包括:
1)新标签的XSS,例如<video>
2)Canvas 功能强大,类似flash,可以用于在客户端破解验证码。上面说到,XSS包括伪造表单请求,防御方法就是验证码;但攻击者可以将验证码发送到自己的服务器上进行破解,破解之道大约是图片识别,彩虹表对照之类吧。现在可以用Canvas在客户端就进行破解。
3)CORS
Cross-Orgin Resource Sharing,跨域资源共享。HTML5之前,要合法跨域的话,可以通过JSONP,iframe等。现在有了一个W3C标准:CORS。
它允许浏览器向跨源服务器,发出XMLHttpRequest请求,从而克服了AJAX只能同源使用的限制。
原理是浏览器在请求头附上一个标志,服务器根据策略决定是否同意。服务器可以对策略进行设置,类似白名单。
而JSONP的原理则是:
1、浏览器的同源策略把跨域请求都禁止了;
2、HTML的<script>
标签是例外,src可以轻易引用其他站点的JS文件,所以,其他站点将数据放在这个JS文件里,不就能跨域访问啦?
3、客户端引用到JS之后,就拿到了数据,然后怎么处理随便你,但毕竟不够方便,这时就有了jsonp 这种非正式的协议:客户端定义一个回调函数,然后在src路径附上这个函数名,作为参数传递;而服务器端在JS文件中,将数据写成用这个回调函数来调用。这样数据就能自动进行处理了。
二、服务器端
1、注入攻击
不解释。
2、文件上传漏洞(File Upload Attack)
漏洞就是上传了一些别有用心的文件到服务器并被执行。
1)检查文件类型,采用白名单
2)修改上传文件名,消除文件名含有特殊字符,被操作系统断句、解释成另一后缀名的漏洞
例如 photo123.asp;xx.jpg ,IIS6会解释为photo123.asp
3)对上传图片进行尺寸压缩,杀灭其中可能存在的恶意代码
4)单独设置文件服务器域名,和应用程序分开,利用浏览器的同源策略
5)上传目录不可执行
3、认证与会话管理
1)密码
不解释
2)session与 cookie
用户登录后常常有一个sessionID,拿到它往往就等同于登录;而这个sessionid通常都储存在cookie。保护cookie可以这样:
【secure属性】
当设置为true时,表示创建的 Cookie 会被以安全的形式向服务器传输,也就是只能在 HTTPS 连接中被浏览器传递到服务器端进行会话验证,如果是 HTTP 连接则不会传递该信息,所以不会被窃取到Cookie 的具体内容。
【HttpOnly属性】
如果在Cookie中设置了”HttpOnly”属性,那么通过程序(JS脚本、Applet等)将无法读取到Cookie信息,这样能有效的防止XSS攻击。
如果sessionid直接存放于url,例如手机版,因为很多手机浏览器不支持cookie,则更容易泄露。
【控制session生存周期】
例如强制销毁,或者检测用户IP,客户端发生变化则强制退出等
3)单点登录
单点登录将风险集中,一方面有利控制,一方面如果被攻陷,则影响范围广。应对办法可以双认证,登录用单点登录,一些敏感的操作,应用系统可以自己再认证一次。比如网银,付款时要输入付款密码。
4、访问控制
就是权限了。
隐藏页面(比如菜单不可见,按钮不可见)难以对付爬虫和猜测,并不安全,需要在服务器端进行权限检查。
权限分为垂直权限和水平权限。垂直权限为角色类,水平权限则是同一角色,但不同账户。如果两个账号属同一个角色,但修改URL中的ID值,张三即可访问甚至修改李四的资料,即有安全性问题。
5、加密算法与随机数
不解释
6、WEB框架安全
一些WEB框架,在机制方面天然就有优越的安全性,或者有利于实施安全性措施。比如ORM框架,可以防范SQL注入;MVC框架,数据流向历经View,Controller,Model,为安全设计提供了便利。
同时,在框架层面进行安全防范,具有统一、不容易遗漏、减轻程序员工作等优点。
然而,WEB框架本身也可能会出现漏洞,并且由于框架版本稳定,一般不频繁升级的特点,一旦漏洞无法及时修补,后果很严重。
7、应用层拒绝服务攻击
DDOS,Distributed Denial of Service,分布式拒绝服务,利用合理的请求造成资源过载,导致服务不可用。
1)网络层DDOS
常见的有SYN flood(flood,洪水之意)、UDP flood、ICMP flood。
其中SYN flood最为常见,利用TCP的缺陷。具体说,就是将包中的源IP地址设置为不存在或不合法的值。服务器一旦接受到该包便会返回接受请求包,但实际上这个包永远返回不到来源处的计算机。这种做法使服务器必需开启自己的监听端口不断等待,也就浪费了系统各方面的资源。
一个应对办法是记录IP并统计访问频率,离奇高者则屏蔽。或者引入硬件反DDOS设备。
2)应用层DDOS
硬件防DDOS设备一般无能为力。攻击原理是不断请求消耗资源大的网页。比如CC攻击。
【CC】Challenge Collapasar,挑战黑洞的简称。黑洞是中国安全公司绿盟的一款DDOS产品。比如读数据库,写硬盘之类的操作。
应对办法是
性能优化,使用缓存
限制请求频率
使用验证码或者其他人机识别方法
3)资源耗尽攻击
【Slowloris】以极低的速度向服务器发出请求,目的是占住连接不放,直至所有连接都被占用。
【HTTP POST DOS】
发送http post包时,声明Content-length非常大,却以极低的速度发包,比如10到100秒发送一个字节,以此占住连接不放,直至所有连接都被占用。
【ReDOS】
让服务器解释一个别有用心的正则表达式,让它根本停不下来。
8、其他