0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

お題は不問!Qiita Engineer Festa 2023で記事投稿!

Nginx のエイリアストラバーサルの記事を読んで、実際に挙動を確認してみた

Posted at

先日、GIGAZINENginxエイリアストラバーサルについての記事を見かけたので、実際に Nginx サーバを立ててみて挙動を確認してみました。

・GIGAZINE の記事
スラッシュの有無だけでセキュリティにとんでもない大穴が空いてしまうNginxのありがちな設定ミスについて実例を踏まえて専門家が解説 - GIGAZINE

こちらの GIGAZINE の記事なんですが、セキュリティアナリストの ダニエル・マツモトさんという方のブログを、日本語で分かりやすく解説したような内容になっています。

・Hunting for Nginx Alias Traversals in the wild
https://labs.hakaioffsec.com/nginx-alias-traversal/

ちなみに、筆者は Nginx については仕事で何度か使ったことはありますが、設定ファイルを書いたことはなく(他のメンバーが書いていた)、Nginx そのものにあまり馴染みが無いというレベル感です。

結論

結論からお伝えすると「location と alias の両方とも末尾にスラッシュを付ける」こと、となるようです。
image.png

事前準備

今回は、Nginx のコンテナを立てて確認を行いました。バージョンは参考記事に合わせて 1.24.0 としています。
コンテナを立ち上げて http://localhost:8080 にアクセスして Welcome to nginx! のページが表示されるところまで進めます。
image.png

次に、コンテナの中に入って /var/images ディレクトリを作成し、その配下に(記事に合わせて)JPEG ファイルを配置しておきます。
今回は、フリーの画像ファイルを適当にインターネットから拾ってきて、profile.jpg という名称で配置しました。
image.png

最後に、設定ファイルを編集して、/var/log/nginx/access_test.log にアクセスログが出力されるように指定しておきます。
編集後は service nginx reload を忘れずに実行しておきます。

/etc/nginx/conf.d/default.conf
  access_log /var/log/nginx/access_test.log main;

挙動の確認

それでは実際に挙動を確認してみます。

まず最初に、参考記事の方で「Vulnerable」として紹介されている脆弱性有りの設定内容を適用します。

/etc/nginx/conf.d/default.conf
location /img {
  alias /var/images/;
}

参考記事にも書かれてあるのですが、「location で指定した /img の末尾にスラッシュを付けない」かつ
「alias で指定した /var/images/ の末尾にスラッシュを付ける」という2つの条件が揃った時に重大な脆弱性が発生してしまうようです。

今回の設定内容が適用されている場合、Nginxは /img で始まる URL を全て /var/images/ へ転送してしまうため、/img/profile.jpg にアクセスすると、/var/images//profile.jpg に転送され、連続スラッシュは無視されて /var/images/profile.jpg のデータが返るとのことです。
この挙動を確認してみると 200 OK で返ってきました。ファイルにアクセスできているようです。
image.png

筆者はパスに色付けすると理解しやすかったので、こちらに記載しておきます。
image.png

次に、/imgprofile.jpg にアクセスしてみます。この場合は /var/images/profile.jpg に転送されると書かれてあるので、この挙動を確認してみます。この場合も 200 OK で返ってきました。ファイルにアクセスできているようです。2つの URL で同じファイルにアクセスできることになります。
image.png
image.png

さらに、/img.. という URL にアクセスすることで、/var/images/.. というパスで指定されるデータにアクセス可能とのことです。.. は皆さんも馴染みがあると思いますが「1つ上のディレクトリ」「親ディレクトリ」のことになります。
つまり、/var/images/../var/ となり、本来公開されていないはずのディレクトリまで閲覧することができてしまいます。危険な状態と言えるかもしれません。
image.png
image.png

設定ファイルの alias 指定で末尾のスラッシュを付けず/var/images とした場合の挙動についても確認してみます。

/etc/nginx/conf.d/default.conf
location /img {
  alias /var/images; // 末尾のスラッシュを付けない
}

この設定内容だと、URLの「/img..」にアクセスしても「/var/images..」という名前のディレクトリを探すだけなので親ディレクトリのデータにアクセスされることはないとのことなので、挙動を確認してみます。404 Not Found が返ってきました。アクセスできないようです。
image.png
image.png

ただし、「/var/images_confidential」のようなディレクトリが存在している場合は「/img_confidential」というURLでアクセスできてしまうとのことなので、この挙動も確認してみます。
/var/images_confidential ディレクトリを作成し、配下に test.txt を作成します。
image.png

「/img_confidential」のURLでアクセスしてると、200 OK が返ってきました。アクセスできるようです。
image.png
image.png

これらを踏まえると、冒頭に書いた結論のように「location と alias の両方とも末尾にスラッシュを付けるべき」ということになるようです。

さいごに

今、Nginx を使っている方やこれから使う予定のある方は、今一度、設定ファイルを見直してみても良いかも知れません。
ダニエル・マツモトさんが、今回の脆弱性を外部からブラックボックステストできるツールを公開されているようなので、(筆者は使っていませんが)気になる方は確認されてみてください。

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?