原文地址:Advanced web security topics
前言
(最后更新时间:2018年2月28日)这篇文章讨论了我到目前为止遇到的网络安全问题 。这是一项正在进行的工作,我将不断更新。 帖子标题包括“高级”,因为这里讨论的主题涉及聪明的,不平凡的黑客。下面我们直接进入正题。
在图像中使用错误的MIME类型来提供HTML
摘要:攻击者将图像上传到包含HTML和Javascript的受信任网站,但欺骗网站将图像作为HTML文档提供。
攻击步骤(参考下图):
- 攻击者使用嵌入式html 创建图像
- 攻击者上传图像到网站,图像会被接受。因为语法是有效的。
- 攻击者欺骗网站用户去访问图像,并且欺骗网站以html的形式提供图像。
第一个是来自 An XSS on Facebook via PNGs & Wonky Content Types[1],它使浏览器执行嵌入图像的HTML代码。此攻击会将包含HTML字符串的图像上载为用户提供的内容,并使用与受感染网站位于同一域中的HTML MIME类型进行投放。此漏洞绕过了许多服务器端代码注入检查,因为没有人检查图像中的代码。这里被利用的弱点是,通过将正确的后缀附加到URL文件名,可以欺骗网站以HTML MIME类型提供用户提供的图像。
真正精彩的部分是 construction of a valid PNG image[2]。浏览器在解析HTML时非常宽松 - 它们只会显示他们不理解为文本的所有内容并解释其余内容,因此带有嵌入式HTML的(除此以外)二进制PNG将在HTML旁边呈现大量垃圾。该HTML可以包含有效的Javascript,浏览器将使用当前登录用户的域cookie和凭据执行该Javascript。
使用用户提供的CSS窃取机密
摘要:使用CSS3功能的组合将信息泄漏到第三方服务器。 需要用户提供的CSS样式但不需要Javascript。
攻击步骤(参考下图):
- 在当前网页上查找敏感内容,如:
- 将唯一字体应用于不同的字符
- 调整父容器的大小,直到出现滚动条
- 为每个尺寸使用从攻击者服务器上的不同的字体
来自 Scriptless attacks[3]的这种攻击非常值得注意,因为它可以从DOM中窃取隐藏信息,例如来自href链接或隐藏输入字段的标记,而无需任何Javascript。它要求用户可以将CSS注入网站 - 这是博客软件的一个共同特征。**简而言之:它使隐藏信息在屏幕上可见,然后将各种字体应用于该信息。**使用CSS动画探测新渲染的元素的尺寸,该动画通过包含文本尺寸作为URL参数的HTTP请求(例如,字体或图像)将尺寸泄漏到服务器。服务器可以读取该参数并从数值推断原始文本。细节:
0)攻击者必须能够以某种方式将CSS注入受感染的网站(例如用户风格的博客或论坛)。
1)使用高级CSS3选择器和
:: before
或
:: after
伪元素在DOM中创建隐藏信息(例如链接参数,隐藏输入字段)。这将呈现通常不可见的字符串。有关详细信息,我建议阅读参考文献[4],[5]。此步骤可能会多次复制要泄漏的文本,因为它需要使用不同的字体进行渲染(请参阅步骤2了解原因)。
2)从您控制的服务器引用外部CSS字体文件。作者称之为“字典攻击”。字符的宽度在这里起着重要作用,因为步骤(1)中的字符组合将导致所呈现内容的唯一大小。免责声明:我不相信这一步会产生一个唯一的数字(例如,它如何将AB与BA区分开来?),但我可以想象步骤(1)的多次迭代以及每一步的不同字体可能会大大减少搜索空间。我还怀疑步骤(1)在具有不同字体的相同文本上执行多次。
3)使用DOM元素包围敏感信息,触发滚动条并使用CSS“ smart scroll bars”[13]功能:在滚动条出现时应用一些CSS。这可能是渲染图像内容或另一个触发对服务器的请求的字体文件。请注意,对于每个尺寸,可以请求不同的URL。
4)应用CSS动画,从(3)中调整容器元素的大小。当容器上出现滚动条时,会应用新的CSS规则,从我们控制的服务器加载(不存在的)字体文件。每个容器大小有一个这样的规则,每个容器大小有一个唯一的URL,因此大小有效地泄露给我们的服务器。从泄漏的大小我们可以推断出容器的内容。
通过欺骗浏览器将私有页面加载为CSS来窃取网页内容
摘要:一个邪恶的网站通过欺骗浏览器将可信网页加载为CSS来窃取用户登录的可信网页中的内容。要求攻击者可以向受信任的网站注入一些文本。
这个有点旧,因为宽松的CSS 解析 [6]以及允许Javascript查看CSS声明这一事实。我不确定这是什么程度的反击浏览器,我在互联网上阅读有关这方面的相互矛盾的陈述。该漏洞需要:
1)受害者Victor
2)Victor登录的网站Webmail,其中包含一些私人内容。只要用户通过会话cookie进行身份验证并登录到Webmail,就不必在选项卡或窗口中打开Webmail。
3)攻击者控制的网站example.com
4)Victor访问example.com
5)攻击者必须能够将一些文本注入Webmail(例如,通过向Victor发送一些他可以在他的Webmail中阅读的电子邮件)
该漏洞利用如下:
1)Victor访问我们的恶意网站example.com
2)example.com包含一个链接HTML元素,它试图加载外部CSS样式表。只是,它不是引用有效的样式表,而是在Webmail上引用Victor的收件箱页面。这将导致浏览器将论坛HTML加载为CSS并解析它。到目前为止伤害不大。
3)攻击者能够在Webmail中注入一些文本,在一些敏感文本之前启动CSS声明,并在敏感文本之后结束CSS声明。一个例子是,如果我们早日向Victor发送一条消息,主题为:};。emailList {以及稍后与主题的消息};。现在,我们发送的第一封和第二封电子邮件之间的收件箱概述中的所有内容都可以解释为CSS声明。
4)当步骤(2)加载CSS时,由于CSS解析器的宽大,浏览器仍然能够将整个收件箱解释为CSS,这将导致(至少)声明.emailList类。
5)由于攻击者控制example.com,他可以在那里放置Javascript,读取.emailList类的 cssText [8]属性并将其发送到他的服务器。
我记得读过这个多年来不断涌现的漏洞,但我找不到任何说明性的参考资料了。 这些文章显示了攻击者如何能够通过向他发送两封包含其主题中的CSS声明的电子邮件来阅读受害者的网络邮件收件箱。 一旦攻击者将其受害者引诱到他们的恶意网站,攻击者就能够将受害者的收件箱读作CSS声明。
Angular 注入
摘要:在服务器上呈现不好的用户输入的不良内容导致在浏览器中的Angular应用程序中执行代码
注入攻击涉及恶意用户提交未正确清理的数据,然后由系统的不同部分解释。有HTML注入攻击,SQL注入攻击和Javascript注入攻击。一个相当新的风格针对浏览器模板框架,如AngularJS [9]。
步骤:
1)恶意用户提交Angular将解释的一些文本T,例如{{警报(“你好”)}}
2)服务器在包含Angular代码的页面上将T呈现为HTML。由于没有像T中那样的HTML / Javascript标签,因此大多数服务器端都不会清理对象T.
3)浏览器呈现包含T的新HTML页面。如果页面运行Angular,则它将获取T并将其解释为Javascript。
Gareth Heyes详细讨论了 Angular 注入 [7]。
如果您想知道为什么任何理智的Web应用程序将执行用户提交的内容的服务器端呈现(步骤2):针对功能减少的客户端的SEO或回退策略是常见的用例。
HTTP 注入
这种类型的攻击也称为HTTP协议嵌套或 HTTP request smuggling [10]利用了参与设备的HTTP协议实现中的弱点。
该论文的作者讨论了针对同名服务器软件的几个真实示例,这些示例导致了诸如cache poisoning[11]或凭证劫持等漏洞。这些漏洞主要涉及一系列服务器软件,如反向HTTP代理和Web服务器。一个例子:
缓存中毒:恶意客户端将嵌套请求发送到反向Web代理,后面有Web服务器。代理以其认为请求URL U1的方式解析错误请求,而Web服务器以不同的方式解析请求以及请求URL U2的内容。然后,Web服务器返回U2的内容,但代理将该内容存储在URL U1下。因此,对U1的任何进一步合法请求将服务于U2的内容。该漏洞利用工作过于简单,如下所示:
POST U1
Content-Length: 0
Content-Length: 123
GET U2
….
由于Content-Length语句存在冲突,Web代理可能会认为POST内容与其后面的Web服务器不同,因此Web服务器可能会为U2服务,但代理可能会将U2的内容存储在U1下。
作者讨论了更多的漏洞;无论如何都值得一读!
找出用户访问过的网站
恶意网页可以在旧版本的流行浏览器中找到用户访问过的网站,幸运的是,这似乎 不在可能[12]。 “漏洞利用”简单而有效:恶意网页生成一个感兴趣的链接列表。如果用户访问过去的任何一个,浏览器将以不同的方式呈现它们。 网页可以通过脚本查询该样式并将结果发送出去。 浏览器填充了这个漏洞,其中包含向脚本报告伪值和限制样式量的组合(例如,您无法更改访问链接的任何维度,因此查询容器大小将不起作用)。
[2016年4月16日]
滥用URL索引来扫描私有数据
从这里[13]:假设一个网站在一个不可思议的网址下公开了一些内容,例如: 通过包含像Google+这样的UUID,可以通过私人链接分享私人内容,例如example.com/sdflo234ngnofgo23onigu。 只有知道该URL的人才能访问该页面,该访问应该是安全的,因为“sdflo234ngnofgo23onigu”非常难以猜测。 攻击者无法检查导致example.com的URL的所有可能的字符组合,并且有一种理解和暗示没有人会在网络上发布该URL,否则它将被搜索引擎索引并且可能是 发现那里。
但是,如果您通过URL缩短器传递URL,搜索空间将大大减少:example.com/sdflo234ngnofgo23onigu将成为ex.co/BlD33_。 攻击者可以轻松扫描缩短服务上的少得多的URL,并发现提交给该缩短器的(私有)URL。
允许客户端选择协议
我无法想出一个更简洁地描述问题的更好的标题:服务器以保证其神圣性的方式发送编码/保护/签名的数据,但允许客户端将所述数据发送回服务器或其他服务器具有不同的,不太安全的协议。
这个想法来自最近在多个JSON Web令牌实现中发现的 安全漏洞 [14]。 JSON Web令牌实现了验证数据真实性和完整性的数字签名,因此当客户端从服务A获取数据并将其传递给服务B时,该服务B可以基于JSON Web令牌验证数据的完整性,而无需直接通信服务A.在此漏洞中,客户端可以请求协议实现,绕过每个设计的验证。这里学到的经验是:参与通信的各方将安全方面委派给底层实现应该验证实现是否有效。
不经验证安全假设的问题经常出现,例如:在2014年,CERT发现有几个Android应用程序没有验证服务器证书[15]。
[2016年8月31日]
具有target = _blank链接的网络钓鱼
您知道带有target =“_ blank”的HTML锚链接会在新选项卡或窗口中打开链接页面。 但你知道window.opener [17] Javascript属性吗? 新窗口可以通过该属性访问旧窗口; 值得庆幸的是,window.opener的大多数(子)属性都不能被新窗口读取,但可以更改window.opener.location属性,这使得它可以用于网络钓鱼攻击:您点击了网络邮件程序中的链接,它会打开 一个新页面,在后台只是重定向了一个窗口,该窗口将webmailer打开到类似域上相同的登录页面,告诉您会话已过期并要求您再次登录。 讨论了创始人博客[16]。 在支持的情况下,解决方案是添加rel =“noopener”标记或根本不使用目标。
[2016年10月24日]
用Rowhammer.js打破沙箱
Rowhammer [18]攻击在硬件级别利用当前DRAM实现中的弱点,其中特殊构造的写入模式可能干扰不相关的存储器位置的内容。 Rowhammer.js [19],一个Javascript实现,最近浮出水面(不是这样),它将Rowhammer移植到浏览器中。 虽然我认为Rowhammer是硬件漏洞,但我仍然提到它的新方法。
[2017年9月1日]
网络钓鱼自动填充字段
那个真的让我完全禁用了自动填充功能。 攻击基于浏览器在识别名称/值组合时主动填写表单字段。 演示真的说明了一切。 该漏洞利用如下:
提供了一个HTML表单,要求提供一些基本的详细信息,如姓名和电子邮件地址。 该表格还包含几个隐藏的字段,我将在稍后讨论。 许多网站要求提供此基本信息,并使用名为“name”和“email”或类似名称的表单字段。 当你开始填写这些时,浏览器会建议一个自动完成,当然,你会采取。 但是有一个问题:通过接受建议值,浏览器将填写任何其他隐藏的字段,它可以通过名称记住...并且有很多:“creditcardnumber”,“address”,“phone”等。通过提交表单,你 不仅要提交您输入的姓名和电子邮件,还要提供其可以匹配的所有其他字段。
[2018年2月28日]
使用XML注释偷偷过去验证
一个相当具体的SAML漏洞利用[21]可以推广到XML解析。 基本思想是XML被用作数据容器格式,但解析XML并处理数据的程序通常不了解XML格式的细微之处,这可能导致模糊。 焦点攻击会影响XML注释的模糊性:
<name>John<!--comment-->Doe</name>
复制代码
从概念上讲,“name”元素的文本值是什么? 从w3c的角度来看,“name”元素有三个子元素:一个值为“John”的文本节点,一个值为“comment”的注释节点和另一个值为“Doe”的文本节点。
许多编程语言的SDK和框架为获取XML节点文本值提供了便利功能。 根据其实现,可能返回值“John Doe”,“John Doe”,“John”或“Doe”。 大多数程序可能会使用这样的便利功能,但是现代系统由几个数据处理层(HTTP,WAF,验证框架,Web应用程序框架)组成,每个这样的层可能使用不同的“便利”实现。 这次攻击让我想起了我们之前看到的一些“HTTP注入”。
点击劫持社交媒体登录小部件
| [更新2018.05.10] Google YOLO 漏洞利用[22]属于对用户社交网络帐户的广泛类型的点击劫持攻击。 您可能知道“使用Facebook登录”功能,该功能允许网站通过其社交网络帐户识别用户。 前提是用户验证浏览器地址栏中显示的URL,检查网站请求的访问类型,并可以授予(或不授予)该访问权限。 |
---|---|
这个漏洞:
- 由恶意网页组成
- 将社交网络登录页面嵌入iframe中
- 在iframe上放置另一个HTML元素,将其隐藏起来OR
- 将登录iframe放在网页上但使其不可见
- 使用CSS指针事件和不透明度属性将用于网站的点击指向社交登录按钮
参考文献
[1] An XSS on Facebook via PNGs & Wonky Content Types
fin1te.net/articles/xs…
[2] Encoding web shells in PNG IDAT chunks
www.idontplaydarts.com/2012/06/enc…
[3] Scriptless attacks
www.nds.rub.de/media/emma/…
[4] CSS attribute value selector
www.w3schools.com/cssref/sel_…
[5] CSS content attribute
www.w3schools.com/cssref/pr_g…
[6] CSS data theft
www.owlfolio.org/htmletc/css…
[7] XSS without HTML: Client-Side Template Injection with AngularJS
blog.portswigger.net/2016/01/xss…
[8] cssText Web API MDN
developer.mozilla.org/en-US/docs/…
[9] AngularJS
angularjs.org/
[10] HTTP Request Smuggling
www.cgisecurity.com/lib/HTTP-Re…
[11] Cache poisoning
www.owasp.org/index.php/C…
[12] Privacy and the :visited selector
developer.mozilla.org/en-US/docs/…
[13] Gone In Six Characters: Short URLs Considered Harmful for Cloud Services
freedom-to-tinker.com/blog/vitaly…
[14] Critical vulnerabilities in JSON Web Token libraries
auth0.com/blog/critic…
[15] Cert tests Android apps
securityaffairs.co/wordpress/2…
[16] The target=_blank attack
medium.com/@jitbit/tar…
[17] window.opener
developer.mozilla.org/en/docs/Web…
[18] Rowhammer
googleprojectzero.blogspot.de/2015/03/exp…
[19] Rowhammer.js
arxiv.org/abs/1507.06…
[20] Browser autofill phishing
github.com/anttiviljam…
[21] A breakdown of the new SAML authentication bypass vulnerability
developer.okta.com/blog/2018/0…
[22] Google YOLO
blog.innerht.ml/google-yolo…