2000P's Blog

最初のページ

spring cloud config serverパスは、任意のファイルとの読み取りホール分析を通過します。

著者 doorn 時間 2020-03-23
all

<高橋潤子>

HTS : / etc / getty . com /春の雲/春の雲の設定

GET /foo/default/master/..%252F..%252F..%252F..%252Fetc%252fpasswd HTTP/1.1 Host: localhost:8888

Spring Cloud Configは、Spirng Cloudにおいて、分散配置管理のためのコンポーネントであり、Config-ServerとConfig-Clientの2つの役割に分けられます。Config-Severは設定ファイルの集中記憶/管理を行い、Config-Config-Severから提供されるHTTPインターフェースからプロファイルを取得して使用することができます。2019年4月16日、Pivotalの公式発表により、Spring Cloud Config Serverの一部のバージョンにカタログが空きました。これによりServerエンドサーバファイルを取得することができます。

Config-Server Config-Client Config-Server Config-Client Config-Server

公式文書によれば、GET/name/{profile}/{label}/{path}を要求して構成ファイルを取得することができ、name、profile、labelの意味は従来の環境のendpointと同じであり、pathはファイル名を指す。公式の例を環境として、https:/githb.com/spring-cloud-samples/config-repo/blob/mast/test.jsonというファイルをお願いします。そしてテキストとして返します。Spring Cloud Config Serverには以下のような要求があります。

GET /{name}/{profile}/{label}/{path} name profile label path Spring Cloud Config Server GET http://127.0.0.1:8888/foo/label/master/test.json

要求フォーマットによってorg/springframe ewark/cloud/config/server/resource/Resource Controller.java:54に対応する処理@Request Mapping('/{name}/{profile}/{label}/*):を見つけることができます。

org/springframework/cloud/config/server/resource/ResourceController.java:54 @RequestMapping("/{name}/{profile}/{label}/**")

ここで、path値はpayload:.%2 F..%2 F..%2 F...%2 Fetc%2 fpasswdです。

path ..%2F..%2F..%2F..%2Fetc%2fpasswd

java . 104 :

retrieve org/springframework/cloud/config/server/resource/ResourceController.java:104

ここでは前に伝えた条件によって、resourceを取得します。文書ではonly the first one to match is returnedに言及していますので、引き続きfindOneに接続します。

only the first one to match is returned findOne

ここのlocationsの値はfile:/tmp/config-repo-751616168 1139279570935/で、これはConfig-Serverがバックエンドからプロファイルを引き出す時に一時的に保存します。通常の状況下でファイルの検索が行われます。例えばtest.json:

locations file:/tmp/config-repo-7168113927339570935/ Config-Server test.json

しかし、私たちが入ってきたのは.%2 F..%2 F..%2 Fetc%2 fpasswdです。最終的につなぎ合わせられたファイルはurlです。

..%2F..%2F..%2F..%2Fetc%2fpasswd

戻って得られたレスポンスは/etc/passwdであり、StreamUtils.co pyToStringを呼び出してファイル内容に読み込む:

resource /etc/passwd StreamUtils.copyToString(is, Charset.forName("UTF-8")

https:/github.com/spring-cloud/spring-cloud-config/comit/3632 fc 6 f 64 e 567286 c 2 f 1 b 8142 bde 505 c 2

主にlocalを取得して判断しました。

isInvalidPathは、この中に含まれているかどうかを検出するために使用されます。/、.、WEB-INFなどのキーワードは、isInvalidEncocdedPathの中で、編集復号後もisInvalidPathを呼び出して検出します。

isInvalidPath :/ .. WEB-INF isInvalidEncodedPath isInvalidPath