Nginx は現在主流の Web サービスです。 以下に、最も一般的な誤った構成をいくつか示します。 ルートの場所が見つかりませんサーバー{ ルート /etc/nginx; 場所 /hello.txt { try_files $uri $uri/ =404; プロキシパス http://127.0.0.1:8080/; } } 私たちが収集した約 50,000 個の Nginx 構成ファイルの中で、最も一般的なルート パスは次のとおりです。 オフバイスラッシュサーバー{ 80 default_server をリッスンします。 サーバー名_; 場所 /static { エイリアス /usr/share/nginx/static/; } 場所 /api { proxy_pass http://apiserver/v1/; } } Off-by-slash 構成エラーでは、/ が欠落しているためにパスを 1 ステップ上に移動できる可能性があります。この手法は、Orange Tsai 氏の Blackhat 講演「Breaking Parser Logic!」で広く知られるようになりました。 この講演では、location ディレクティブのスラッシュが欠落していることと alias ディレクティブを組み合わせることで、Web アプリケーションのソース コードを読み取ることができるようになる方法を説明します。 あまり知られていないのは、proxy_pass などの他のディレクティブと組み合わせて使用することもできるということです。 何が起こっているのか、そしてなぜそれが機能するのかを分析してみましょう。 場所 /api { proxy_pass http://apiserver/v1/; } 次の構成が Nginx サーバーにアクセスできる場合は、http://apiserver/v1/ の下のパスのみがアクセス可能であると想定できます。 http://server/api/user -> http://apiserver/v1//user http://server/api/user にリクエストが行われると、Nginx はまず URL を正規化します。 次に、プレフィックス /api が URL と一致するかどうかを確認します。一致する場合は一致します。 プレフィックスは URL から削除され、/user パスが残ります。 このパスは この誤った構成は、http://server/api../ を要求することによって悪用される可能性があり、これにより Nginx は http://apiserver/v1/../ に正規化された URL http://apiserver/ を要求することになります。 これが及ぼす影響は、この誤った構成を悪用することで何を達成できるかによって異なります。 たとえば、これにより、Apache サーバーのステータスが URL http://server/api../server-status 経由で公開される可能性があり、また、パブリックにアクセスできないようにしたいパスにアクセス可能になる可能性があります。 Nginx サーバーが誤って構成されていることを示す兆候の 1 つは、URL 内のスラッシュを削除しても、サーバーが同じ応答を返すことです。 たとえば、http://server/api/user と http://server/apiuser が同じ応答を返す場合、サーバーは脆弱である可能性があります。 これにより、次のリクエストが送信されます。 http://server/api/user -> http://apiserver/v1//user http://server/apiuser -> http://apiserver/v1/user 安全でない変数の使用一部のフレームワーク、スクリプト、および Nginx 構成では、Nginx に保存された変数が安全でない方法で使用されます。 これにより、XSS、HttpOnly 保護のバイパス、情報漏洩、場合によっては RCE などの問題が発生する可能性があります。 スクリプト名構成は次のとおりです。 場所 ~ \.php$ { fastcgi_params を含めます。 fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; 127.0.0.1:9000; をデフォルトとして設定します。 } 主な問題は、ファイルがディスク上に存在しない場合でも、Nginx が .php で終わるすべての URL を PHP インタープリターに送信することです。 これは、Nginx が作成した「落とし穴とよくある間違い」ドキュメントに記載されている、Nginx の多くの誤った構成の 1 つです。 PHP スクリプトが SCRIPT_NAME に基づいてベース URL を定義しようとすると、XSS が発生します。 <?php if(basename($_SERVER['SCRIPT_NAME']) == ベース名($_SERVER['SCRIPT_FILENAME'])) dirnameをエコーします($_SERVER['SCRIPT_NAME']); ?> GET /index.php/<script>アラート(1)</script>/index.php SCRIPT_NAME = /index.php/<script>alert(1)</script>/index.php $uri を使用すると CRLF インジェクションが発生する可能性がありますNginx 変数に関連するもう 1 つの誤った構成は、$request_uri の代わりに $uri または $document_uri を使用することです。 $uri と $document_uri には正規化された URI が含まれており、Nginx での正規化には URI の URL デコードが含まれます。 Volema は、Nginx 構成でリダイレクトを作成すると、多くの場合 $uri を使用して CRLF インジェクションが発生する可能性があることを発見しました。 脆弱な Nginx 構成の例は次のとおりです。 位置 / { 302 https://example.com$uri を返します。 } HTTP リクエストの改行文字は HTTP/1.1 302 一時的に移動しました サーバー: nginx/1.19.3 コンテンツタイプ: text/html コンテンツの長さ: 145 接続: キープアライブ 場所: https://example.com/ 検出: clrf 任意の変数場合によっては、ユーザー提供のデータを Nginx 変数として扱うことができます。 なぜこのようなことが起こるのかは明らかではありませんが、この H1 レポートに示されているように、これは珍しいことではなく、テストも容易ではありません。 エラー メッセージを検索すると、SSI フィルター モジュールで見つかることがわかります。つまり、これは SSI が原因であることがわかります。 テスト方法は次のとおりです。 $ curl -H 'Referer: bar' http://localhost/foo$http_referer | grep 'foobar' 生のバックエンド応答の読み取りNginx の クライアントが無効な HTTP リクエストを Nginx に送信した場合、リクエストはそのままバックエンドに転送され、バックエンドは元のコンテンツで応答します。 Nginx は無効な HTTP 応答を理解できず、クライアントに転送します。 次のような uWSGI アプリケーションを想像してください。 defアプリケーション(environ、start_response): start_response('500 エラー', [('コンテンツタイプ', 'text/html'),('シークレットヘッダー','シークレット情報')]) return [b"秘密情報なので、表示しないでください!"] Nginx の設定は次のとおりです。 http { エラーページ 500 /html/error.html; proxy_intercept_errors がオン; proxy_hide_header シークレットヘッダー; } proxy_intercept_errors は、バックエンドの応答ステータスが 300 より大きい場合にカスタム応答を提供します。上記の uWSGI アプリケーションでは、500 エラーを送信しますが、これは Nginx によってインターセプトされます。 proxy_hide_header: 指定された HTTP ヘッダーをクライアントから非表示にできます。 通常の GET リクエストを送信すると、Nginx は次を返します。 HTTP/1.1 500 内部サーバーエラー サーバー: nginx/1.10.3 コンテンツタイプ: text/html コンテンツの長さ: 34 接続: 閉じる ただし、次のような無効な HTTP リクエストを送信した場合、 GET /? XTTP/1.1 ホスト: 127.0.0.1 接続: 閉じる 次のような返答が届きます。 XTTP/1.1 500 エラー コンテンツタイプ: text/html シークレットヘッダー: secret-info 秘密情報なので、見られてはいけません! merge_slashes がオフに設定されていますデフォルトでは、 上記は、よくある Nginx の誤った設定の詳細です。Nginx の誤った設定の詳細については、123WORDPRESS.COM にアクセスして、その他の関連記事をご覧ください。 以下もご興味があるかもしれません:
|
>>: MySQL で固定されていない位置から文字列要素を抽出する方法
Linux LVM論理ボリューム構成プロセスの詳細な説明多くの Linux ユーザーは、オペレーティ...
次の2つの関数は、 FIND_IN_SETと同じように使用されます。使用する場合、 FIND_IN_...
DOCTYPE 宣言 作成するすべてのページの先頭に、ドキュメント宣言が必要です。はい、そうでしょう...
目次1. 関連構成ケース1(使用ツールはvue-cil)ケース2(使用するツールはwebpack) ...
CEP - 複合イベント処理。ご注文後、一定期間内にお支払いの確認が取れませんでした。タクシーの配...
1. ファイル削除コマンド:対応するディレクトリを検索します -mtime + 日数 -name &...
目次1. 最も単純なサーバー側の例2. バインドシステムコール2.1、inet_bind 2.2、i...
シナリオシミュレーション:ある会社の運用保守担当者は、以前購入した一連のネットワーク機器の光ポートの...
目次前の1. セットアップ構文シュガーとは何か2. セットアップコンポーネントを使用して自動的に登録...
1. 分割スクリプト (splitNginxLog.sh) を作成します。 * この例では、ログ分割...
目次1. 短絡や条件文の代わりにデフォルトのパラメータを使用する2. 複数の条件の処理3. スイッチ...
chmod コマンド構文chmod コマンドを使用する場合の正しい構文は次のとおりです。 chmod...
この記事の例では、参考までに簡単な虫眼鏡効果を実現するためのjsの具体的なコードを共有しています。具...
1 はじめにApache Storm は、Hadoop と同様に、大量のデータを処理するために使用で...
目次1. ソースパッケージサービスの起動管理2. ソースパッケージサービスのセルフスタート管理3. ...