麻省理工学院的课程“计算机系统安全”。 讲座9:“ Web应用程序安全性”,第2部分

麻省理工学院。 讲座课程#6.858。 “计算机系统的安全性。” Nikolai Zeldovich,James Mickens。 2014年


计算机系统安全是一门有关开发和实施安全计算机系统的课程。 讲座涵盖了威胁模型,危害安全性的攻击以及基于最新科学研究的安全技术。 主题包括操作系统(OS)安全性,功能,信息流管理,语言安全性,网络协议,硬件安全性和Web应用程序安全性。

第1课:“简介:威胁模型” 第1 部分 / 第2 部分 / 第3部分
第2课:“控制黑客攻击”, 第1 部分 / 第2 部分 / 第3部分
第3讲:“缓冲区溢出:漏洞利用和保护” 第1 部分 / 第2 部分 / 第3部分
讲座4:“特权分离”, 第1 部分 / 第2 部分 / 第3部分
讲座5:“安全系统从何而来?” 第1 部分 / 第2部分
讲座6:“机会” 第1 部分 / 第2 部分 / 第3部分
讲座7:“本地客户端沙箱” 第1 部分 / 第2 部分 / 第3部分
讲座8:“网络安全模型” 第1 部分 / 第2 部分 / 第3部分
讲座9:“ Web应用程序安全性” 第1 部分 / 第2 部分 / 第3部分

例如,Django将使用这些尖括号,将它们转换为HTML格式,然后重做其余字符。 也就是说,如果自定义名称值包含尖括号,双引号等,则将排除所有这些字符。 这将使内容不会在客户端浏览器端解释为HTML代码。



因此,现在我们知道,对于某些跨站点脚本攻击,这并不是一个非常可靠的防御措施。 如我们在示例中所示,其原因是这些HTML,CSS和JavaScript语法非常复杂,以至于很容易混淆浏览器解析器。

例如,我们在Django框架内完成了一件非常普通的事情。 因此,您有一些div函数,我们想为其设置一个动态类。 我们为该类赋予var的值,依此类推。 这个想法是,当Django处理此样式时,他需要弄清楚当前样式是什么,然后将其粘贴到此处。

在这种情况下,攻击者可以创建一个定义此类的字符串,例如,写入“ class 1”。 至此一切顺利,因为它似乎是一个有效的CSS表达式。

但是随后,攻击者将onclick运算符放在此处,该运算符等于进行系统调用的JavaScript代码。



由于这是错误的,因此浏览器应仅在此处停止。 但是问题是,如果您曾经看过真实网页的HTML,那么即使对于合法的“友好”网站,一切都将变得混乱和混乱。 因此,如果浏览器在每个错误的HTML表达式之前停止运行,那么您喜欢的单个站点将永远无法正常工作。 如果您想让世界感到失望,而我又没有提供足够的帮助,请在查看该网站时打开浏览器中的JavaScript控制台,以查看会给您带来多少错误。

例如,您可以转到CNN,然后看看有多少错误。 是的,CNN基本上可以运行,但效果不平衡。 例如,要打开Acrobat Reader,您经常需要引发空指针异常,同时,您会被生活蒙蔽。 但是在互联网上,我们已经学会了接受这一点而没有太多的愤慨。
因此,由于浏览器应该非常容忍这种情况,因此它们将尝试将恶意代码转换为对他们而言似乎合理的东西。 那就是安全漏洞。

这就是内容消毒的工作方式,但总比没有好。 她可以抓到很多有害的东西,但不能保护自己免受一切伤害。

还有另一件事要考虑-使用表达较少的标记语言。 让我们看看这是什么意思。

受众:如果无法进行内容清理,该怎么办?

教授:是的,这是可能的,例如,在这种情况下,Django将无法静态确定其是否有害。 例如,在这种特定情况下。 但是在我插入恶意图片标签的情况下...

听众:在这种情况下,我希望班级的作业用引号引起来,在这种情况下应该没有任何效果...

教授:嗯,你知道,有一些小技巧。 假设对HTML和CSS的语法进行了仔细的定义,您可以想象一个理想的解析器可以以某种方式捕获这些问题或以某种方式将其转换为正常事物的世界。 但是实际上,HTML语法和CSS语法存在不准确之处。 另外,浏览器没有实现规范。 因此,如果您使用较少表现力的语法,则对我们的内容进行清理将更加容易。

这里使用术语Markdown-“易于阅读的标记”,而不是术语Markup-普通标记。 Markdown的主要思想是将其设计为一种语言,例如,它允许用户发表评论,但不包含使用空标签,applet支持等功能。 因此,在Markdown中,唯一地识别语法然后应用它实际上要容易得多。



使用简单的语言进行消毒比使用成熟的HTML,CSS和JavaScript容易得多。 在某种程度上,这就像理解C代码和Python代码之间的区别。 理解更具表现力的语言确实有很大的不同。 因此,通过限制表示性,通常可以提高安全性。

为了防止跨站点脚本攻击,还使用了CSP(内容安全策略)。 CSP的想法是它允许Web服务器...
受众:我只是想了解有关Markdown语言的信息。 所有浏览器都能执行语言解析吗?

教授:不,不,不。 您可以简单地将各种类型的语言转换为HTML,但浏览器无法以其原始形式理解它们。 换句话说,您有一个评论系统,它使用Markdown。 也就是说,注释在显示在页面上之前,先进入Markdown编译器,后者将它们转换为HTML格式。

观众:为什么不总是使用Markdown?

教授: Markdown允许您使用嵌入式HTML,据我所知,有一种方法可以在编译器中将其禁用。 但是我对此可能是错的。 事实是,并非总是可以使用有限的语言,并不是每个人都愿意这样做。

因此,让我们继续讨论如何借助内容安全策略来提高安全性。 通过此策略,服务器可以告诉Web浏览器可以在其发回的页面上加载哪些类型的内容,以及该内容的来源。

例如,在HTTP响应中,服务器可能使用类似以下内容:它包含Content-Security-Policy标头,默认源是self,它将从* .mydomain.com接收数据。



对于操作员,服务器指示该站点中的内容仅应来自特定页面的域或mydomain.com的任何子域。 这意味着,如果我们具有对foo.com的自我绑定,则服务器会将此页面发送回浏览器。

假设跨站点脚本攻击试图创建一个指向bar.com的链接。 在这种情况下,浏览器将看到bar.com不是自身,也不是mydomain.com的域,因此不会进一步跳过此请求。 这是一种非常强大的机制,您可以在其中指定更详细的控件。 您设置参数以指示您的图像应来自此类来源,脚本应来自此类来源等等。 实际上很方便。

另外,此策略实际上阻止了嵌入式JavaScript,因此您无法打开标签,编写某种脚本并关闭标签,因为可以进入浏览器的所有内容都应仅来自有条件的来源。 CSP防止使用eval()函数的参数之类的危险事物,该函数允许网页执行动态生成的JavaScript代码。 因此,如果设置了CSP标头,则浏览器将不会执行eval()。

受众:是所有CSP保护的对象吗?

教授:不。 它实际上保护着完整的资源列表,您可以配置针对许多不需要的东西的保护,例如,指定允许在何处接受传出CSS以及许多其他东西。

受众:但是,除了eval()之外,还有其他威胁安全的因素吗?

教授:是的,它们存在。 因此,总是出现保护完整性的问题。 因此,例如,不仅eval可以动态生成JavaScript代码。 还有一个函数的构造函数,有一些方法可以调用给定的超时,您可以直接进行代码行分析,从而可以分析代码。 CSP可以禁用所有这些危险的攻击媒介。 但这并不是完全隔离恶意攻击的灵丹妙药。

受众:是否可以配置CSP以防止在页面上检查所有内部脚本?

教授:是的,它有助于防止执行动态生成的代码,而嵌入式代码应被忽略。 浏览器应始终从source属性获取代码。 实际上,我不知道是否所有浏览器都这样做。 个人经验表明,浏览器表现出不同的行为。

通常,Internet安全类似于自然科学,因此人们只是提出了有关浏览器工作原理的理论。 然后,您将了解实际情况。 实际情况可能令人失望,因为我们被告知存在算法,证据等。 但是这些浏览器的行为是如此糟糕,以至于其工作结果是无法预测的。

浏览器开发人员试图比攻击者领先一步,在本课程中,您将进一步看到此示例。 实际上,CSP是一件很酷的事情。

另一个有用的事情是服务器可以设置一个名为X-Content-Type-Options的HTTP标头,其值为nosniff。



此标头可防止MIME丢弃广告内容类型的响应,因为标头告诉浏览器不要覆盖响应内容类型。 使用nosniff选项,如果服务器说内容为text / html,则浏览器会将其显示为text / html。
简而言之,此标头可防止浏览器“嗅探”所声明内容类型的响应,以免浏览器说“是的,我嗅探文件扩展名和实际内容之间的不匹配,因此不会出现这种情况”我有事。” 原来,您突然将野蛮人的钥匙交给了王国。

因此,通过设置此标头,可以告诉浏览器不要执行任何此类操作。 这可以大大减轻某些类型的攻击的影响。 这是跨站点脚本攻击的一些漏洞的简要概述。

现在,让我们看一下另一个流行的攻击媒介-SQL。 您可能听说过称为“ SQL注入”或SQL注入攻击的攻击。 这些攻击的实质是使用网站数据库。 为了动态构建显示给用户的页面,将发出数据库查询,该查询将发布到此内部服务器。 假设您有一个请求,要从一个特定的表中选择所有值,其中“用户ID”字段等于Internet上从潜在不可靠来源确定的值。



我们都知道这个故事将如何结束-它将非常糟糕地结束,将没有幸存者。 因为来自未经验证的来源会带来很多麻烦。 另外,您可以给用户ID字符串以下值:用户ID =“ 0; 删除表“。

那么这里会发生什么呢? 基本上,服务器数据库将说:“确定,我将用户ID设置为零,然后执行“删除表”命令。 就是这样,您完成了!

他们说,几年前出现了某种病毒形象。 德国有些人在汽车上安装了车牌,上面写着0; 删除表。 当时的想法是公路摄像机使用OCR识别您的电话号码,然后将该电话号码输入数据库。 总的来说,大众汽车公司决定通过在其号码上放置恶意代码来利用此漏洞。

我不知道这是否有效,因为听起来很有趣。 但是我想相信这是真的。 因此,我再次重复-消毒的想法是防止执行您站点上不受信任来源的内容。



因此,请注意以下事实:可能有些简单的事情无法正常工作。 因此,您可能会想:“好吧,为什么我不能只在行的开头加上另一个引号,而在行的末尾再加上一个引号,以排除攻击者的恶意代码在三重引号之间的执行”?

用户ID ='“ +用户ID +'”

但这是行不通的,因为攻击者总是可以简单地将引号放在攻击字符串中。 因此,在大多数情况下,此类“半黑客”不会为您带来预期的安全性。

这里的解决方案是您需要仔细加密数据。 再说一遍,当您从不可靠的来源收到信息时,请不要以其形式将其插入系统。 如果将其放在沙箱中进行恶意利用,请确保它不会跳出沙箱。

例如,您要插入转义函数以防止使用原始逗号运算符。 为此,许多Web框架(例如Django)都具有内置库,可让您避免使用SQL查询来防止此类情况的发生。 这些框架鼓励开发人员永远不要直接与数据库进行交互。 例如,Django本身提供了一个高级界面,可以对您进行消毒。

但是人们总是关心性能,有时人们认为这些Web框架太慢了。 因此,您很快就会看到,人们仍然会进行原始SQL查询,这可能会导致问题。

如果Web服务器接受来自不受信任图像的路径名,则可能会出现问题。 想象一下,您在服务器上的某处正在执行类似的操作:使用“ www / images /” + filename打开,其中filename用... / ... / ... / ... /表示。等/密码。



也就是说,您给出命令以从不受信任的用户文件在此地址打开图像,这实际上可能严重伤害您。 因此,如果要使用Web服务器或Web框架,则应该能够检测到这些危险字符并避免使用这些危险字符,以防止执行这些未处理的命令。

让我们在讨论内容消毒时稍作休息,然后再谈谈Cookie。 Cookies是一种非常流行的会话管理方法,可以将用户绑定到服务器端存在的一组特定资源。 您稍后会遇到的许多框架(例如Django或Zoobar)实际上在cookie中放置了一个随机会话标识符。 这个想法是该会话ID是某种服务器端表中的索引:

表[会话ID] =用户信息。

即,会话标识符等于某些用户信息。 因此,此会话ID和cookie在其扩展名中是非常敏感的部分。 许多攻击包括盗窃Cookie以获得该会话ID。 正如我们在上一讲中所讨论的那样,相同来源的相同策略可以在某种程度上帮助您抵御某些Cookie盗窃攻击。 因为存在基于同一原始策略的规则,可防止对Cookie进行任意修改。

妙处在于,您不应与不信任的人共享域或子域。 因为,正如我们在上一讲中所说的,有一些规则允许相同来源的两个域或子域访问彼此的cookie。 因此,如果您信任一个不应该信任的域,则该域可能能够直接在这些cookie中设置会话标识符,而这两个cookie都可以访问。 这将允许攻击者强迫用户使用攻击者选择的会话标识符。



假设攻击者设置了一个Gmail用户cookie。 用户登录Gmail并输入几个字母。 然后,攻击者可以使用此cookie,尤其是使用此会话标识符,下载Gmail,然后像对待受害者用户一样访问Gmail。 因此,您可以使用这些Cookie进行许多微妙的操作来管理会话。 今天和以后的讲座中,我们将讨论其中的一些。

也许您认为您可以摆脱饼干? 毕竟,它们带来的问题多于收益。 为什么不能将它们丢弃?

stateless cookie, « », - , , , .

, , , . , . , , . , , , , .

— MA — Message Authentication Codes, . , . HCK - m. , , K. , , . , , .



, . , stateless cookie, Amazon, , x3. - Amazon, AWS, . – K, – AWS, .



, AWS HTTP, .

, , , :

GET /photos/ cat; .jpg HTTP/1.1, - AWS:

HOST: — - — - — , , :

DATE: Mon, June 4, , , . , ID , , , .



? , 3- .

, String To Sign :

— HTTP, GET;
— MDS;
— , html jpg;
— ;
— , , .



, , HCK MAC. , . , . , . ?

, , , - . Amazon , stateless cookie, MD5 .

, , , cookie, . – , , .

, . , , “HCK, m”.



. GET /photos/ cat; .jpg HTTP/1.1 , , . , , . , ? : «, , , ».

56:15

麻省理工学院的课程“计算机系统安全”。 9: « Web-», 3


该课程的完整版本可在此处获得

感谢您与我们在一起。 你喜欢我们的文章吗? 想看更多有趣的资料吗? 通过下订单或将其推荐给您的朋友来支持我们, 为我们为您发明的入门级服务器的独特模拟,为Habr用户提供30%的折扣: 关于VPS(KVM)E5-2650 v4(6核)的全部真相10GB DDR4 240GB SSD 1Gbps从$ 20还是如何划分服务器? (RAID1和RAID10提供选件,最多24个内核和最大40GB DDR4)。

VPS(KVM)E5-2650 v4(6核)10GB DDR4 240GB SSD 1Gbps至12月免费,在六个月内付款时,您可以在此处订购。

戴尔R730xd便宜2倍?在荷兰和美国,我们有2台Intel Dodeca-Core Xeon E5-2650v4 128GB DDR4 6x480GB SSD 1Gbps 100电视(249美元起) 阅读有关如何构建基础架构大厦的信息。 使用价格为9000欧元的Dell R730xd E5-2650 v4服务器的上等课程?

Source: https://habr.com/ru/post/zh-CN424295/


All Articles