工程师安全培训

2021-04-04 03:00:27

欢迎"为工程师&#34的安全培训;这个谈话专门针对工程师,并且比上一个训练更具技术性。如果你'虽然不是工程师,但不要担心,你'重新欢迎留下来。虽然主题将是技术性的,但无论您的技能水平如何,它都应该是信息性的,无论您是何处才能入门,还是拥有多年经验的经验丰富的工程师。

对于那些没有遇见我的人,"嗨,我浓郁"我致力于安全和事件回复,并制作很多愚蠢的笑话。你' ll习惯了。

如果您在去年加入了PageRduty,那么这将是您第一次通过这种特殊的培训课程。它'过去的狂欢综合评论,正如您从这完全正版的推荐报价那样看,我完全没有任何方式弥补。

在我们进入主要内容之前,我想向您提供快速提醒我们的幻灯片分类。我们在最后一次训练中经历过这个,但也适用于这个。请尊重添加到这些幻灯片的分类,也可以分享' t的分享。与我们以前的培训一样,这个也将是开放的,所以你可以与朋友和家人分享,内部版本将在Wiki上提供录音。

那你为什么今天在这里?今天的目标' S培训是让您有机会了解开发软件时相关的各种共同安全漏洞。我不仅要向你展示他们是什么,而且如何阻止他们,但我也将向您展示如何利用它们。利用这些漏洞通常是真正学习如何工作的最佳方式,并且是了解如何阻止它们的重要组成部分。加上它&#39更有趣,向您展示如何利用它们。

我将涵盖很多不同的主题。 Don' t被数量推迟到这里,有些人会进入相当多的深度,但其他人我将简要致力于触摸。其中一些可能已经熟悉了,但希望你仍然会学会一些新的东西,如果是这样的话。

我经常从开发人员听到这个声明,他们的首选框架照顾他们所有的矮胖砂砾安全的东西,所以他们不需要了解他们的工作方式。我在这里告诉你,完全没有这种情况。 Rails,Akka,Symfony,无论您使用什么,您都可以盲目地承担您所涵盖的框架或首选图书馆。是的,它的方便,他们为你做了所有的沉重举起,但你可以'它只是为了自己理解和修复安全问题的责任。

因为即使框架很好,它们也不会对安全问题免疫(扰流板:没有软件免受安全问题)。如果公开宣布新的漏洞,你可以' T总是坐在周围并等待官方补丁。您需要了解安全漏洞如何工作,以便您自己修补它。因为攻击者aren'他们要等待,他们'重新开始立即利用它们。

现在,我肯定没有倡导使用框架,你肯定应该,我只是说你永远不应该假设框架将永远保护你。

基本上,你应该盲目地信任框架。了解潜在的原则很重要,所以你可以判断框架什么时候不做它应该做的事情,所以你可以在事实证明它们不是时快速解决问题。

我偶尔听到的另一份声明是"它只是临时为Hackday",经常被用作试图忽略安全最佳实践的借口。

仅仅因为它'' t的意思是你可以忽略规则。我知道你想快速制作一些事情,你不想用所有这个&#34弄乱所有这些;安全"东西。但它'很重要,不容忽视。你应该尝试禁用黑暗的防火墙规则(是的,如果你尝试),我们会立即被分页),而且你应该使用公共代码存储库来开发你的黑暗想法,它'很好地打开它以后的来源,但有时你可以赠送我们不想公开的信息。

最后,您永远不应该为您的黑暗时使用客户数据,除非您'在舞台上的阶段,&#39被推到生产。我们在上次培训中介绍了这一点,但我再次重申它,客户数据不应在任何情况下都不应离开我们的生产环境。

这一系列冗余的幻灯片通过了一项安全研究员如何对我们负责任地披露给我们的严重安全漏洞的故事。我们如何通过该错误向我们报告,我们如何确认其有效性,恰好在我们的代码中展示了该错误的(以及为什么它是一个问题),以及如何修复。由于虫子的敏感性,我们选择了缩短了这个部分。

值得共享的一件事是,删除幻灯片中的一个课程与代码中缺失的检查引起的事实有关。这种类型的错误很难用自动化工具检测,因为现有的代码本身是完全有效的,因此漏洞来自没有代码。

点I' m试图在这里做的是我们'重复并不完美。世界上每个系统都有安全问题。外部研究员无法访问我们的源代码(我们希望)能够找到此错误。它'我们所有人都在我们所有人上看了自己的观念。

此幻灯片显示了我们对安全问题的回答的详细信息,包括从初始报告(3小时47米)和我们与研究人员的一些通信所需的时间(这是编辑此幻灯片的原因)。

好的,让' s开始使用一些实际的技术内容。我们的第一个主题是SQL注入。

实际上是什么?这是我可以想出的最简单的单行。它' s在运行时在SQL查询中执行的任何用户输入。这意味着用户能够根据其输入来操纵数据库查询。

让' s查看一个快速示例,使用查询对假设(和非常糟糕的)登录页面。说真的,从不设计这样的登录页面,我只是用它作为一个创作的例子。

登录时,这将根据输入的用户名和密码查找用户记录。如果返回结果,则会记录该人。很简单,实际上在那里有这样的登录页面(不幸的是)。

所以,用真正的用户登录,以了解在正常情况下的工作原理。用户名和密码将放入查询,然后将执行使用这些值执行。

SQL语句有效。用户名和密码是正确的,因此用户返回单个结果,它们现在将作为此用户身份登录。

在您中间的热衷于您将发现不应该以这种方式存储密码。我们' ll稍后会谈论正确存储密码。记住,在这里的角落里有一个大红色图标,永远不要像这样实现登录页面!

好的,所以'好好和善良。那个'那个开发人员如何打算工作。

但是诚实的人aren' t始终将成为使用这样的登录表格的。有些用户将成为攻击者,他们赢得了规则。所以让我们说我们有一个攻击者,他们现在输入这样的东西。他们有一个管理员的用户名,但是密码'或1 = 1 - 。

如前所述,在SQL语句中替换用户名和密码。但这里发生了不同的事情。因为此代码易于SQL注入,所以正在执行的查询实际上从开发人员想要的内容进行了更改。您可以在此处在此处看到SQL查询现在不同。

这个新的SQL语句在其中有一个额外的条件,这意味着此查询将返回管理员用户的行,即使正确的密码未输入。查询添加了一个或1 = 1,始终会评估为true(因为1总是等于1)。既然或真实将永远是真的,它就没有什么用户输入的东西,他们会自动得到正确的结果。

即使他们知道密码,现在也将以管理员身份登录为管理员。那个'不太好。

这可能会很快就摆脱困境。希望您可以开始想象其他方式,如果您的代码易于SQL注入,这可能是危险的。

你可能会遇到这个XKCD漫画,关于一个叫做小鲍比表的男孩。如果你没有知道以前的SQL注射,你应该希望开始在这里开始'

英国甚至有一个(完全合法的)公司,SQL注射为他们的名字。公司网站ISN' T易受SQL注射的影响,所以这一切都完全正常。

这里的关键外卖是您永远不应让您的用户直接修改正在执行的SQL。用户应该仅提供价值,而不允许更改查询的结构。如果您需要基于用户选择的某些值执行不同的查询,那么它们应该是代码中的两个不同的查询。

现在我们看到了一个荒谬和自筹的例子,让'看看一些更现实的东西。这里'典型的查询您可能会看到,它根据其ID查找一个人' s名称。这是一个漂亮的标准模式你' ll在很多代码库中看到。

在正常条件下,您'重新提供ID号,您' ll获取用户'返回名称。这是它的旨在使用的方式。但是,如果它' s易受SQL注射的,那里有很多信息你可以走出来......

如果我们使用通配符%而不是ID号?现在我们' ll能够从用户表中看到每个人和#39;这样的东西可以允许攻击者窃取您的用户的全部列表。但它'不是太糟糕了吗?他们只能获得名称,没有什么超级重要的密码......

不幸的是,一旦你有一个SQL注射的一个例子,它就会'非常多的游戏,你可以抓住你想要的任何数据。在这里,我们可以使用工会窃取每个用户的用户名和密码。但它'不是太糟糕了吗?您可以在文件系统或任何内容上访问文件

就像我说的那样,一旦你有一个SQL注射点,它就会比赛。您可以使用Load_file来从文件系统中加载文件。

它值得注意的是,这是可能的,这将取决于操作系统的权限和任何额外的安全性,但它至少是可行的。

到目前为止,此示例需要输出直接向用户呈现,以便有用。但即使是那个'不是这种情况,你还可以提取信息,它只需要更长的时间。在那里' S一种技术称为"盲注和#34;这可以实现这一点。有两种主要类型......

第一个是布尔值,在那里您可以告诉数据库抛出错误,这取决于某个值是否为真或假。它' ll需要一段时间,但很容易脚本以提取数据。

另一个是时间为基础,在那里可以使用相同的技术,但是添加延时和使用它来提取真假值。一旦您有一个SQL注入,攻击者就可以在泄露数据的方式非常偷偷。

那么我们如何开始防止SQL注入?有些人喜欢尝试和添加检查,该检查将停止声明是否具有" bad"孤立在一起的话。不幸的是,这是'去上班。您不仅需要维护这样的黑名单,并小心地使其不区分大小写等。但是在那里'总是会成为周围的方式。

同样,您可能会认为您只能从用户输入中逃脱所有引号,以便停止修改的查询。取决于您的语言'重新使用,这些类型的检查也可以以各种偷偷摸摸的方式绕过。在那里'总是将成为一些奇怪的unicode字符,你认为这被解释为报价,或者像那样的愚蠢。它并不值得投资这些类型的检查。

参数验证怎么样?如果我们只期望一个字段包含整数,我们只能拒绝任何输入' s不是我们预期的。这肯定会为整数字段工作。

如果一个字段仅预期字母数字字符,则您可以重新限制对这些字符。这也可以工作,但是你'重新开始运行,用户真正需要输入其他角色。关于人们的连字符'姓名怎么样?如果您'重新运行一个网站,如堆栈溢出,您需要允许用户在评论中输入实际代码样本?

我们想使用叫做的东西"准备陈述"解决这个问题。这是保护SQL注入的最常见的方法之一。

但他们是什么?嗯,它们基本上是一个SQL模板,其中用户值在运行时替换,可以' t修改查询。在这里有一个额外的奖金,这也可以提高性能,因为您可以高效地反复执行类似的查询。

让&#39看看准备好的陈述工作。第一步是"准备"查询。这是您定义SQL语句看起来的样子的位置,但该值留空,而是定义A"占位符" (还有其他名称也可以在这里使用)。

然后将查询发送到数据库管理系统,在那里编译和优化,但未执行(因为它没有任何值)。

最后一步是我们来执行查询时。我们" bind"占位符到真正的值(或变量),然后告诉DBMS与这些值执行查询。由于DBMS已经编译了查询,因此用户值不能被解释为SQL,因此它们只能用作值。这正是我们想要停止SQL注入的内容。

因为参数值稍后使用不同的协议传输,所以它们不需要正确逃脱。假设原始语句模板不是从外部输入导出的,不能发生SQL注入。

我们还从使用此方法获得一些优化优势,因为它在DB上编译一次并使用不同的数据执行多次。

SQL注入是存在的常见漏洞之一,如果已被剥削,它可能是毁灭性的。有很多细微差别,我可以谈论许多细微差别。但由于我们整天都有,这里有一些额外的阅读链接,如果你'遗嘱感兴趣地了解有关SQL注射的更多信息以及如何利用它。作弊板材特别开启。

在第一个SQL注入示例中,我显示了将密码传递给明文中的SQL查询。那明显是存储密码的非常糟糕的方式。我还讨论了如何在以前的培训中破解密码。所以什么' s存储密码的正确方法?

哈希将占据价值,并为您提供一些看似随机的Gibberish作为输出。鉴于相同的输入,它将始终为您提供相同的输出。

它们基本上是单向数学函数。这个想法是它&#39非常容易占用一个值,并获得一个可重复的哈希。但它很难拥有哈希并将其反转回到密码中很难。

想象一下,试图乘以两个大型素数,乘法很容易,那将是' t花太长。但是如果你有最后的号码怎么办,你必须发现哪两个素数乘以它来获得它?那个'我要更难做到。那个''在这里发生了什么。

所以一旦你有一个哈希值,你基本上可以' t回到密码,除非你已经有哈希返回密码的映射。

这就是彩虹桌子是什么。预先计算的哈希列表回到原始值。它允许您快速反转哈希。您可以为所有使用的常见散列算法获取彩虹表。我在最后一次训练中使用了SHA-1。

我在以前的训练中说,那里的东西叫做了" salting"这可以防止这种类型的攻击。那么这个" salting"东西?

盐是一些随机数据,'在它之前附加到密码' s哈希,'每次不同。这意味着不应该重复使用盐,并且对于您网站上的每个用户都应该是相同的(I' LL在一瞬间讨论这个问题)。

它'每次创建或更改密码时,盐都很重要。为什么?

让'看看它是如何工作的典型例子。我会拍摄用户' s密码,将随机数据追加到它(' s盐),并以同样的方式哈希,您可以追随密码。

当你有两个拥有相同密码的用户时,这真的出现了。由于盐每次都会有所不同,这意味着两个具有相同密码的用户现在将在其末尾获得完全不同的哈希结果。

在我们的数据库中,我们将储存盐,以及由此产生的哈希。我们存储盐,以便我们仍然可以验证用户输入了正确的密码。那么为什么要打扰盐?如果攻击者可以访问它,这是如何帮助我们的?

嗯,这个数据库中的每个用户都有完全相同的密码。但由于盐,所得到的哈希对每个人都不同。这意味着您无法再使用彩虹表来破解这些密码,因为您' D必须为每个用户制作自定义彩虹表(此时您可能只是蛮力的东西)。

借助使用盐,我们现在做了彩虹桌攻击完全没用。这就是为什么盐必须与每一个密码不同的原因,否则它会击败这一点。

你会注意到盐在我展示的数据库中以明文在明文中,这就像应该一样。盐不是秘密,不应该被视为。他们在那里制作彩虹桌攻击不可行,更多。请记住,我们在这里做的是什么并没有加密,盐不是一个密钥或类似的东西。

还有另一个数据也可用于使密码存储更强。这被称为A"辣椒"或者我有时被看见它被称为A"网站宽盐"辣椒是一块随机数据,'附加到每个密码的随机数据,但类似于盐的方式,但是差异是Pepper对每个人和ISN' t存储在数据库中的同样。 Pepper被视为秘密,并保存在磁盘上,或者作为您碰巧使用的任何秘密存储解决方案的一部分。

为什么辣椒有用? 好吧,为了能够尝试和蛮力任何被盗的哈希,你不仅需要数据库(有盐),还需要胡椒。 如果您通过SQL注入窃取了数据库,它可能不太可能(但不是不可能),您也可以窃取存储在磁盘上的辣椒。 它可以使攻击者更加困难,但它也可以让您对您更加困难。 例如,旋转受损的胡椒可能是一个艰难的挑战,一般来说你必须 ......