Web 平安是互联网中不可或缺的一个畛域,这个畛域中诞生了大量的黑帽子与白帽子,他们都是平安畛域的王者,在平时里,他们利用各种奇妙的技术相互博弈,时不时就会掀起一场 Web 平安浪潮,真堪称神仙打架,各显神通。
本文从一个吃瓜大众的角度,聊一聊 Web 平安的一些乏味故事。
- 平安世界观
- 平安攻防案例
- 总结与思考
平安世界观
在互联网倒退之初,IE 浏览器垄断的期间,大家上网的目标都很单纯,次要通过浏览器分享信息,获取新闻。但随着互联网的一直倒退倒退,一个网页能做的事件越来越多,除了看新闻,咱们还能够看视频、玩游戏、购物、聊天等,这些性能都大大丰盛了咱们的生存。
随着网页性能的逐步增多,就开始呈现了一些黑帽子,他们试图通过一些技术手段来牟取利益。在我小的时候,印象最深的就是木马病毒,它能够监控你的键盘,将你在键盘上敲打的内容发送到黑客的机器上,黑客通过剖析这些内容,很容易就能失去你的游戏账号和明码。
在这之后,就诞生出了一些杀毒软件,致力于解决网络上的各种病毒,随着一直地倒退,杀毒软件曾经成为一台电脑必不可少的软件。
为什么会呈现这样的平安问题?
平安归根到底是信赖的问题 ,如果所有人都依照失常的流程去上网,不去谋取私利,也就没有平安问题可谈了。
平安的基本在于信赖,但要让所有人相互信赖谈何容易。在以后阶段,咱们能够做到:继续做好平安防护,让破绽越来越少,非法攻打越来越艰难,这样就能逐步缩小黑帽子的数量,让病毒制造者越来越少。
如何做好平安
要做好平安,首先得了解平安问题的属性,前人通过有数实际,最初将平安的属性总结为平安三要素,别离为:机密性、完整性、可用性。
-
机密性
- 爱护数据内容不被泄露。
- 通常应用加密的办法。
-
完整性
- 爱护数据内容是残缺的、没有被篡改。
- 通常应用数字签名的办法。
-
可用性
- 数据随时都可能应用。
- 通常是在进攻 DOS。
有了平安 3 因素之后,咱们就能够对平安问题进行评估了。
-
资产等级划分
- 找出最重要的数据。
- 找出最重要数据的宿主空间,如:在数据库里,那么数据库就得重点进攻。
- 找出数据库的宿主空间,如:在一台服务器上,那么这台服务器就得做次等进攻。
- 找出服务器的宿主空间,如:在 OSI 网络层级上,那么在网络层面就得做个别进攻。
-
威逼剖析
- 找出威逼(可能造成危害的起源)。
- 找出危险(可能呈现的损失叫做危险)。
-
危险剖析
- 采取多规范决策分析,即:危险 = 威逼等级 * 威逼可行性。
- 计算所有的威逼,将最终的危险进行排序,优先解决危险大的问题。
-
确认解决方案
- 找出不平安的实现形式,并确定解决方案。
- 解决方案不要扭转商业需要的初衷。
- 解决方案需对用户通明,不要扭转用户的习惯。
做好平安评估之后,咱们就有了一份平安解决方案,后续的平安工作只需依照这个计划去做,就没有任何问题。
平安的准则
有了平安解决方案之后,咱们还能够制订一些平安准则,恪守准则做事,能够让咱们事倍功半。
-
黑名单、白名单准则
- 白名单计划指的是给平安的资源受权。
- 黑名单计划指的是禁用不平安的资源。
- 咱们应该优先应用白名单计划,因为黑名单通常统计不完所有的不平安资源。
- 如:XSS 攻打的形式十分多,能够通过 script、css、image 标签等,只管你将这些标签都退出黑名单,也不能保障其余的标签都没有 XSS 的攻打隐患。
-
最小权限准则
- 只授予必要的权限,不要适度受权,缩小出错机会。
- 如:一般权限的 Linux 用户只能操作
~
文件夹下的目录,如果有人想删库跑路,在执行rm -rf /
时,就会提醒无权限。
-
纵深进攻准则
- 这条准则相似
木桶实践
,平安程度往往取决于最短的那块板。 - 即:不要留下短板,黑帽子们往往能够利用短板为突破口,开掘更大的破绽。
- 这条准则相似
-
数据与代码拆散准则
- 当用户数据被当成代码执行时,混同了数据和代码的边界,从而导致平安问题。
- 如:XSS 就是利用这一点去攻打的。
-
不可预测性准则
- 这条准则是为了进步攻打门槛,无效避免基于篡改、伪造的攻打。
- 如:数据库中应用 uuid 代替 number 型的自增主键,能够防止 id 被攻击者猜到,从而进行批量操作。
- token 也是利用不可预测性,攻击者无奈结构 token 也就无奈进行攻打。
有了这些平安准则,咱们就能够开干了,接下来介绍几个常见的攻防案例。
平安攻防案例
平安攻防的案例十分多,这里次要介绍几个出镜率比拟高的平安问题。
客户端攻打
- XSS 攻打
- CSRF 攻打
- 点击劫持
XSS 攻打
XSS 攻打的实质是将用户数据当成了 HTML 代码一部分来执行,从而混同本来的语义,产生新的语义。
如图所示,咱们注册了一个 <script>alert(document.cookie)</script>
的用户名,所有能看到此用户名字的页面,都会弹出以后浏览器的 Cookie,如果代码的逻辑是将 Cookie 发送到攻击者的网站,攻击者就能假冒以后用户进行登录了。
XSS 攻击方式有很多,所有和用户交互的中央,都有可能存在 XSS 攻打。
例如:
- 所有 input 框。
- window.location。
- window.name。
- document.referrer。
- document.cookie。
- localstorage。
- …
因为页面中与用户交互的中央十分多,必定还有一些 XSS 的攻击方式没有被发现,而一旦被黑帽子发现,就可能造成重大的影响,所以咱们务必引起器重。
XSS 攻打影响
被 XSS 攻打胜利后,攻击者就能够获取大量的用户信息,例如:
- 辨认用户 UA。
- 辨认用户浏览器扩大。
-
辨认用户浏览过的网站。
- 通过 CSS 的 Visited 属性。
-
获取用户实在的 IP。
- 通过 WebRTC 等。
-
盗取 Cookie
- 伪造用户登录,窃取用户材料。
-
XSS 钓鱼。
- 向页面注入一个登录弹窗,让用户认为是网站内的登录弹窗(其实是钓鱼网站的),一旦用户登录,账号密码就泄露给了钓鱼网站。
XSS 攻打进攻
目前来说,XSS 曾经失去了互联网行业的器重,许多开发框架都内置了平安的 HTML 渲染办法。
咱们也能够自定义进行一些平安配置。
- 配置 HTTP 中的 http-only 头,让前端 JS 不能操作 Cookie。
- 输出查看,在用户提交数据时,应用 XssFilter 过滤掉不平安的数据。
- 输入查看,在页面渲染的时候,过滤掉危险的数据。
CSRF 攻打
CSRF(Cross-site request forgery)跨站申请伪造,是一种利用用户身份,执行一些用户非本意的操作。
如图所示:
- 用户先登录了服务器 B,而后去拜访服务器 C。
- 服务器 C 通过歹意脚本,假冒 A 去调用服务器 B 上的某个性能,
- 对于服务器 B 来说,还认为这是 A 发动的申请,就当作失常申请解决了。
试想一下,如果 C 假冒 A 进行了一次转账,必定会造成大量的经济损失。
CSRF 进攻形式
进攻 CSRF 次要有以下几种形式:
-
验证码
- 每一次申请都要求用户验证,以确保申请实在牢靠。
- 即:利用歹意脚本不能辨认简单的验证码的特点,保障每次申请都是非法的。
-
Referer 查看
- 查看发动申请的服务器,是否为指标服务器。
- 即:HTTP 申请中的 Referer 头传递了以后申请的域名,如果此域名是非法服务器的域名,则须要禁止拜访。
-
Token
- 利用不可预测性准则,每一申请必须带上一段随机码,这段随机码由失常用户保留,黑帽子不晓得随机码,也就无奈假冒用户进行申请了。
点击劫持
点击劫持是一种视觉坑骗的攻打伎俩。攻击者将须要攻打的网站通过 iframe 嵌套的形式嵌入本人的网页中,并将 iframe 设置为通明,在页面中透出一个按钮诱导用户点击。
就像一张图片下面铺了一层通明的纸一样,你看到的是攻击者的页面,然而其实这个页面只是在底部,而你真正点击的是被攻击者透明化的另一个网页。
如果所示,当你点击了页面上的按钮之后,本认为会 ……,而真正执行的操作是关注了某人的博客。
点击劫持进攻
因为点击劫持次要通过 iframe,所以在进攻时,次要基于 iframe 去做。
-
计划一:frame busting
- 失常网站应用 JS 脚本判断是否被歹意网站嵌入,如:博客网站监测到被一个 iframe 关上,主动跳转到失常的页面即可。
if (self !== top) {// 跳回原页面 top.location = self.location;}
-
计划二:应用 HTTP 中的 x-frame-options 头,管制 iframe 的加载,它有 3 个值可选:
- DENY,示意页面不容许通过 iframe 的形式展现。
- SAMEORIGIN,示意页面能够在雷同域名下通过 iframe 的形式展现。
- ALLOW-FROM,示意页面能够在指定起源的 iframe 中展现。
-
配置 iframe 的 sandbox 属性
- sandbox = “allow-same-origin” 则只能加载与主站同域的资源。
服务器端攻打
服务器端的攻打的形式也十分多,这里列举几个常见的。
- SQL 注入攻打
- 文件上传破绽
- 登录认证攻打
- 应用层拒绝服务攻打
- webServer 配置平安
SQL 注入攻打
SQL 注入和 XSS 一样,都是违反了数据和代码拆散准则导致的攻击方式。
如图所示,咱们利用 SQL 注入,就能在不须要明码的状况下,间接登录管理员的账号。
攻打的前提是:后端只用了简略的拼接 SQL 的形式去查问数据。
# 拼接进去的 sql 如下:select * from user where username = 'admin' or 1=1 and password = 'xxx'# 无论明码输出什么,这条 sql 语句都能查问到管理员的信息
除此之外,SQL 注入还有以下几种形式:
-
应用 SQL 探测,猜数据库表名,列名。
- 通过 MySQL 内置的 benchmark 探测数据库字段。
- 如:一段伪代码
select database as current if current[0]==='a',benchmark(10000,'猜对了')
如果表明猜对了,就提早 10 s 并返回胜利。
-
应用存储过程执行系统命令
- 通过内置的办法或存储过程执行 shell 脚本。
- 如:xp_cmdshell、sys_eval、sys_exec 等。
-
字符串截断
- 如:MySQL 在解决超长的字符串时,会显示正告,但会执行胜利。
- 注册一个 admin + 50 个空格的用户,会触发截断,最终新增一个 admin 用户,这样就能领有管理员权限了。
SQL 注入进攻
避免 SQL 注入的最好的方法就是,不要手动拼接 SQL 语句。
-
最佳计划,应用预编译语句绑定变量
- 通常是指框架提供的拼接 SQL 变量的办法。
- 这样的语义不会产生扭转,变量始终被当成变量。
- 严格限度数据类型,如果注入了其余类型的数据,间接报错,不容许执行。
- 应用平安的存储过程和零碎函数。
CRLF 注入
在注入攻打中,换行符注入也是十分常见的一种攻击方式。
- 如果在 HTTP 申请头中注入 2 个换行符,会导致换行符前面的所有内容都被解析成申请实体局部。
- 攻击者通常在 Set-Cookie 时,注入换行符,管制申请传递的内容。
文件上传破绽
上传文件是网页开发中的一个常见性能,如果不加解决,很容易就会造成攻打。
如图所示,攻击者上传了一个木马文件,并且通过返回的 URL 进行拜访,就能管制服务器。
通常咱们会管制上传文件的后缀名,但也不能齐全解决问题,攻击者还能够通过以下形式进行攻打:
-
伪造失常文件
- 将木马文件伪装成失常的后缀名进行上传。
- 如果要防止这个问题,咱们能够持续判断上传文件的文件头前 10 个字节。
-
Apache 解析形式是从后往前解析,直到找到一个意识的后缀名为止
- 如:上传一个
abc.php.rar.rar.rar
能绕过后缀名查看,但在执行时,被当成一个 php 文件进行执行。
- 如:上传一个
-
IIS 会截断分号进行解析
- 如:
abc.asp;xx.png
能绕过后缀名查看,但在执行时,被当成一个 asp 文件进行执行。
- 如:
-
HTTP PUT 办法容许将文件上传到指定地位
- 通过 HTTP MOVE 办法,还能批改上传的文件名。
- 通过二者配合,就能先上传一个失常的后缀名,而后改为一个歹意的后缀名。
-
PHP CGI 门路问题
- 执行
http://abc.com/test.png/xxx.php
时,会把 test.png 当做 php 文件去解析。 - 如果用户正好是把一段歹意的 php 脚本当做一张图片进行上传,就会触发这个攻打。
- 执行
文件上传破绽进攻
进攻文件上传破绽,能够从以下几点思考:
- 将文件上传的目录设置为不可执行。
-
判断文件类型
- 查看 MIME Type,配置白名单。
- 查看后缀名,配置白名单。
-
应用随机数改写文件名和文件门路
- 上传文件后,随机批改文件名,让攻击者无奈执行攻打。
-
独自设置文件服务器的域名
- 独自做一个文件服务器,并应用独自的域名,利用同源策略,躲避客户端攻打。
- 通常做法是将动态资源寄存在 CDN 上。
登录认证攻打
登录认证攻打能够了解为一种破解登录的办法。攻击者通常采纳以下几种形式进行破解:
-
彩虹表
- 攻击者通过收集大量明文和 MD5 的对应关系,用于破解 MD5 密文找出原文。
- 对于彩虹表中的 MD5 明码,咱们能够加盐,进行二次加密,防止被破解。
-
Session Fixation 攻打
- 利用利用零碎在服务器的 SessionID 固定不变机制,借助别人用雷同的 SessionID 获取认证和受权。
- 攻击者登录失败后,后端返回了 SessionID,攻击者将 SessionID 交给失常用户去登录,登录胜利后,攻击者就能应用这个 SessionID 假冒失常用户登录了。
- 如果浏览器每一次登录都刷新 SessionID 能够防止这个问题。
-
Session 放弃攻打
- 有些时候,后端出于用户体验思考,只有这个用户还活着,就不会让这个用户的 Session 生效。
- 攻击者能够通过不停发动申请,能够让这个 Session 始终活下去。
登录认证进攻形式
-
多因素认证
- 明码作为第一道进攻,但在明码验证胜利后,咱们还能够持续验证:动静口令,数字证书,短信验证码等,以保障用户平安。
- 因为短信和网页齐全是 2 套独立的零碎,攻击者很难获取到短信验证码,也就无奈进行攻打。
除此之外,前端登录认证还有多种形式,如果你对此感兴趣,能够参考我之前写的 前端登录,这一篇就够了。
应用层拒绝服务攻打
应用层拒绝服务攻打,又叫 DDOS 攻打,它指的是利用大量的申请造成资源过载,导致服务器不可用。
通常有以下几种 DDOS 攻击方式:
-
SYN Flood 洪水攻打
- 利用 HTTP 3 次握手机制,耗费服务器连贯资源。
- 如:攻击者发动大量的 HTTP 申请,但并不实现 3 次握手,而是只握手 2 次,这时服务器端会持续期待直至超时。这时的服务器会始终忙于解决大量的垃圾申请,而无暇顾及失常申请。
-
Slowloris 攻打
- 以非常低的速度发送 HTTP 申请头,耗费服务器连贯资源。
- 如:攻击者发送大量 HTTP 申请,但每个申请头都发的很慢,每隔 10s 发送一个字符,服务器为了期待数据,不得始终保持连贯,这样一来,服务器连接数很快就被占光了。
-
HTTP POST DOS
- 发送 HTTP 时,指定一个十分大的 Content-Length 而后以很长的距离发送,耗费服务器连贯资源。
-
CC 攻打
- 针对一些十分耗费资源的页面,一直发动申请。
- 如:页面中的某些页面,须要后端做大量的运算,或者须要做十分耗时的数据库查问。在大量的申请下,服务器的 CPU、内存等资源可能就被占光了。
-
Server Limit DOS
- 通过 XSS 注入一段超长的 Cookie,导致超出 Web 服务器所能接受的 Request Header 长度,服务器端就会回绝此服务。
-
ReDOS
- 针对一些缺点的正则表达式,发动大量申请,耗光系统资源。
应用层拒绝服务攻打进攻
对于应用层拒绝服务攻打,目前也没有特地完满的解决方案,不过咱们还是能够进行一些优化。
-
利用代码做好性能优化
- 正当应用 Redis、Memcache 等缓存计划,缩小 CPU 资源使用率。
-
网络架构上做好优化
- 后端搭建负载平衡。
- 动态资源应用 CDN 进行治理。
-
限度申请频率
- 服务器计算所有 IP 地址的申请频率,筛选出异样的 IP 进行禁用。
- 能够应用 LRU 算法,缓存前 1000 条申请的 IP,如果有 IP 申请频率过高,就进行禁用。
其实,解决 DDOS 外围思路就是禁用不可信赖的用户,确保资源都是被失常的用户所应用。
WebServer 配置平安
咱们在部署 web 利用的时候,常常会用到 Nginx、Apache、IIS、Tomcat、Jboss 等 Web 服务器,这些服务器自身也存在一些安全隐患,如果配置不当,很容易收到攻打。
在配置 Web 服务器时,能够参考以下几点:
-
以用户权限运行 Web 服务器
- 恪守最小权限准则,以最小权限身份运行 Web 服务器,限度被入侵后的权限。
-
删除可视化后盾
- 运行 Tomcat、Jboss 等 Web 服务器时,默认会开启一个可视化的经营后盾,运行在 8080 端口,并且第一次拜访是没有认证的。
- 攻击者能够利用可视化后盾,近程加载一段 war 包或者上传木马文件,进行管制。
-
及时更新版本
- 支流的 Web 服务器,每隔一段时间就会修复一些破绽,所以记得及时更新版本。
总结与思考
本文介绍了 Web 平安的基本概念,以及大量的攻防技巧,其实这只是 Web 平安中的冰山一角,如果你对此感兴趣,无妨在平安畛域持续深耕学习,肯定能看到更广大一片天。
对于一个开发者来说,咱们应该在写代码时就将平安思考其中,造成本人的一套平安开发体系,做到心中有平安,时时思考平安,就能无形之中化解不法分子的攻打。
最初,如果你对此有任何想法,欢送留言评论!