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

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

EMT分销 - 技术分销商,端点安全,暹粒,WAF,防火墙,虚拟化,MSSP,云解决方案,MSP,补丁管理,漏洞智能,Web漏洞扫描仪,Blackstratus,Academy,Kaspersky Lab,Avira,ESET,Alienvault,Secunia ,Flexera,Parallels,网络监控,Whtasup Gold,Ipswitch 缓存控制标题可能看起来像: 在准备这项研究的同时,我发现了几种类似的类似,包括 -

阿维拉

实际上,该研究不仅仅是关于反向代理,还涉及负载均衡器,高速缓存代理,WAF和其他中间服务器,在用户和Web应用程序之间解析和转发请求。但是,我没有找到一个正确描述这样的服务器的良好术语,并且在社区中是众所周知的,所以即使我谈论负载均衡器或缓存代理时,我也会使用“反向代理”。我将在反向代理后端服务器后面调用Web应用程序。请注意,后端服务器是如此称为原点服务器(当我们开始谈论缓存时,这将是有道理的)。

2019年11月

估计阅读时间

公司简介

让我们考虑缓存中毒攻击。攻击依赖于从可以显着的请求中查找未批准的值(从安全性的角度来看)影响响应,但同时必须通过反向代理缓存此响应,因此缓存控制标题必须是允许的。如果我们混合在一起,我们将能够找到更多方法来利用缓存中毒攻击。

当然,具有类似的方法,也可能滥用其他安全相关标题(例如,CORS,CSP等)。

b)申请规则并就请求执行行动

  1. 供应商
    When a reverse proxy receives a request, it must parse it: to get a verb, a path, a HTTP version, host header and other headers and 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在Web应用程序中访问。 browsers don’t send #fragmentnginx适用 #fragment?
    在路径中,有些其他人将其处理为通常的符号.-它如何处理必须是URL编码的符号? # 作为攻击者,我们可以滥用此规则执行Web缓存欺骗攻击。我们需要做的就是强制受害者用户打开下一个URL(例如,使用IMG):GET /index.php[0x01].jsp HTTP/1.1
  2. Web安全
    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 and 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 Nginx it means nothing./long/path/here/.. -> /long/path/ - Apache /long/path/here/.. -> /long/path/here/.. - NginxThe same with // (“空”目录)。 nginx将它转换为一个斜杠 /, but, if it’s not the first slash, Apache treats it as a directory.//long//path//here -> /long/path/here - Nginx //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 and Jetty or traversal with backslash (\..\).

MDM(移动设备管理)

,做一件事,如果 pathA - 做另一个。 pathB – do another.

关于对这种攻击的保护,这里没有“银弹”在这里(直到我们有一个非常好的标准/规范如何处理请求/路径),但我认为这个项目也可以帮助防守者。如果您了解您的代理及其限制,您将能够相应地更改其配置。

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

用PAM保护备份

反向代理已处理请求,为此找到了适当的规则并执行必要的操作。现在它必须将(向前)发送给后端。它会发送处理的请求或初始请求吗?显然,如果它已修改请求,则发送修改后的版本,但在这种情况下,它必须执行所有必要的步骤,例如,执行特殊符号的URL编码。但是,如果反向代理只是将所有请求转发到只有一个后端,则可能转发初始请求是一个好主意?

第一个示例禁止通过反向代理缓存,第二个示例 - 允许它。没有缓存控制报头的情况通常意味着允许反向代理存储响应。

因此,下面描述的所有攻击的想法是反向代理处理请求,查找和应用规则并将其转发给后端。如果我们在反向代理进程的方式之间找到不一致,则请求后端服务器处理它,我们能够创建这样的请求(路径),该请求(路径)被反向代理和完全不同的路径被解释为一个路径由后端。因此,我们将能够绕过或强行应用反向代理的一些规则。

什么是反向代理?

欧洲人

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

关于反向代理的缓存有几个因素,帮助我们了解攻击。

  • With trailing slashlocation / { proxy_pass http://backend_server/; }In this configuration, 欧洲人 虽然我正在努力进行这项研究,但分析了反向代理的各种配置,我得出了结论,我们可以绕过和应用反向代理的规则。因此,要了解反向代理相关攻击的真正潜力,我们必须看看他们的能力。  ' " < >.
    即使有一个Web应用程序(后端服务器),它从路径中占据参数并且易受XSS的攻击,攻击者也无法利用它,因为现代浏览器(除了具有IE的肮脏技巧)URL-encode这些符号。但是如果存在nginx作为反向代理,则攻击者可以强制用户在路径中发送URL编码的XSS有效载荷。 nginx对其进行解码并将解码版本发送到后端服务器,这使得剥削 经过  possible.Browser -> http://victim.com/path/%3C%22xss_here%22%3E/ -> Nginx -> http://backend_server/path/<"xss_here">/ -> WebApp
  • Without trailing slashlocation / { proxy_pass http://backend_server; }The only difference between this config and the previous one is the lack of the trailing slash. Although seemingly insignificant, it forces Nginx to forward an unprocessed request to the backend. So if you send /any_path/../to_%61pp#/path2, after processing of the request, Nginx 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配置为删除此部分的标题``。但是,没有潜力点击攻击

网站

标题修改。有时反向代理添加或修改响应标头(甚至安全相关),因为它无法在后端服务器上完成

正如我之前提到的那样,当反向代理路由在请求中取决于主机标头的不同后端请求时,这是一个常见的情况。

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

服务器端攻击

让我们想象一下情况。有偶尔(它是基于HAProxy的缓存代理)和Web应用程序。 Web应用程序具有自我XSS漏洞(仅在攻击者的帐户中工作)

当反向代理接收到请求时,它必须解析它:要获取动词,路径,HTTP版本,主机标题和其他标题和正文。无论如何都可能看起来非常简单,但如果您潜入细节,则会看到实现是不同的。有些例子:

反向代理的各种实现

  1. Routing to endpoint. It means that a reverse proxy 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. 正如您所看到的所有这些步骤都很明显,并且没有那么多种变体。尽管如此,实现的实施情况仍然存在差异,我们作为攻击者可以用于我们的目标。

如何倒退代理处理请求?:

  1. MFT作为商业文件传输的Dropbox替代方案
  2. HAProxy对请求的处理最小。所以没有“真实”解析,URL解码,归一化。它也不支持绝对URI。
  3. 在某种程度上,它只是一个变体的网络缓存欺骗,但不仅仅是。 奖项 加密|安全文件传输

如果反向代理具有基于路径的规则,它允许激进缓存,攻击者可以创建这样的路径,该路径落入规则,但是将被后端服务器解释为完全不同的路径。

这是一个例子。

解决方案

保护高级网络攻击的关键基础设施
查看下一个配置。 nginx,处理``时,将转发请求

客户端攻击
nginx抛出片段关闭,Apache返回400个错误(由于 /console/).

dutta的帖子

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

location / {
proxy_pass http://weblogic;
}

As you can see, `proxy_pass` here 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 and after path normalization, we are left with/console/.

[电子邮件

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

2020年3月
Let’s have a look at similar combinations: Nginx+Weblogic. In this case, Nginx proxies requests only to a certain endpoint of Weblogic (http://weblogic/to_app). So only requests, which come to a path /to_app on Nginx, 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在Web应用程序中访问。 param1 我想很多都知道这个功能(特别是在

漏洞性智力管理 Matrix42 - 统一工作区管理 。但是weblogic对待路径参数不同,因为它在第一个之后对待一切 /..;/..;/作为路径参数。这是否意味着这个功能对攻击者没用? ; 处理请求后,反向代理可以由于其配置而对请求执行一些操作。重要的是要注意,在许多情况下,反向代理规则是基于路径(位置)。如果路径是
。通过我们的项目组合,几乎可以获得可能的不一致性矩阵。

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

它得到了 /any_path_on_weblogic;/../to_app it gets /to_app 在解析期间,我们在解析期间享受一切 /any_path_on_weblogic;/../to_app 作为路径参数,所以weblogic看到 ; 。如果有必要,攻击者可以通过增加金额来“更深入” /any_path_on_weblogicnginx是一个着名的Web服务器,但也是反向代理的非常受欢迎。 nginx支持具有任意方案的绝对URI,比主机标头更高的优先级。 nginx解析,URL解码并标准化请求路径。然后它根据已处理的路径应用基于位置的规则。 /../` after `;.

写道
重写路径/查询。这类似于前一个,但通常涉及不同的内部机制()
意味着所有开始的路径 location /to_app (前缀)属于规则。所以, /to_app (包括特殊符号)落在它下面。此外,将拍摄此前缀()后的所有内容,然后用值连接 /to_app/to_app//to_app_anything (including special symbols) fall under it. Also, everything after this prefix(/to_app) will be taken and then concatenated with value in proxy_pass.
Look at the next config. Nginx, 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 当反向代理转发仅向一个端点请求时,它可以发出一个错觉,即攻击者无法在后端达到其他端点,或者它无法达到完全不同的后端。
为了误导对其他路径的要求,我们需要再次了解两件事。首先,与上面的例子相同 - “没有尾随斜线。

2019年3月
如果我们将两个功能放在一起,我们会看到我们可以在几乎任何后端到达一个级别的任何路径。我们只需要发送:
在主机标题中必须代理到后端 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,但大多数Web服务器都已。当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分销 - 技术分销商,端点安全,暹粒,WAF,防火墙,虚拟化,MSSP,云解决方案,MSP,补丁管理,漏洞智能,Web漏洞扫描仪,Blackstratus,Academy,Kaspersky Lab,Avira,ESET,Alienvault,Secunia ,Flexera,Parallels,网络监控,Whtasup Gold,Ipswitch

请求误判

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

旧版本的Firefox没有URL-Decode在归一化之前的特殊符号,但现在它的行为方式与Chrome类似。

  • 不会是路径标准化。 /path/anything/..%2f../ 所以你可以找到你的方式/技巧(取决于每个具体情况下的后端服务器)。
  • 。研究尚未完成。我将通过其他软件一步一步地完成它。推送请求非常感谢。
  • 但它看起来像nginx有两个主要行为,每个行为都有自己的有趣功能: /path/%2e%2e/another_path/.
  • Safari没有URL-解码路径的信息,所以我们可以强迫它发送这样的路径

订阅我们的新闻

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

Let’s imagine that we have Nginx and 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 Nginx 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.

没有。让我们看看这个“魔术”,允许在这种配置中访问WebLogic上的任何路径。

haproxy.

因此,动词和http version()之间需要一切(少数例外),并且在应用规则后,将其转发到后端服务器。但它支持基于路径的规则,并允许它修改请求和响应。 路径规范化 and 误用标题修改 规则

最近的帖子
例如,Chrome和IE不会解码`%2F`,因此如此

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

要确定是否可以缓存响应,最反向代理检查缓存控制和SET-cookie标题是否从后端的响应。反向代理根本不会将响应与Set-cookie存储,但是缓存控制,因为它描述了缓存策略并需要其他解析。缓存控制标题的格式非常复杂,但基本上,它有几个标志,允许缓存或没有响应可以缓存响应的时间。

带有尾随斜线此配置,

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

让我们想象一下,作为后端服务器,有nginx作为反向代理和weblogic。 nginx阻止访问WebLogic的管理界面(从中开头的一切

许多Web服务器,应用程序服务器和框架自动且正确地设置缓存控制标题。在大多数情况下,如果Web应用程序在脚本中使用会话,则它将设置限制缓存的缓存控制标题,因此通常程序员不需要考虑它。但是,在某些情况下,例如,如果Web应用程序使用其自己的会话机制,则可以错误地设置缓存控制标题。

oririum.
A commonly used feature of a reverse proxy 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 and doesn’t allow to cache anything) an administrator, instead of changing the backend, changes rules of a reverse proxy, 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)。 nginx看到 /images,因此将请求转发给Tomcat,然后缓存响应(它不关心缓存控制标题)。再次,对于Tomcat,归一化后的路径完全不同 -  /index.jsp. In this way an attacker can force Nginx to cache any page of Tomcat. To read this cached response, the attacker just needs to access the same path (/images/..;/index.jsp) and Nginx returns the victim’s sensitive data (e.g. csrf token).

)。例如,

逆转代理相关攻击的新鲜外观|

。 QUSTER配置为缓存所有响应 /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 XSS (it sees ‘/account/attacker/`). The response with an XSS payload will be cached by Nuster (with the key: Host + /img/..%2faccount/attacker/),因此攻击者将能够滥用此缓存到XSS攻击Web应用程序的其他用户。从自我XSS中,我们有一个常用的XS。

2018年4月

我展示了每个攻击类型的易受攻击配置的几个例子。但具体情况并不是那么重要。我想在反向代理相关攻击中焕发新鲜。如果我们知道如何反向代理工作,它如何处理请求以及与后端服务器相比的差异是什么,我们(作为攻击者)将能够达到更多端点或对用户执行更复杂的攻击。

如您所见,``这里没有尾随斜杠,这意味着请求将转发未处理。绕过限制的另一个重要措施是WebLogic将“#”作为通常的象征。因此,攻击者可以通过发送这样的请求访问WebLogic的管理界面:

但是,作为攻击者,我们可以提出落下的请求 rss.其次,WebLogic支持“路径参数”( 2019年2月让我们看看Haproxy配置,说明所有请求

软件 //github.com/irsdl/httpninja此外,即像往常一样,有一些魔法:它不会在用位置标题重定向时处理路径。

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