路由到端点。这意味着反向代理在一个路径()上接收请求,但将请求转发到后端的一个完全不同的请求()。或者,它根据主机标头值将请求转发到特定的后端。

最初,我想分析反向代理和Web服务器如何解析请求,找出它们之间的过程不一致,并将这些知识用于某种绕过。不幸的是,由于太多的变化,我被困在分析Web服务器和应用程序服务器上。例如,Apache Web服务器的行为会有所不同,具体取决于将其与PHP连接的方式。同样,Web应用程序,Web应用程序使用的框架或中间件的实现也可能影响请求解析过程。最后,我意识到有些攻击仍然鲜为人知或完全未知。

emt发行-技术发行商,端点安全,SIEM,WAF,防火墙,虚拟化,用于MSSP的SIEM,云解决方案,MSP,补丁管理,漏洞智能,Web漏洞扫描程序,BlackStratus,学院,卡巴斯基实验室,Avira,ESET,AlienVault,Secunia ,Flexera,Parallels,网络监控,Whtasup Gold,IPSWITCH 联系软件漏洞管理 在准备这项研究时,我发现了其他几种类似的研究,包括–

杜塔的

实际上,该研究不仅涉及反向代理,还涉及负载均衡器,缓存代理,WAF和用户与解析和转发请求的Web应用程序之间的其他中间服务器。但是,我找不到合适的术语来正确描述这样的服务器,并且在社区中广为人知,因此即使我谈论负载平衡器或缓存代理,我也将使用“反向代理”。我将反向代理后面的Web应用程序称为后端服务器。请注意,后端服务器就是所谓的原始服务器(当我们开始谈论缓存时,这将很有意义)。

2016年十一月

预计阅读时间

日立安全

让我们考虑一下缓存中毒攻击。攻击依赖于从请求中找到可以显着(从安全性角度来看)影响响应的非键值,但是与此同时,此响应必须由反向代理缓存,因此Cache-Control标头必须是允许的。如果我们将所有内容混合在一起,我们将能够找到更多利用缓存中毒攻击的方法。

当然,采用类似的方法,其他与安全性相关的标头(例如CORS,CSP等)也可能被滥用。

MFT作为业务文件传输的Dropbox替代品

  1. 推特
    When a 2016年十一月 receives a request, it must parse it: to get a verb, a path, a HTTP version, host header 的RSS other headers 的RSS body.GET /path HTTP/1.1 Host: example.com Header: somethingEverything may look quite simple, but if you dive into details, you will see implementations are different.Some examples:
    – If a reverse supports Absolute-URI, how will it parse it? Does Absolute-URI have a higher priority than Host header?:GET http://other_host_header/path HTTP/1.1 Host: example.com– URL consists of `scheme:[//authority]path[?query][#fragment]可以通过API在网络应用中进行访问。 browsers don’t send #fragment杜塔适用 #fragment?
    在路径中),其他一些则将其作为常用符号来处理。–它如何处理必须经过URL编码的符号? # 作为攻击者,我们可以滥用此规则来执行Web缓存欺骗攻击。我们需要做的就是强迫受害用户打开下一个URL(例如,使用img):GET /index.php[0x01].jsp HTTP/1.1
  2. 2018年十月
    Due to standards, symbols with a special meaning in the URL must be URL-encoded (%-encoding), like the double quote (") or “greater than” sign (>). But practically, any symbol can be URL-encoded 的RSS sent in a path part. Many web servers perform URL-decoding while processing a request, so next requests will be treated in the same way by them.GET /index.php HTTP/1.1GET %2f%69%6e%64%65%78%2e%70%68%70 HTTP/1.1
  3. 请求错误处理
    Many web servers support path normalization. Main cases are well-known:/long/../path/here -> /path/here /long/./path/here -> /long/path/hereBut what about /..?对于Apache,相当于  /../, but for 杜塔 it means nothing./long/path/here/.. -> /long/path/ - Apache /long/path/here/.. -> /long/path/here/.. - 杜塔The same with // (“空”目录)。 杜塔将其转换为仅一个斜杠 /, but, if it’s not the first slash, Apache treats it as a directory.//long//path//here -> /long/path/here - 杜塔 //long/path/here -> /long/path/here - Apache /long//path/here -> /long//path/here - Apache这里 are some additional (weird) features which are supported by some web servers. For example: support of path parameters – /..;/ is valid for Tomcat 的RSS Jetty or traversal with backslash (\..\).

MDM(移动设备管理)

,做一件事,如果 pathA–再做一次。 pathB – do another.

关于防止此类攻击的保护措施,我在这里看不到“银弹”(直到我们对如何处理请求/路径有了非常好的标准/规范),但我认为该项目也可以为防御者提供帮助。如果您知道代理及其限制,则可以相应地更改其配置。

/path1/ == /Path1/ == /p%61th1/ == /lala/../path1/

使用PAM保护备份

反向代理处理了一个请求,找到了相应的规则并执行了必要的操作。现在,它必须将其发送(转发)到后端。它会发送已处理的请求还是初始请求?显然,如果它已经修改了请求,那么它将发送修改后的版本,但是在这种情况下,它必须执行所有必要的步骤,例如,执行特殊符号的URL编码。但是,如果反向代理仅将所有请求转发到一个后端怎么办,也许转发初始请求是一个好主意?

假设有Nginx作为反向代理,而Weblogic作为后端服务器。 杜塔阻止访问Weblogic的管理界面(所有以

因此,下面描述的所有攻击的想法是,反向代理处理请求,找到并应用规则并将其转发到后端。如果我们发现反向代理处理请求的方式与后端服务器处理请求的方式不一致,那么我们就可以创建这样的请求(路径),该请求被反向代理解释为一条路径,而路径则完全不同在后端。因此,我们将能够绕过或强制应用反向代理的某些规则。

什么是反向代理?

杜塔

转发所有请求到`backend_server`。它将处理后的请求发送到后端,这意味着Nginx必须对必要的符号进行URL编码。对于攻击者而言,有趣的事情是Nginx不会编码浏览器通常会编码的所有符号。例如,它没有URL编码

反向代理的缓存有几个因素可以帮助我们理解攻击。

  • With trailing slashlocation / { proxy_pass http://backend_server/; }In this configuration, 杜塔 当我从事这项研究时,分析了反向代理的各种配置,我得出的结论是,我们既可以绕过反向代理规则,也可以应用反向代理规则。因此,要了解反向代理相关攻击的真正潜力,我们必须了解它们的能力。  ' " < >.
    即使有一个Web应用程序(后端服务器)从路径中获取参数并且容易受到XSS的攻击,攻击者也无法利用它,因为现代浏览器(带有IE的肮脏技巧除外)对这些符号进行URL编码。但是,如果有Nginx作为反向代理,则攻击者可以强迫用户在路径中发送URL编码的XSS有效负载。 杜塔对其进行解码,并将解码后的版本发送到后端服务器,该服务器利用  possible.Browser -> http://victim.com/path/%3C%22xss_here%22%3E/ -> 杜塔 -> http://backend_server/path/<"xss_here">/ -> WebApp
  • Without trailing slashlocation / { proxy_pass http://backend_server; }The only difference between this config 的RSS the previous one is the lack of the trailing slash. Although seemingly insignificant, it forces 杜塔 to forward an unprocessed request to the backend. So if you send /any_path/../to_%61pp#/path2, after processing of the request, 杜塔 will try to find a rule for `/to_app`, but it will send /any_path/../to_%61pp#/path2 假设我们有Nginx和Tomcat作为后端。 Tomcat默认情况下设置标头``,因此浏览器无法在iframe中打开它。由于某些原因,必须通过iframe可以访问Tomcat上的Web应用程序()的一部分,因此Nginx配置为删除该部分的标头``。但是,没有可能在

评论

评论对请求的处理最少。因此,没有“真正的”解析,URL解码,规范化。它也不支持Absolute-URI。

如前所述,当反向代理根据请求中的Host标头将请求路由到不同的后端时,这是一种常见的情况。

Therefore, it takes everything (with few exceptions) between a verb 的RSS HTTP version (GET !i<@>?lala=#anything HTTP/1.1) 的RSS, after applying rules, forwards it to a backend server. However it supports path-based rules 的RSS allows it to modify requests 的RSS responses.

我们该怎样帮助你?

让我们想象一下情况。有Nuster(基于Haproxy的缓存代理)和网络应用程序。该网络应用程序存在一个自我XSS漏洞(仅在攻击者的帐户中起作用)

当反向代理接收到一个请求时,它必须解析它:获得一个动词,一个路径,一个HTTP版本,主机头以及其他头和主体,一切看起来都非常简单,但是如果您深入研究细节,将会看到实现有所不同,例如:

反向代理的各种实现

  1. Routing to endpoint. It means that a 2016年十一月 receives a request on one path (/app1/), but forwards the request to a completely different one (/any/path/app2/) on a backend. Or it forwards the request to a specific backend depending on a Host header value.
  2. Rewriting path/query. This is similar to the previous one, but usually involves different internal mechanisms (regexp)
  3. 车身改装。反向代理有时也会改变身体。
  4. 第一个示例禁止使用反向代理进行缓存,第二个示例允许。缺少Cache-Control标头通常意味着允许反向代理存储响应。

反向代理如何处理请求?

  1. 处理请求包括几个主要步骤:
  2. 评论是一个负载平衡器(具有HTTP支持)。将其与Nginx进行比较并没有多大意义,但是它将为您提供一种不同方法的想法。
  3. 从某种意义上讲,这只是变种网络缓存欺骗,但不仅如此。 漏洞评估 加密|安全文件传输

如果反向代理具有允许主动缓存的基于路径的规则,则攻击者可以创建属于该规则的路径,但后端服务器会将其解释为完全不同的路径。

Web缓存欺骗

遍布全球!

保护关键基础架构免受高级网络攻击
查看下一个配置。 杜塔在处理``之后将请求转发给

浏览器处理
杜塔抛出片段,Apache返回400错误(由于 /console/).

2020年9月

location /console/ {
deny all;
return 403;
}

location / {
proxy_pass http://weblogic;
}

As you can see, `proxy_pass` 名称 is without trailing slash, which means that a request is forwarded unprocessed. Another important thing to bypass the restriction is that Weblogic treats `#` as a usual symbol. Therefore, an attacker can access the administrative interface of Weblogic by sending such a request:

GET /#/../console/ HTTP/1.1

,因此跳过 #规则。然后,它将相同的未处理路径()转发到Weblogic,Weblogic处理该路径,并且在路径归一化之后,我们就剩下了。 /console/ rule. It then forwards the same unprocessed path (/#/../console/) to the Weblogic, the Weblogic processes the path 的RSS after path normalization, we are left with/console/.

emt事件记忆

当有人限制访问(3.拒绝访问)时,攻击者需要绕过它。
标头修改。在某些情况下,反向代理可能会添加或更改请求的标头。对于攻击者来说,这可能是一个很酷的功能,但是很难通过黑匣子方法加以利用。

媒体包
Let’s have a look at similar combinations: 杜塔+Weblogic. In this case, 杜塔 proxies requests only to a certain endpoint of Weblogic (http://weblogic/to_app). So only requests, which come to a path /to_app on 杜塔, are forwarded to the same path on Weblogic. In this situation, it may look like Weblogic’s administrative interface (console) or other paths are not accessible for an attacker.

location /to_app {
proxy_pass http://weblogic;
}

In order to misroute requests to other paths, we need to know two things again. Firstly, the same as in the example above – `proxy_pass` is without a trailing slash.
DLP(防止数据泄漏)//tools.ietf.org/html/rfc3986#section-3.3和 /path/to/app/here;param1=val1可以通过API在网络应用中进行访问。 param1 我认为许多人都知道此功能(尤其是在

漏洞智能管理 Matrix42 –统一工作区管理 。但是Weblogic对路径参数的处理方式有所不同,因为在处理第一个参数之后,它会处理所有内容 /..;/..;/作为路径参数。这是否意味着此功能对攻击者无用? ; 处理请求后,由于其配置,反向代理可以对请求执行某些操作。重要的是要注意,在许多情况下,反向代理的规则是基于路径(位置)的。如果路径是
另外,IE像往常一样具有一些魔力:使用Location标头重定向时,它不会处理路径。

GET /any_path_on_weblogic;/../to_app HTTP/1.1

它得到 /any_path_on_weblogic;/../to_app it gets /to_app Weblogic在解析过程中会处理所有 /any_path_on_weblogic;/../to_app 作为路径参数,因此Weblogic认为 ; 。如有必要,攻击者可以通过增加攻击量来“更深入” /any_path_on_weblogic杜塔是一个著名的Web服务器,但作为反向代理也非常流行。 杜塔支持带有任意方案的Absolute-URI,并且比Host标头具有更高的优先级。 杜塔解析,URL解码和规范化请求路径。然后,它根据处理的路径应用基于位置的规则。 /../` after `;.

撰写者
重写路径/查询。这类似于上一个,但是通常涉及不同的内部机制()
表示所有以开头的路径 location /to_app (前缀)属于该规则。所以, /to_app (包括特殊符号)位于其下。另外,该prefix()之后的所有内容都将被获取,然后与 /to_app/to_app//to_app_anything (including special symbols) fall under it. Also, everything after this prefix(/to_app) will be taken 的RSS then concatenated with value in proxy_pass.
Look at the next config. 杜塔, after processing `/to_app_anything`, will forward the request to http://server/any_path/_anything

location /to_app {
proxy_pass http://server/any_path/;
}

再次以Nginx + Tomcat为例。下一条规则旨在强制Nginx缓存来自

GET /to_app../other_path HTTP/1.1

规则,将所有内容()放在前缀之后,并将其与``中的值连接起来,以便转发  /to_app rule, gets everything(../other_path) after the prefix, concatenates it with a value from `proxy_pass`, so it forwards http://server/any_path/../other_path 当反向代理仅将请求转发到一个端点时,它可能会造成攻击者无法到达后端的其他端点,或者无法到达完全不同的后端的幻觉。
为了将请求错误地路由到其他路径,我们需要再次了解两件事。首先,与上面的示例相同-``不带斜杠。

2018年四月
如果将这两个功能放在一起,我们将看到我们可以在几乎所有后端上走上一层的任何路径。我们只需要发送:
Host标头中的“必须”代理到后端 example1.com 这是关于Nginx的“错误”。但是,此“错误”只是Nginx工作方式的结果(因此无法修复) example1_backend – 192.168.78.1:9999.

frontend http-in
acl host_example1 hdr(host) -i example1.com
use_backend example1_backend if host_example1
backend example1_backend
server server1 192.168.78.1:9999 maxconn 32

这样的配置是否意味着攻击者无法访问后端服务器的其他虚拟主机?看起来像这样,但是攻击者可以轻松地做到这一点。因为如上所述,Haproxy不支持绝对URI,但是大多数网络服务器都支持。当Haproxy收到绝对URI时,它将未处理的绝对URI转发到后端。因此,仅通过发送下一个请求,我们就可以轻松访问后端服务器的其他虚拟主机。

GET http://unsafe-value/path/ HTTP/1.1
Host: example1.com

,因此Apache会看到一个值`http:// GET @evil.com HTTP/1.1根据标准,URL中具有特殊含义的符号必须经过URL编码(),例如双引号()或“大于”符号()。但是实际上,任何符号都可以进行URL编码并在路径部分中发送。许多Web服务器在处理请求时执行URL解码,因此它们将以相同的方式处理下一个请求。受保护的]  protected]反向代理相关攻击的全新外观 这里 漏洞评估

这是一个例子。

emt发行-技术发行商,端点安全,SIEM,WAF,防火墙,虚拟化,用于MSSP的SIEM,云解决方案,MSP,补丁管理,漏洞智能,Web漏洞扫描程序,BlackStratus,学院,卡巴斯基实验室,Avira,ESET,AlienVault,Secunia ,Flexera,Parallels,网络监控,Whtasup Gold,IPSWITCH

路径归一化

在客户端攻击中,攻击者需要强迫受害者的浏览器向服务器发送特殊请求,这会影响响应。但是浏览器会遵循规范并在发送之前处理路径:^浏览器解析URL(例如,删除片段部分),URL编码所有必要的符号(有一些例外)并对路径进行规范化。因此,要执行此类攻击,我们只能使用“有效”请求,该请求必须适合三个组件(浏览器,反向代理,后端服务器)之间的不一致。

emt Distribution已与Hornetsecurity签署了面向亚太地区和META的合作伙伴关系,以加强MSP

  • 不会将路径标准化。 /path/anything/..%2f../ 因此您可以找到自己的方式/技巧(取决于每种特定情况下的后端服务器)。
  • 。研究尚未完成。我将与其他软件一起逐步实现它。推送请求非常感谢。
  • 但是看起来Nginx有两个主要行为,每个行为都有其自己有趣的功能: /path/%2e%2e/another_path/.
  • 有信息表明Safari不会对路径进行URL解码,因此我们可以强制其发送这样的路径

订阅我们的新闻

反向代理的常见任务是从后端的响应中添加,删除或修改标头。在某些情况下,这比修改后端本身要容易得多。有时,它涉及对安全性很重要的标头的修改。因此,作为攻击者,我们可能希望强制反向代理将此类规则应用于错误的响应(来自错误的后端位置),然后将其用于对其他用户的攻击。

Let’s imagine that we have 杜塔 的RSS Tomcat as a backend. Tomcat, by default, sets header `X-Frame-Options: deny`, so a browser cannot open it in an iframe. For some reason, a part of the web application (/iframe_safe/) on the Tomcat must be accessible through iframe, so 杜塔 is configured to delete the header `X-Frame-Options` for this part. However, there is no potential for clickjacking attacks on iframe_safe

location /iframe_safe/ {
proxy_pass http://tomcat_server/iframe_safe/;
proxy_hide_header "X-Frame-Options";
}
location / {
proxy_pass http://tomcat_server/;
}

规则,但Tomcat会将其解释为完全不同的位置。这里是: iframe_safe 实际上,此技巧类似于众所周知的别名技巧。但是,这里的想法是显示一个可能滥用反向代理功能的示例。

<iframe src="//nginx_with_tomcat/iframe_safe/..;/any_other_path">

规则。由于Tomcat支持路径参数,因此在路径归一化后,它将得到``。因此,在这种配置下,可以对Tomcat的任何路径进行格式化,从而使攻击者可以对用户执行clickjacking攻击。 iframe_safe rule. Since Tomcat supports path parameters, after path normalization, it will get `/any_other_path`. Therefore, in such a configuration, any path of Tomcat can be iframed, so an attacker can perform clickjacking attacks on users.

。通过将我们的项目组合在一起,几乎可以得到一个可能存在不一致之处的矩阵。

网站

因此,它接受动词和HTTP版本()之间的所有内容(几乎没有例外),并在应用规则后将其转发到后端服务器。但是,它支持基于路径的规则,并允许其修改请求和响应。 客户端攻击 and 联系软件AdminStudio –如果反向支持绝对URL,它将如何解析它?绝对URI的优先级是否高于主机标头?:– URL由“ scheme:”组成,浏览器不发送

2017年十月
例如,Chrome和IE不会解码“%2f”,因此这样的路径

缓存的想法很简单。在某些情况下,反向代理将来自后端的响应存储在缓存中,然后从缓存中返回相同的响应而无需访问后端。默认情况下,某些反向代理支持缓存,有些需要配置。通常,反向代理将主机标头值与来自请求的未处理路径/查询的串联用作缓存的键。

为了确定是否可以缓存响应,大多数反向代理都会从后端的响应中检查Cache-Control和Set-Cookie标头。反向代理根本不使用Set-Cookie存储响应,而是使用Cache-Control,因为它描述了缓存策略,并且需要其他解析。缓存控制标头的格式非常复杂,但是基本上,它具有几个允许缓存与否的标志,并设置了响应可以缓存多长时间。

BlackHat的Orange Tsai的演讲

Cache-Control: no-cache, no-store, must-revalidate
Cache-Control: public, max-age=31536000

如您所见,所有这些步骤都很明显,并且变化不多。尽管如此,实现方面还是存在差异,作为攻击者,我们可以将其用于实现我们的目标。

许多Web服务器,应用程序服务器和框架会自动正确地设置Cache-Control标头。在大多数情况下,如果网络应用在脚本中使用会话,则会设置Cache-Control标头来限制缓存,因此通常程序员无需考虑它。但是,在某些情况下,例如,如果Web应用程序使用其自己的会话机制,则可能会错误地设置Cache-Control标头。

灭螺
A commonly used feature of a 2016年十一月 cache is “aggressive caching” (it’s not really an official term, but describes the idea). In some cases (for example, a backend can be too strict about caching 的RSS doesn’t allow to cache anything) an administrator, instead of changing the backend, changes rules of a 2016年十一月, so it starts caching responses even with Cache-Control header which restricts caching. Usually such rules have some limitations. For example, to cache only responses of certain extensions (.jpg, .css, .js), or from specific paths (/images/).

一条规则

Tomcat目录。 /images directory of Tomcat.

location /images {
proxy_cache my_cache;
proxy_pass http://tomcat_server;
proxy_cache_valid 200 302 60m;
proxy_ignore_headers Cache-Control Expires;
}

由于我想分享自己的想法并解释一些东西,因此这篇文章变得非常重要。不过,我不得不跳过一些技巧,您可以在演示文稿中看到它们

<img src="//nginx_with_tomcat.com/images/..;/index.jsp">

然后,受害者的浏览器发送一个请求(带有身份验证Cookie)。 杜塔看到  /images,因此将请求转发到Tomcat,然后缓存响应(与Cache-Control标头无关)。同样,对于Tomcat,归一化后的路径完全不同– /index.jsp. In this way an attacker can force 杜塔 to cache any page of Tomcat. To read this cached response, the attacker just needs to access the same path (/images/..;/index.jsp) 的RSS 杜塔 returns the victim’s sensitive data (e.g. csrf token).

)。例如,

反向代理相关攻击的全新外观

。 Nuster配置为缓存来自 /account/attacker/Web应用程序上的目录: /img/ 浏览器无法规范这样的路径。对于Nginx,它属于

nuster cache on
nuster rule img ttl 1d if { path_beg /img/ }

The attacker just needs to create a special URL (/img/..%2faccount/attacker/), so Nuster applies an “aggressive caching” rule, still, the web app returns a response of self 和 (it sees ‘/account/attacker/`). The response with an 和 payload will be cached by Nuster (with the key: Host + /img/..%2faccount/attacker/),因此攻击者将能够滥用此缓存来XSS攻击Web应用程序的其他用户。从自我XSS,我们有了通常的XSS。

可能。

我已经展示了每种攻击类型的易受攻击配置的几个示例。但是确切的案例并不是那么重要。我想重新看一下与反向代理相关的攻击。如果我们知道反向代理如何工作,如何处理请求以及与后端服务器相比有什么区别,我们(作为攻击者)将能够到达更多的端点或对用户执行更复杂的攻击。

如您所见,``这里不带斜杠,这意味着请求未经处理就转发了。绕过此限制的另一重要事项是Weblogic将#视为常规符号。因此,攻击者可以通过发送以下请求来访问Weblogic的管理界面:

但是,作为攻击者,我们可以提出属于 名称网络 2018年12月让我们看一下Haproxy配置,其中说所有请求

软件 //github.com/irsdl/httpninja不。让我们看一下这种“魔术”,它可以在这种配置下访问Weblogic上的任何路径。

Source://www.acunetix.com/blog/