web 安全主题

👺 XSS(Cross Site Scripting)跨站脚本攻击

Scripting能干什么(危害)javascript

  • 获取页面数据
  • 获取cookies
  • 劫持前端逻辑
  • 发送请求
  • 偷取网站任意数据
  • 偷取用户资料
  • 偷取用户密码和登入态
  • 欺骗用户

分类html

  • 反射型

url参数直接注入的方式攻击前端

  • 存储型

存储到数据库后读取后攻击java

XSS攻击的注入点算法

  • HTML节点内容
<div>
	#{content}
</div>

这种是经过往HTML标签之间插入script标签的方式进行逻辑操纵从而引发的攻击方式。 防护:能够经过转译标签标记进行防护。转义<&lt;>&gt;sql

  • HTML属性
<img src="#{image}"/>
<img src="1" onerror="alert(1)"/>

如上代码,经过提早关闭元素属性的方式进行的XSS攻击。chrome

  • Javascript富文本
<script>
	var data = "#{data}";
	var data = "hello"; alert(1);"";
</script>

如上代码,经过在js代码中插入代码的方式进行的XSS攻击。 防护:能够经过转译标签标记进行防护。转义\或者转换成json(推荐)。数据库

  • 富文本

黑名单进行过滤,就是用正则去匹配不合法的html标签,而后进行内容过滤,优势是开发简单,缺点是可能过滤不全存在隐患。 白名单进行过滤,就是规定全部容许的标签及属性的范围域,优势是内容过滤可靠,安全,但因为事先须要将内容构建成DOM树(推荐cheerio库),所以效率可能会有必定影响。(第三方过滤模块:js-xss)json

防护小结:后端

  • 经过设置响应头的方式触发浏览器的自动防护策略.set('X-XSS-Protection', 1),但这种策略防护有限。
  • 经过上述的转译策略。
var escapeHtml = function (str) {
    if (!str) return '';
    str = str.replace(/</g, '&lt;');
    str = str.replace(/>/g, '&gt;');
    return str;
};

var escapeHtmlProperty = function (str) {
    if (!str) return '';
    str = str.replace(/"/g, '&quto;');
    str = str.replace(/'/g, '&#39;');
    str = str.replace(/ /g,'&#32;');
    return str;
};

CSP(Content Security Policy)

  • 内容安全策略
  • 用于指定哪些内容能够执行
child-src connect-src default-src --> <host-source> <scheme-source> 'self'
font-src frame-src img-src --> 'unsafe-inline' 'unsafe-eval" 'none'
manifest-src media-src object-src --> 'nonce-<base64-value>' <hash-source>
script-src style-src worker-src 'strict-dynamic'

具体参见MDN上CSP的文档信息

👺 CSRF(Cross Site Request Forgy)跨站请求伪造

XSS与CSRF的区别

  • XSS:用户知情的情的状况下,在本网站运行脚本的攻击方式。
  • CSRF:用户不知情的状况下,从其余网站对目标服务器网站运行脚本攻击的方式。

CSRF攻击的原理

graph LR; www.a.com后端 -->|2| www.a.com前端 www.a.com前端 -->|1| www.a.com后端 www.b.com前端 -->|3| www.a.com后端
  1. 用户登入a网站
  2. a网站确认身份
  3. bwz向a网站发起请求(带a网站身份

CSRF的危害

  • 利用用户登陆态
  • 用户不知情
  • 完成业务请求
  • ...
  • 盗取用户资金(转帐、消费)
  • 冒充用户发帖背锅
  • 损坏网站名誉

CSRF的防护

  • 利用same-site响应头
  • 验证码
  • token
  • referer请求头防护

经过验证 referer 请求头是否来自可信任网站或本网站,从而禁止来自第三方网站的请求。

PS:referer 应该是referrer,这个单词是为数很少的单词错误。

cookie特征

  • 前端数据存储
  • 后端经过http头设置
  • 请求时经过http头传给后端
  • 前端可读写
  • 遵照同源策略: 协议,域名和端口都同样
  • 域名
  • 有效期
  • 路径
  • http-only:只容许http的方式使用,好比不容许js操做cookie
  • secure:只容许在https的请求中使用

以上特征对应chrome中的cookie的各类参数

cookie的做用

  • 存储个性化设置
  • 存储未登陆时用户的惟一标识
  • 存储已登入用户的凭证
  • 存储其余业务信息

cookie - 登陆用户凭证管理(判断用户是不是在登陆态)

  • 方案一:cookie存储用户id

这种方案就是当用户登入成功以后在cookie中存储用户id,当用户在以后的请求中判断当前用户。可是这种方案容易被篡改用户I。

  • 方案二:cookie存储用ID和签名

这种方案不只在cookie存储用户id,而且另外存储一个由服务端根据密钥和用户id生成的惟一用户签名。于这种签名都是不可逆的,当用户在以后的请求中都带上这两个信息,由服务端根据用户id从新生成签名并与请求带过来的签名作对比来判断用户是否合法。因为密钥只有服务端有,所以这种方法是安全的。

  • 方案三:存储sessionID

这种方案只在cookie中存储当前登入用户的惟一session,这种方案是安全的,所以想要作非法操做的用户只拿到sessionID是没有任何意义的。

👺 点击劫持安全问题

点击劫持的特色

  • 用户亲手操做
  • 盗取用户资金(转帐、消费)
  • 用户不知情
  • 获取用户敏感信息
  • 其余

总结来讲,点击劫持就是在用户点击网站时,使得劫持者在用户在不知情的状况下引导用户作一些操做。其技术原理是在正常的网站上内嵌iframe框架,而且iframe框架的透明度为0,这样用户在点击页面的时候,由于是在点击看的见内容,实际上在点击看不见的iframe框架的内容,从而使掉进劫持者的trap。

点击劫持的防护

  • javascript禁止内嵌

其原理在于当页面中有iframe框架时,top对象和window对象是不同的,从而top.location对象 window.location对象也是不同的,所以能够用下面代码来进行禁用。

if(top.location != window.location){
	top.location = window.location;
}
  • X-FRAME-OPTIONS禁止内嵌

能够经过设置http response头的方式进行禁用,X-FRAME-OPTIONS:DENY。PS:这个头的其余选项参考官方文档。

  • 其余辅助手段

好比加上验证码之类的防护措施。

👺 传输安全

传输链路窃听篡改 以下图

graph LR; 浏览器-->代理服务器 代理服务器-->浏览器 subgraph 中间服务器 链路-->代理服务器 代理服务器-->链路 end 链路-->服务器 服务器-->链路

在上图浏览器和服务器之间全部的节点都有能力窃听篡改要转发的信息。

PS:在mac和Linux上能够经过命令traceroute来追踪请求从发起到目标服务器通过了哪些中间服务器,好比DNS服务器,路由转发服务器等。

http窃听

  • 窃听用户密码
  • 窃听传输敏感信息
  • 非法获取用户我的资料

http篡改

  • 插入广告
  • 重定向网站
  • 没法防护的XSS和CSRF攻击

https进行加密传输。 PS:https使用的是TLS(SSL)加密。TSL是SSL的改进算法。

可是虽然是加密传输,中间服务器无法窃听数据,可是存在中间人却能够进行数据盗取,以下图:

graph LR; 浏览器-->|加密|中间人 中间人-->|加密|服务器 服务器-->|加密|中间人 中间人-->|加密|浏览器

这样,中间人能够伪造服务器,在用户和服务器之间进行信息交互,从而盗取用户信息。所以引入证书机制,证书必须由受信任的的机构(CA)签发。以下入过程:

graph LR; CA-->|2.验证域名 颁发证书|服务器 服务器-->|4.出具证书|浏览器 浏览器-->|0.内置信任列表|CA 浏览器-->|3.发起请求|服务器 浏览器-->|5.验证经过|服务器 服务器-->|1.申请证书|CA
  • 证书没法伪造
  • 证书私钥不能泄露
  • 域名管理权不泄漏
  • CA坚持原则

本身往系统中添加证书是很危险的,由于签发此证书的CA并无被浏览器及其其余机构信任,也就是说此CA不受信任,若是你信任/本身添加了此证书到系统中后,若是此CA又给一个有问题的服务器签发证书后,这样信任这个机构签发证书的机器就有了能面临风险。

SUMMARY:https没有证书也能够正常使用,只是显示不安全。

如何启动https服务器:
申请证书 --> 配置https服务器

👺 密码安全

  • 密码的做用

证实你是你!

  • 密码的存储
  • 密码的传输
  • 密码的替代方案
  • 生物特征密码的问题

指纹解锁,虹膜识别,人脸识别等

密码 - 泄漏渠道

  • 数据库被偷
  • 服务器被入侵
  • 通信被窃听
  • 内部人员泄漏数据
  • 其余网站(撞库)

若是一个网站的用户数据泄露,不少用户可能用同一个帐号密码去注册不一样的网站,这就叫撞库。

密码 - 存储

  • 严禁明文存储(防泄露)
  • 单向变换(防泄露)

在存储密码的时候,只能由明文向密文变换,反之不能够。

  • 变换复杂度要求(防猜想)
  • 密码复杂度要求(防猜想)
  • 加盐(防猜想)

这是防止用户密码设置的过于简单,在密码进行加密的时候在密码上再增长一串数字,使得加密后的密码更加安全。

哈希算法

  • 明文 - 密文一一对应
  • 雪崩效应

当明文有一点变换的时候,密文不是改变一点,而是全盘变化。

  • 密文 - 明文没法反推

hash算法是一种信息摘要算法,咱们无法经过一段信息摘要计算出原始明文。

  • 密文固定长度

通常hash算法的结果都是32位字符串

  • 常见哈希算法:md5 sha1 sha256

彩虹表破解哈希算法

因为哈希算法是不可逆的,所以网络上能够创建穷举数据库来破解哈希算法,而这种数据库叫作彩虹表。

因为单层哈希加密容易破解(容易被彩虹表穷举),所以能够采用多重哈希增大破解难度。

md5(明文)=密文
md5(md5(明文))=密文
md5(sh1(明文))=密文
md5(sh1(sh256(明文)))=密文

密码 - 变化次数越多越安全

  • 加密成本几乎不变(生成密码时速度慢一些)
  • 彩虹表失效(数量太大,没法创建通用性)
  • 解密成本增大N倍

增大密码传输的安全性

  • https传输
  • 频率限制

验证码策略限制用户每分钟只能登录几回,防止穷举破解。

  • 前端加密意义有限

首先前端加密并不能保证传输的安全性,窃听者拿到传输的密文后也能够模拟用户请求,从而进行进一步信息盗取,可是前端加密能够保证窃听者不能拿到明文,对撞库效应有必定安全保证,觉得每一个网站的加密算法是不同的。

生物特征密码

  • 指纹(唇纹)
  • 声纹
  • 虹膜
  • 人脸

生物特征密码的安全性

  • 私密性 - 容易泄露

指纹,人脸容易在照片中出现,容易泄露。

  • 安全性 - 碰撞

生物特征密码都是经过类似度匹配,并不能彻底保证两个很类似的人脸或其余生物特征不会出现碰撞。

  • 惟一性 终身惟一 - 没法修改

因为咱们的生物特征通常都是惟一的,好比指纹,若是被泄漏,就没法更改。

👺 接入层注入问题(sql注入问题)

值得一提的是,sql注入远远比看到的简单实例复杂的多,几乎均可以做为一门学科学习,而且其衍生分支不少。因此其危害是很大的。

一些神奇的 SQL 语法

  • select * from table where id="10" and 1=0
  • select * from table where id="10" or 1=1
  • select * from table where id="10" and mid(version(),1,1)=5

检测服务器环境信息,从而根据环境信息来进行一些非法操做。

  • select 1,2,3 from table

检查一个表有多少列。

  • select id,1,2,3 from table
  • select* from table union select 1,2,3 from table2
  • select * from table where mid(username,1,1)="t"

用于猜解用户名密码,咱们知道,若是用户名密码特别复杂的状况下,进行穷举破解的成本会很是高,可是若是一位一位的破解的话,则会简单不少,上面的sql则提供了这种功能。

SQL 注入危害

  • 猜解密码
  • 获取数据
  • 删库删表
  • 拖库

SQL 注入防护

  • 关闭错误输出
  • 检查数据类型
  • 对数据进行转义

这个方法相似于XSS的黑名单和白名单过滤功能,可是基于sql注入的变种等因素,这种方法并不能很好的防治sql注入。因策功能有限。

  • 使用参数化查询

这是sql注入最主要的防护手段,基于数据库提供的参数化查询的功能,其主要原理为:对于一条查询,先将预查询语句给到数据库,好比select * from table where id=?,以后再把所缺的参数给到数据库,这样全部注入内容都是简单的参数,也就没有注入执行的危害了。

  • 使用 ORM(对象关系映射)

通常ORM框架都会解决注入问题,不管用上面哪一种方法。

👺 接入层上传问题

上传问题

  • 上传文件
  • 再次访问上传的文件
  • 上传的文件被当成程序解析

上传问题防护

  • 限制上传后缀
  • 文件类型检查
  • 文件内容检查
  • 程序输出

以上三种防护功能比较有限,而程序输出是指,当用户再次读取上传的文件的时候,服务器已二进制码的方式给用户,这样就算是可执行文件也无法执行了。

  • 权限控制-可写可执行互斥

这种相似Linux下的目录下文件权限,只有读写权限,没有执行权限。

👺 信息泄露

特征

  • 泄露系统敏感信息
  • 泄露用户敏感信息
  • 泄露用户密码

信息泄露的途径

  • 错误信息失控

当系统报错的时候,因为没有控制好错误堆栈的打印控制,使得一些敏感信息在错误堆栈中暴露,如连接字符串等。

  • SQL注入
  • 水平权限控制不当

注意和垂直权限控制作区分,垂直权限指的是咱们熟悉的管理员/普通用户的区别。而水平权限控制则指的是同一权限的人在进行操做的时候可能出现的信息泄露问题。

  • XSS/CSRF

社会工程学

  • 你的身份由你掌握的资料肯定
  • 别人掌握了你的资料
  • 别人假装成你的身份
  • 利用你的身份干坏事

其实对于互联网上“谁是我”这个话题,当愈来愈多的咱们方方面面的资料被别人掌握时,攻击者就约可能模拟“真我”去实施一些恶心行为或是盗取“真我”的一些有价值的东西。

利用oAuth思想防止资料泄露

graph LR 敏感资料-->|5. 返回票据对应数据|业务; 业务-->|4. 带票据请求|敏感资料; 业务-->|3. 带票据请求|用户; 用户-->|6. 返回数据|业务; 用户-->|1. 登入|敏感资料; 敏感资料-->|2. 派发票据|用户;
  • 用户受权读取资料

当用户未受权的状况下谁也不容许读取资料,这样能更好的方式业务开发人员不当的操做也不轨的行为。由于业务开发人员大大高于用户资料服务的开发人员。

  • 无受权的资料不可读取
  • 不容许批量获取数据

不容许批量获取资料能更有效的控制大量用户资料被盗的状况。

  • 数据接口可风控申纪

当若是真的有用户资料出现丢失的状况下,能够有效的进行过后追踪,肯定问题出现的缘由。

👺 其余安全问题

  • 拒绝服务DOS
  • 重放攻击
第一个:拒绝服务攻击DOS
  • 模拟正经常使用户
  • 占用大量服务器
  • 没法服务正经常使用户

攻击者经过模拟用户的请求并大量去请求目标服务器使得服务器的负载很是大或者大量占用服务器的带宽,使得正经常使用户无法进行正常访问。而且若是当大量带宽被占用的时候,宽带提供商为了保证网络信道的通畅,只能将受攻击的服务器下线,所以受攻击的服务器无法为用户提供正常服务。 其攻击形式主要有:

  1. TCP半链接:就是在三次握手的时候,只是作一次请求连接操做,不作后续的对服务器的响应,致使服务器觉得有请求要真的连接它,形成服务器没必要要的等待从而进行的攻击。
  2. HTTP连接:这种就是模拟正常的请求链接进行大连服务请求的形式。
  3. DNS攻击,DNS服务器的负载能力每每比正常大型服务器低,当大量攻击请求致使DNS服务器无法为正经常使用户服务的时候,致使无法进行域名解析服务,也就形成DOS的真正攻击出现。

大规模分布式拒绝服务攻击DDOS

  • 流量可达几十到上百G
  • 分布式(肉鸡,代理)
  • 极难防护

这种攻击是攻击者可能经过病毒的方式控制了别人的机器,所以攻击发起地点多是从不一样的地方进行攻击,每一个地点的攻击流量可能不大,可是总和却很巨大。这些被控制的机器就叫作“肉鸡”,还有可能经过代理服务器的方式进行攻击。

DOS攻击防护

  • 防火墙
  • 交换机、路由器
  • 流量清洗
  • 高防IP

购买云计算厂商的服务,让其做为代理,这样在遇到这种状况的时候,高防IP服务器会预先对请求进行流量清晰等防护操做,以后再将正常的请求分发给本身的服务器。

  • 避免重逻辑业务
  • 快速失败快速返回
  • 防止雪崩机制

尽可能避免失败重试,形成恶性滚雪球事件的发生

  • 有损服务

这种就是在收到攻击的时候能及时的停掉有问题的服务,保证核心服务能正常运行。

  • CDN

经过CDN来减轻服务器的负载,将一部分负载转移到CDN上来完成

第二个:重放攻击
  • 用户被屡次消费
  • 用户登陆态被盗取
  • 屡次抽奖

这种攻击就是当有有问题的请求被攻击者拿取到以后,从而进行重复这种请求的一种攻击。还有就是在消费、抽奖等活动中用户重复这种过程致使异常订单的出现等恶性结果。

重放攻击防护

  • 加密(HTTPS)
  • 时间戳限定请求的有效期
  • token(session)

一个请求只能发送一次,当第二次发送token尚未变化,则标记这次请求无效

  • nonce:相似token
  • 数字签名
相关文章
相关标签/搜索