Exploiting __VIEWSTATE without knowing the secrets
Bug bounty tip: sign up for Intigriti, a premium bug bounty platform created by hackers, for hackers! Join us at https://go.intigriti.com/hacktricks today, and start earning bounties up to $100,000!
What is ViewState
ViewState は、ASP.NET におけるページとコントロールデータをウェブページ間で維持するためのデフォルトメカニズムです。ページの HTML をレンダリングする際、ページの現在の状態とポストバック中に保持される値が base64 エンコードされた文字列にシリアライズされます。これらの文字列は、隠し ViewState フィールドに配置されます。
ViewState 情報は、以下のプロパティまたはその組み合わせによって特徴付けられます:
Base64:
EnableViewStateMac
とViewStateEncryptionMode
属性が両方とも false に設定されている場合に使用される形式です。Base64 + MAC (メッセージ認証コード) 有効:
MAC の有効化は、
EnableViewStateMac
属性を true に設定することで達成されます。これにより、ViewState データの整合性検証が提供されます。Base64 + 暗号化:
ViewStateEncryptionMode
属性が true に設定されている場合に暗号化が適用され、ViewState データの機密性が確保されます。
Test Cases
この画像は、.NET フレームワークのバージョンに基づく ASP.NET の ViewState の異なる構成を詳細に示した表です。内容の概要は以下の通りです:
任意の .NET バージョンの場合、MAC と暗号化が無効な場合、MachineKey は必要なく、したがってそれを特定する適用可能な方法はありません。
4.5 未満のバージョンの場合、MAC が有効で暗号化が無効な場合、MachineKey が必要です。MachineKey を特定する方法は「Blacklist3r」と呼ばれます。
4.5 未満のバージョンの場合、MAC が有効か無効かにかかわらず、暗号化が有効な場合、MachineKey が必要です。MachineKey を特定するのは「Blacklist3r - Future Development」のタスクです。
4.5 以上のバージョンの場合、MAC と暗号化のすべての組み合わせ(両方が true であるか、一方が true で他方が false であるか)は、MachineKey を必要とします。MachineKey は「Blacklist3r」を使用して特定できます。
Test Case: 1 – EnableViewStateMac=false and viewStateEncryptionMode=false
AspNetEnforceViewStateMac
レジストリキーをゼロに設定することで、ViewStateMAC を完全に無効にすることも可能です:
ViewState属性の特定
BurpSuiteを使用して、このパラメータを含むリクエストをキャプチャすることで、ViewStateがMACで保護されているかどうかを特定できます。Macがパラメータを保護するために使用されていない場合、YSoSerial.Netを使用してこれを悪用できます。
Test case 1.5 – テストケース1と同様ですが、ViewStateクッキーはサーバーによって送信されません
開発者はViewStateをHTTPリクエストの一部として送信しないように削除することができます(ユーザーはこのクッキーを受け取りません)。 ViewStateが存在しない場合、その実装はViewStateのデシリアライズに起因する潜在的な脆弱性から安全であると考えるかもしれません。 しかし、それは事実ではありません。リクエストボディにViewStateパラメータを追加し、ysoserialを使用して作成したシリアライズされたペイロードを送信すれば、ケース1に示されているようにコード実行を達成することができます。
Test Case: 2 – .Net < 4.5 および EnableViewStateMac=true & ViewStateEncryptionMode=false
特定のページに対してViewState MACを有効にするためには、特定のaspxファイルに以下の変更を加える必要があります:
全体のアプリケーションについても、以下に示すようにweb.configファイルに設定することで実行できます:
パラメータはMACで保護されているため、攻撃を成功させるにはまず使用されているキーが必要です。
使用されているキーを見つけるためにBlacklist3r(AspDotNetWrapper.exe) を試すことができます。
Badsecrets は、既知の machineKeys を特定できる別のツールです。Python で書かれているため、Blacklist3r とは異なり、Windows の依存関係はありません。.NET viewstates 用には、「python blacklist3r」ユーティリティがあり、これが最も迅速な使用方法です。
viewstate と generator を直接提供することもできます:
![](https://book.hacktricks.xyz/~gitbook/image?url=https%3A%2F%2Fuser-images.githubusercontent.com%2F24899338%2F227034640-662b6aad-f8b9-49e4-9a6b-62a5f6ae2d60.png&width=768&dpr=4&quality=100&sign=23cdf23f&sv=1)
または、ターゲットURLに直接接続し、HTMLからviewstateを切り出そうとすることができます:
![](https://book.hacktricks.xyz/~gitbook/image?url=https%3A%2F%2Fuser-images.githubusercontent.com%2F24899338%2F227034654-e8ad9648-6c0e-47cb-a873-bf97623a0089.png&width=768&dpr=4&quality=100&sign=423fd6f6&sv=1)
脆弱な viewstate を大規模に検索するために、サブドメイン列挙と組み合わせて、badsecrets
BBOT モジュールを使用できます:
![](https://book.hacktricks.xyz/~gitbook/image?url=https%3A%2F%2Fuser-images.githubusercontent.com%2F24899338%2F227028780-950d067a-4a01-481f-8e11-41fabed1943a.png&width=768&dpr=4&quality=100&sign=118463af&sv=1)
運が良ければ、キーが見つかり、YSoSerial.Netを使用して攻撃を進めることができます:
サーバーによって_VIEWSTATEGENERATOR
パラメータが送信されない場合、--generator
パラメータを提供する必要はありませんが、これらのパラメータは必要です:
テストケース: 3 – .Net < 4.5 および EnableViewStateMac=true/false および ViewStateEncryptionMode=true
この場合、パラメータがMACで保護されているかどうかは不明です。そのため、値はおそらく暗号化されており、脆弱性を悪用するためにペイロードを暗号化するためのマシンキーが必要です。
この場合、 Blacklist3r モジュールは開発中です...
.NET 4.5以前では、 ASP.NETは**ViewStateEncryptionMode
が_常に_に設定されていても、ユーザーからの暗号化されていない**___VIEWSTATE
_パラメータを受け入れることができます。ASP.NETは**__VIEWSTATEENCRYPTED
パラメータの存在のみを確認します**。このパラメータを削除し、暗号化されていないペイロードを送信すると、それでも処理されます。
したがって、攻撃者がファイルトラバーサルのような別の脆弱性を介してマシンキーを取得する方法を見つけた場合、ケース2で使用されたYSoSerial.Netコマンドを使用して、ViewStateのデシリアライズ脆弱性を利用してRCEを実行できます。
ViewStateのデシリアライズ脆弱性を悪用するために、リクエストから
__VIEWSTATEENCRYPTED
パラメータを削除してください。そうしないと、Viewstate MAC検証エラーが返され、悪用は失敗します。
テストケース: 4 – .Net >= 4.5 および EnableViewStateMac=true/false および ViewStateEncryptionMode=true/false ただし両方の属性がfalseの場合
以下のパラメータをweb.configファイル内に指定することで、ASP.NETフレームワークの使用を強制できます。
代わりに、これはweb.configファイルのmachineKey
パラメータ内に以下のオプションを指定することで行うことができます。
前述のように、値は暗号化されています。 そのため、有効なペイロードを送信するには攻撃者がキーを必要とします。
Blacklist3r(AspDotNetWrapper.exe) を使用して、使用されているキーを見つけることができます:
IISDirPathとTargetPagePathの詳細な説明については、こちらを参照してください
または、Badsecrets(ジェネレーター値付き)を使用して:
![](https://book.hacktricks.xyz/~gitbook/image?url=https%3A%2F%2Fuser-images.githubusercontent.com%2F24899338%2F227043316-13f0488f-5326-46cc-9604-404b908ebd7b.png&width=768&dpr=4&quality=100&sign=af0ebfe0&sv=1)
有効なMachine keyが特定されると、次のステップは YSoSerial.Net を使用してシリアライズされたペイロードを生成することです。
__VIEWSTATEGENERATOR
の値がある場合、その値を使って--generator
パラメータを使用し、--path
および--apppath
パラメータを省略することができます。
ViewStateのデシリアライズ脆弱性の成功した悪用は、攻撃者が制御するサーバーへのアウトオブバンドリクエストを引き起こし、ユーザー名を含みます。この種のエクスプロイトは、「Exploiting ViewState Deserialization using Blacklist3r and YsoSerial.NET」というリソースを通じて見つけることができる概念実証(PoC)で示されています。悪用プロセスの仕組みや、MachineKeyを特定するためにBlacklist3rのようなツールを利用する方法についての詳細は、提供された成功した悪用のPoCを確認してください。
テストケース 6 – ViewStateUserKeysが使用されている
ViewStateUserKeyプロパティは、CSRF攻撃に対して防御するために使用できます。そのようなキーがアプリケーションで定義されている場合、これまでに議論した方法でViewStateペイロードを生成しようとすると、ペイロードはアプリケーションによって処理されません。 ペイロードを正しく作成するためには、もう1つのパラメータを使用する必要があります:
成功した悪用の結果
すべてのテストケースにおいて、ViewState YSoSerial.Net ペイロードが成功した場合、サーバーは「500 Internal server error」で応答し、応答内容は「このページの状態情報は無効であり、破損している可能性があります」となり、OOB リクエストを受け取ります。
参考文献
バグバウンティのヒント: Intigritiにサインアップしてください。これはハッカーによって、ハッカーのために作られたプレミアムバグバウンティプラットフォームです!今日、https://go.intigriti.com/hacktricksに参加し、最大**$100,000**のバウンティを獲得し始めましょう!
Last updated