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 で固定されていない位置から文字列要素を抽出する方法
目次1. 何ですか2. 使用数値列挙文字列列挙異種列挙自然3. 応用シナリオ要約する1. 何ですか列...
Ansible を使用する学生は、以下に示すように、Ansible が特定のフォルダーまたはファイル...
前書き: MySQL でテーブルを設計する場合、MySQL では UUID や非連続かつ非繰り返しの...
設定する前に、次の操作を行う必要があります。 1. まずjdk bloggerをインストールします。...
最初のステップは、圧縮されたパッケージを対応するディスクに解凍することです。 2 番目の手順は、cm...
初めて docker に触れたときは本当に戸惑いました。初心者向けのチュートリアルを長い間読みました...
問題を見つける最近、プロジェクトで問題が発生しました。接続が多すぎるため、「接続が多すぎます」という...
序文正直に言うと、最近とても混乱していると感じています。テクノロジーと人生について。また、将来の発展...
問題は、誰もが「メモリ リーク」について知っていることです。一般的なシナリオはいくつかあります。クロ...
序文:日々の勉強や仕事の中で、データをエクスポートする必要に迫られることがよくあります。たとえば、デ...
MySQL ブール値、偽または真を格納つまり、データベースに保存されるブール値は 0 と 1 であり...
フレーム構造タグ <frameset></frameset>フレームを使用す...
Mysql の追加、削除、変更、クエリステートメントのシンプルな実装追加されたレコード: テーブル名...
1. Docker コンテナのホスト マシンに入り、指定されたイメージを実行しているコンテナ ID ...
1. MySQLイメージを取得する docker pull mysql:5.6注: mysql5.7...