zoukankan      html  css  js  c++  java
  • 安全攻防技能30讲

      《安全攻防技能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 计算其实就是计算两组数据的相似度,相似度越高、差异度越低,就越有可能是同一个设备。

    相关链接:

    XSS过滤器规避速查表

    haveibeenpwned测试密码是否泄漏

    ATTACK框架识别漏洞

    XSS工具BeEF

    SQL注入工具sqlmap

    对GitHub发起巡检的工具Hawkeye

    开源规则引擎Drools

    开源风控系统Nebula

    Web安全练习平台WebGoat

    免费的攻击渗透平台Pwnable.kr

    插件漏洞检测工具OWASP Dependency-Check

    JavaScript插件管理工具Retire.js

    网络入侵检测系统SnortSuricata

    基于Osquery来开发 HIDS(基于主机型入侵检测系统)

    httprecon报告各种可能的Web服务器

    Burp Suite渗透利器

  • 相关阅读:
    解决:Could not resolve archetype org.apache.maven.archetypes
    Spring MVC配置MyBatis输出SQL
    Spring集成MyBatis 通用Mapper以及 pagehelper分页插件
    关于SpringMVC或Struts2接受参数接收不到的原因
    配置quartz启动时就执行一次
    ajaxFileUpload进行文件上传时,总是进入error
    spring mvc注入配置文件里的属性
    java中将一个文件夹下所有的文件压缩成一个文件
    flume failed to start agent because dependencies were not found in classpath
    ubuntu不能安装pip unable to install pip in unbuntu
  • 原文地址:https://www.cnblogs.com/strick/p/13651560.html
Copyright © 2011-2022 走看看