Express Prototype Pollution Gadgets
XSSレスポンスを提供する
詳細については 元の研究を参照してください
JSONコンテンツタイプをHTMLに変更する
JSONコンテンツタイプレスポンスを使用し、JSONを反映するExpressアプリで:
これらのケースでは、JSONコンテンツタイプでは通常XSSは不可能です。しかし、プロトタイプ汚染を利用することで、Expressを混乱させてHTMLレスポンスを提供させることができます。 この脆弱性は、アプリケーションが**res.send(obj)
**を使用し、application/jsonコンテンツタイプでボディパーサーを使用することに依存しています。
body
と _body
プロパティを 汚染 することで、ExpressがHTMLコンテンツタイプを提供し、 _body
プロパティを反映させることが可能になり、結果として保存されたXSSが発生します。
UTF7をレンダリング
Expressが UTF-7コンテンツをレンダリングする ことが可能です:
安全なスキャン技術
JSONスペース
次のPPは、JSON内の属性に余分なスペースを追加し、機能を壊さないようにします:
次のような反射されたJSONになります:
Exposed Headers
次のPPガジェットは、サーバーがHTTPヘッダーを返すようにします: Access-Control-Expose_headers: foo
CORSモジュールをインストールする必要があります
OPTIONSメソッド
次のペイロードを使用すると、OPTIONSレスポンスからメソッドを隠すことが可能です:
ステータス
次のPPペイロードを使用して、返されたステータスコードを変更することが可能です:
エラー
文字列のようなプリミティブをプロトタイプに割り当てると、プロトタイプはオブジェクトでなければならないため、何もしない操作が生成されます。プロトタイプオブジェクトをObject.prototype
自体に割り当てようとすると、例外がスローされます。これらの2つの動作を使用して、プロトタイプ汚染が成功したかどうかを検出できます:
Reflected Value
アプリケーションがレスポンスにオブジェクトを含めるとき、__proto__
と一緒に異常な名前の属性を作成することは有益です。特に、異常な属性のみがレスポンスに返される場合、これはアプリケーションの脆弱性を示している可能性があります:
さらに、Lodashのようなライブラリが使用されるシナリオでは、プロトタイプ汚染(PP)を介してプロパティを設定することと、オブジェクト内で直接設定することが、別の診断アプローチを提供します。そのようなプロパティがレスポンスから省略されている場合、Lodashがマージする前にターゲットオブジェクト内のプロパティの存在を確認していることを示唆しています。
Misc
Allow Dots
Expressには、クエリ文字列パラメータからオブジェクトを作成するオプションがあります。 これは、プロトタイプ汚染の脆弱性を悪用するバグチェーンで確実に使用できます。
?foo.bar=baz
はNodeでオブジェクトを作成します。
参考文献
Last updated