《安全攻防技能30讲》是极客时间上的一个关于Web安全的专栏,在学习之后特在此做记录和总结。
一、安全基础概念
先和你聊聊安全本身,以帮你建立整体的大局观。安全的本质就是保护数据被合法地使用。
1)安全原则
CIA 三元组原则,是安全领域内最基础也最重要的原则。
(1)机密性(Confidentiality)用一句话来说就是,确保数据只被授权的主体访问,不被任何未授权的主体访问。简单用一个词总结就是“不可见”。
(2)完整性(Integrity)就是确保数据只被授权的主体进行授权的修改,简单来说,就是“不可改”。
(3)可用性(Availability)就是确保数据能够被授权的主体访问到 ,简单来说,就是“可读”。
2)黄金法则
黄金法则主要包含三部分:认证(Authentication)、授权(Authorization)、审计(Audit)。这三部分其实是一种串联的关系,它描述的其实是用户在使用应用过程中的生命周期:先进行登录、再进行操作、最后留下记录。
(1)认证其实包括两个部分:身份识别和认证。身份识别强调的是主体如何声明自己的身份,而身份认证强调的是,主体如何证明自己所声明的身份是合法的。比如说,当你在使用用户名和密码登录的过程中,用户名起到身份识别的作用,而密码起到身份认证的作用。
(2)除了对“你能做什么”进行限制,授权机制还会对“你能做多少”进行限制。比如,手机流量授权了你能够使用多少的移动网络数据。最原始和最安全的授权机制,一定是你的每一次操作,都经过了管理人员的审批和确认。
(3)当你在授权下完成操作后,安全需要检查一下“你做了什么”,这个检查的过程就是审计。当发现你做了某些异常操作时,安全还会提供你做了这些操作的“证据”,让你无法抵赖,这个过程就是问责。
大部分情况下,事前防御属于认证,事中防御属于授权,事后防御属于审计。
3)密码学
(1)对称加密,代表加密和解密使用的是同一个密钥。经典的对称加密算法有 DES、IDEA、AES、国密 SM1 和 SM4。
(2)非对称加密代表加密和解密使用不同的密钥。具体的加解密过程就是,发送方使用公钥对信息进行加密,接收方收到密文后,使用私钥进行解密。经典的非对称加密算法包括:RSA、ECC 和国密 SM2。
(3)散列算法应该是最常见到的密码学算法了。大量的应用都在使用 MD5 或者 SHA 算法计算一个唯一的 id。
4)身份认证
身份认证可以分为两个部分:对外认证和对内认证。对外认证,其实就是应用的登录注册模块,它面向用户进行认证。
除了应用本身需要有登录注册的模块,应用的各种内部系统同样需要涉及登录认证的功能,比如:服务器的登录、数据库的登录、Git 的登录、各种内部管理后台的登录等等。这也就是我所说的对内认证。
对外认证是单一场景下的认证,对内认证是多场景下的认证。
当账号体系变得越来越复杂时,如何对这些账号进行统一的管理,是解决身份认证问题的关键。而单点登录(Single Sign On,SSO)就是一个非常有效的解决方案。
单点登录的概念很简单:用户只需要进行一次认证,就可以访问所有的网页、应用和其他产品了。CAS 是一个开源的单点登录框架,它不属于某一种单点登录的实现方式,而是提供了一整套完整的落地方案。
5)访问控制
“授权”和“访问控制”其实是同一个概念,都是允许或者禁止某个用户做某件事情。
一个主体请求一个客体,这个请求的授权由访问控制来完成。例如在用户去读取文件的过程中,用户是主体,读取这个操作是请求,文件是客体。
(1)主体:请求的发起者。主体可以是用户,也可以是进程、应用、设备等任何发起访问请求的来源。
(2)客体:请求的接收方,一般是某种资源。比如某个文件、数据库,也可以是进程、设备等接受指令的实体。
(3)请求:主体对客体进行的操作。常规的是读、写和执行,也可以进一步细分为删除、追加等粒度更细的操作。
常见的访问控制机制有 4 种:DAC、role-BAC、rule-BAC、MAC。
(1)DAC(Discretionary Access Control,自主访问控制)。DAC 就是让客体的所有者来定义访问控制规则。
你想要从图书馆中拿走一本书。这个时候,管理员说,“你经过这本书的所有人同意了吗?”这个过程就是 DAC。
(2)role-BAC(role Based Access Control,基于角色的访问控制)。role-BAC 就是将主体划分为不同的角色,然后对每个角色的权限进行定义。
当你想借书的时候,管理员说,“你是学生吗?”这个过程就是 role-BAC。
(3)rule-BAC(rule Based Access Control,基于规则的访问控制)。rule-BAC 就是制定某种规则,将主体、请求和客体的信息结合起来进行判定。
有一点需要我们注意,需要定义是“默认通过”还是“默认拒绝”。即当某次请求没有命中任何一条规则时,我们是应该让它“通过”还是“拒绝”呢?
如果你想要在图书馆借书,管理员会说,“根据规定,持有阅览证就可以借书。”
(4)MAC(Mandatory Access Control,强制访问控制)。MAC 是一种基于安全级别标签的访问控制策略。
在互联网中,主体和客体被划分为“秘密、私人、敏感、公开”这四个级别。MAC 要求对所有的主体和客体都打上对应的标签,然后根据标签来制定访问控制规则。
当你在图书馆排队借书的时候,听到管理员说:“初中生不能借阅高中生的书籍。”这就是一种强制访问控制。
相比较来说,DAC 是所有者对客体制定的访问控制策略,role-BAC 是管理员对主体制定的访问控制策略,而 rule-BAC 可以说是针对请求本身制定的访问控制策略。
二、Web安全
在 Web 安全这个模块中,我们所谈论的 Web,是指所有基于 HTTP 或者其他超文本传输协议(RPC 等)开发的应用,包括:网页、App、API 接口等等。这类应用的共同点是:通过 HTTP 等文本协议,在客户端和服务端之间进行数据交换。客户端需要将服务端传出的数据展示渲染出来,服务端需要将客户端传入的数据进行对应的处理。而 Web 安全所涉及的正是这些应用中存在的各类安全问题。
“Web 安全”涉及的主要内容梳理成了一张表格,你可以利用它来及时回顾。
1)XSS
通过给定异常的输入,黑客可以在你的浏览器中,插入一段恶意的 JavaScript 脚本,从而窃取你的隐私信息或者仿冒你进行操作。这就是 XSS 攻击(Cross-Site Scripting,跨站脚本攻击)的原理。
2)SQL注入
黑客会通过构造一些恶意的输入参数,在应用拼接 SQL 语句的时候,去篡改正常的 SQL 语意,从而执行黑客所控制的 SQL 查询功能。这个过程,就相当于黑客“注入”了一段 SQL 代码到应用中。这就是我们常说的 SQL 注入。
3)CSRF/SSRF
黑客编写带有恶意 JavaScript 脚本的网页,通过“钓鱼”的方式诱导你访问。然后,黑客会通过这些 JavaScript 脚本窃取你保存在网页中的身份信息,通过仿冒你,让你的浏览器发起伪造的请求,最终执行黑客定义的操作。而这一切对于你自己而言都是无感知的。这就是 CSRF(Cross-Site Request Forgery,跨站请求伪造)攻击。
用户在浏览器中输入一个 URL(比如某个图片资源),然后服务端会向这个 URL 发起请求,通过访问其他的服务端资源来完成正常的页面展示。这个时候,只要黑客在输入中提交一个内网 URL,就能让服务端发起一个黑客定义的内网请求,从而获取到内网数据。这就是 SSRF(Server Side Request Forgery,服务端请求伪造)的原理。
4)反序列化漏洞
应用在输出某个数据的时候,将对象转化成字符串或者字节流,这就是序列化操作。反序列化操作也就是应用将字符串或者字节流变成对象。
在数据转换成对象的过程中,应用需要根据数据的内容,去调用特定的方法。而黑客正是利用这个逻辑,在数据中嵌入自定义的代码(比如执行某个系统命令)。应用对数据进行反序列化的时候,会执行这段代码,从而使得黑客能够控制整个应用及服务器。这就是反序列化漏洞攻击的过程。
5)信息泄露
避免错误信息泄露代码逻辑,一方面是要通过正确地配置文件,避免错误信息被展示到前端;另一方面是要对错误信息进行检测,这里就需要用到“黑盒”检测了。
所谓“黑盒(Black Box Testing,功能测试)”,就是在不获取代码的情况下,直接运行应用,然后对应用的请求和响应进行扫描。比如,在错误信息泄露的场景中,“黑盒”检测可以向应用发起一些必然会导致错误的请求(比如上述例子中的单引号),然后观察应用是返回完整的错误日志,还是返回某些经过处理的页面。
除了错误信息之外,间接的信息泄露方式还有两种:返回信息泄露和注释信息泄露。
使用一种叫作“白盒”的代码检测方法,来避免关键的注释信息出现在线上的代码中。
所谓“白盒(White Box Testing,结构测试)”,即直接获取到线上的源代码,然后对它进行扫描。“白盒”扫描注释信息的原理比较简单,因为每一种语言的注释都会带有特殊的标记(比如 Java 和 PHP 中的 /* 等),可以比较准确地被识别出来。
返回信息过于明确不算是代码层面的漏洞,更多的是产品层面的漏洞。因此,理论上没有任何技术手段能够对这种漏洞进行检测,只能依靠人为的分析审计来避免。解决方案也比较简单,直接将返回信息模糊化、统一化即可。比如在登录的场景中,我们可以将两种登录失败的返回信息,统一修改为“用户名不存在或密码错误”。
信息泄露最普遍的方式还是直接泄露 。这里我会讲两种常见的直接泄露方式。
(1)第一种泄露方式与版本管理工具中的隐藏文件有关。通过版本管理工具(比如 SVN 和 Git),你能够很方便地进行代码回滚、备份等操作。
(2)除此之外,还有一种最常见、也最不容易注意的泄露方式,那就是上传代码到 GitHub 上。
我们可以从以下几个方面进行防护:
(1)屏蔽信息:通过技术手段,将不该被访问的资源进行屏蔽,从而避免信息泄露的产生;
(2)代码检测:从“白盒”和“黑盒”两个方向,对代码、应用等进行检测,对可能的泄露进行预警;
(3)人工审计:对于非技术原因造成的泄露,加强人工审计的工作。同时从公司制度上,去提高员工的安全意识。
6)插件漏洞
我准备了几个问题,你可以看看自己是否对所用的插件了如指掌。
(1)你所使用的所有插件的版本是什么?(包括前端和后端,直接引用和间接引用)
(2)你所使用的这些插件,是否存在漏洞,是否不被维护了,是否被废弃了?
(3)你所使用的这些插件,会在哪些地方发布更新信息和漏洞信息?
(4)你所使用的这些插件,是否会定期更新?
(5)你是否会对更新插件进行完整的测试?
(6)你所使用的这些插件,在安全方面,有哪些配置需要关注?
“0 day”,即在插件发布修复漏洞的安全补丁之前,黑客就已经知道漏洞细节的漏洞。换一句话说,“0 day”就是只有黑客知晓的未公开漏洞。
因为只有黑客知道这个漏洞,而我们连这个漏洞是什么都不知道,所以“0 day”几乎无法防御。除此之外,“0 day”还具备极高的攻击有效性,可以说只要应用使用了对应的插件,黑客几乎“战无不胜”。
建立插件漏洞的防护体系。
(1)第一步:整理插件,剔除无用插件。
(2)第二步:管理插件补丁更新。
(3)第三步:使用公开漏洞库。
三、业务安全
1)业务安全体系
黑产是基于正常的业务产品逻辑,采取非正常或者批量的操作,来获取利益的行为。业务安全就是通过各类产品策略,来对黑产进行识别和拦截,从而保障业务的正常运行。
在业务安全中,业内普遍将攻击者称为“黑产”。之所以会改换一个名称,我认为主要有两点原因。
(1)第一,“黑产”强调的是“产业化”。
(2)第二,黑客强调的是技术对抗,而“黑产”更看重资源对抗。
在基础安全中,我们说过应用的本质是数据,安全的本质是数据的 CIA,我们可以通过黄金法则来保护数据。而业务安全的本质就是保障用户价值不受黑产的恶意影响。保障的方法就是提高黑产的资源成本,使得黑产无法获利。
一般来说,黑产会从四个方面进行资源投入,分别是:用户资源、IP 资源、设备资源和操作资源。
(1)对于用户资源的对抗,目前主要的方式就是黑名单。
(2)黑产会利用“秒拨 IP”来获取大量 IP 资源。所谓“秒拨”,就是指每一次拨号上网,都会分配一个新的 IP 给我们。
(3)很多黑产案件中都会出现由大量手机设备组成的“手机墙”。除此之外,也有上游团队将手机做成云控模式,下游黑产可以直接花钱购入可远程操控的真实手机设备。
(4)黑产会尝试使用一些自动化的工具,比如按键精灵,让机器来完成游戏的过程。我们和操作资源的对抗,就是在和黑产的自动化工具进行对抗。
2)产品安全方案
我对业务安全中 IPDRR 内容的重点讲解。
(1)Identify(识别):和基础安全一样,业务安全的识别阶段主要是进行威胁评估的工作。我们需要找到黑产可能获取到的业务逻辑中的投入成本,比如,应用发放的红包、优惠券等。
(2)Protect(保护):在业务安全中,我们是通过产品方案来实施认证和授权过程的。比如,对于登录过程增加双因子认证和验证码等,就是加强认证的安全性。
(3)Detect(检测):检测阶段主要是风控系统发挥作用。
(4)Respond(响应):发现黑产的攻击后,我们可以通过封禁账号、拦截操作、拒绝提现等方式,来阻止黑产获取利益。
(5)Recover(恢复):最后就是对整个系统进行恢复了。在业务安全中,黑产可能已经盗取了某些账号,或者已经领取了部分红包。这时,我们就需要通过合适的运营机制,将账号返回给原用户,把红包退回到奖金池中。
提升应用安全性的产品方案还有很多。例如:
(1)在邀约活动中,我们可以适当增加用户任务的难度,如必须连续活跃三天用户才能得到收益;
(2)在抽奖活动中,我们可以增加参与抽奖的门槛,如必须是注册一个月以上的老用户才能参加;
(3)在排行榜活动中,我们可以将排行榜的计算规则隐藏,让黑产摸不清刷的方式。
3)风控系统
风控系统就是从业务数据中挖掘出黑产行为的数据分析系统。
产品方案属于事前的防控,是从根本上提高黑产操作的成本;风控系统属于事中的防控,是在检测到黑产行为时才进行拦截。
一个完整的风控流程还需要人工进行数据分析、处理用户投诉、监控舆情,并采取应急响应机制。
(1)前端 SDK 可以采集各类前端数据,如手机型号、硬件类型等。除此之外,前端 SDK 还会计算出一个唯一的设备指纹,通过这个设备指纹,我们就能够实现对设备行为的追踪。
(2)规则引擎会接收到业务提供的原始数据,而想要从中识别出黑产,我们首先需要通过一些统计手段找到其中有用的特征。比如说,我们可以定义,一个设备在 1 分钟内登录 5 次的行为属于异常行为,应当进行拦截。做好一款规则引擎的关键在两个方面:采用正确的工作模式、设计高效的规则管理功能。
4)机器学习
机器学习是通过找出未知的规则参数来区分已知的行为。
在生活中,我们能够快速地分辨一张图片是猫还是狗。那你有没有思考过,我们是怎么进行识别的?根据五官、颜色还是形状?仔细回想一下,你就会发现,我们往往是根据经验来判断的,很难用文字描述出准确的判断依据。
机器学习实际上是对人为经验的一种总结,并不具备创新的能力,所以最终对抗效果的好坏,还是取决于人的对抗能力。
5)设备指纹
设备指纹是用来标识手机或者浏览器的唯一 ID,我们能够通过这个 ID 关联到手机或浏览器相关的全部数据。
对比于传统的 IP、手机号等 ID,设备指纹具有唯一性高、稳定性强和信息丰富这三个优势。
简单来说,唯一性高是指一人一设备,因为使用者不同,每个智能设备上的使用痕迹和特征也具有唯一性。稳定性强也很好理解,就是智能设备的硬件不常更新,它们对应稳定不变的 ID。智能设备能够收集的信息非常丰富,自下而上包括硬件、操作系统、应用信息等。
基于这些优势,一方面,设备指纹可以以设备为单位对其相关的行为进行串联,发现诸如使用一个设备进行大规模注册等黑产攻击行为;另一方面,设备指纹可以基于其丰富的设备信息,来识别黑产使用的虚拟设备,帮助风控系统对抗黑产。
设备指纹面临的主要挑战。
(1)第一,设备重置之后,保持设备指纹不变。
(2)第二,设备更新之后,保持设备指纹不变。
(3)最后,我们还要保证设备指纹的唯一性,避免两个不同的设备产生相同的设备指纹
想要获得准确且稳定的设备指纹,我们必须从多个维度采集不同的信息。这些信息可以大致分为:软件 ID、软件静态特征、硬件静态特征和硬件动态特征。
(1)软件 ID 主要包括 iOS 设备的 IDFA、IDFV,Android 设备的 IMEI、MAC 等。这些 ID 本身就是苹果和 Google 为了给 APP 厂商提供追踪能力设计的标识,具备较好的唯一性和稳定性。但是,操作系统为了保障用户隐私,对 APP 的权限做了较多的限制。比如,用户可以自主选择禁止 APP 获取到这些 ID,重置手机也会同时重置这些 ID 等。
(2)软件静态特征主要是操作系统和 APP 本身的各类基本信息,比如操作系统版本、手机名称、APP 版本等。这些信息基本都可以通过更新或者手动配置的方式修改,因此在稳定性上表现较差。但是,这些信息能够反映出用户的个人特征,因此,它们能够对设备指纹的唯一性产生较大帮助。
(3)硬件静态特征主要是设备的各类硬件信息,比如,主板、CPU、摄像头等相关型号信息。正常用户基本不会去替换设备上的各个硬件,因此硬件静态特征具备较高的稳定性。但同一型号手机的硬件配置是一致的,所以,硬件静态特征在唯一性上相对欠缺。
(4)硬件动态特征是目前比较新的研究方向,它的基本原理是基于硬件的一些动态执行层产生的特征(如:加速度传感器的偏差)来识别虚拟设备。
设备指纹的 ID 计算其实就是计算两组数据的相似度,相似度越高、差异度越低,就越有可能是同一个设备。
相关链接:
haveibeenpwned测试密码是否泄漏
ATTACK框架识别漏洞
XSS工具BeEF
SQL注入工具sqlmap
对GitHub发起巡检的工具Hawkeye
开源规则引擎Drools
开源风控系统Nebula
Web安全练习平台WebGoat
免费的攻击渗透平台Pwnable.kr
插件漏洞检测工具OWASP Dependency-Check
JavaScript插件管理工具Retire.js
基于Osquery来开发 HIDS(基于主机型入侵检测系统)
httprecon报告各种可能的Web服务器
Burp Suite渗透利器