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 で固定されていない位置から文字列要素を抽出する方法
トリガー メソッドを使用できます。JavaScript にはネイティブのトリガー関数はありません。自...
目次序文文章1. パネル2. 華容島ソリューション3. コード4. 注記序文華容路とは何ですか? 誰...
1. ネイティブネットワークリクエスト1. XMLHttpRequest (W3C 標準) // 約...
目次1.ライフサイクルとは何か2. 読み込みプロセス1.コンストラクタ2. レンダリング3. コンポ...
1. フォームテキスト入力のモバイル選択: テキスト入力フィールドにプロンプトが追加されている場...
この記事は主に、Nginx のフォワード プロキシとリバース プロキシ、および負荷分散機能の設定コー...
各ブラウザの select タグのプロパティと各ブラウザのサポートが多少異なるため、各ブラウザでの選...
1. 環境VS 2019 16.9.0 プレビュー 1.0 .NET SDK 5.0.100 2. ...
SSH 公開鍵認証は、SSH 認証方式の 1 つです。 SSH パスワードフリーのログインは公開鍵認...
MySQL は現在、ほとんどの企業や事業体で使用されているデータベースです。MySQL が使用される...
MySQL トランザクション分離レベルを表示する mysql> '%isolation...
序文最近、データベースのテーブルに 2 つのフィールドを追加しました。その後、ディスク容量不足のよう...
この便利なツールでプログラムをより効率的に実行およびコンパイルしますMakefile は自動コンパイ...
オリジナルリンクhttps://github.com/XboxYan/no…ボタンは、おそらく We...
ビジネス ソーシャル ネットワーキング サイト LinkedIn は最近、ナビゲーション バーとユー...