ホームページ PHPフレームワーク ThinkPHP ThinkPHP6.0.13 デシリアライゼーションの脆弱性分析

ThinkPHP6.0.13 デシリアライゼーションの脆弱性分析

Oct 09, 2022 pm 06:47 PM
php thinkphp

最近少し怠けていて、何かやることを見つけないと落ち着かないので、抜け穴を見つけて解析するつもりなので、TP. ThinkPHP6 の抜け穴をいくつか見てみるつもりです。 TP の最新バージョンは 0.13 です 8 月にマスターが提出しました TP にはデシリアライゼーションの問題があると指摘されました インターネット上の一部の専門家が分析していますが、ブレークポイントが多く、用途が明確になっていないメソッドもありますそこで私も詳しく分析してみました。以下は POC です

ThinkPHP6.0.13 デシリアライゼーションの脆弱性分析

# 分析 #まずは POC の開始点を見てください

ThinkPHP6.0.13 デシリアライゼーションの脆弱性分析

ThinkPHP6.0.13 デシリアライゼーションの脆弱性分析開始点が Psr6Cache クラスにあることがわかりました。このクラスに入りましたが、__destruct などの一般的な逆シリアル化開始マジックは見つかりませんでしたまたは __wakeup.メソッドの場合、その親クラス AbstractCache の抽象クラスに存在する必要があると推測されます。図に示すように、AbstractCache クラス

ThinkPHP6.0.13 デシリアライゼーションの脆弱性分析 に従って、この逆シリアル化チェーンの開始クラスを正常に見つけます。ここでは、autosave 属性を false に制御して、save メソッドを開始できます。

Psr6Cache クラスに戻ってこのメソッドを表示します。

ThinkPHP6.0.13 デシリアライゼーションの脆弱性分析プール属性とキー属性の両方を制御できることがわかります。したがって、異なるクラスの同じ名前のメソッド (getItem) を呼び出すルートが 2 つ存在する可能性があります。または、__call メソッドを直接トリガーしてみてください。 POC 作成者がどのようにして逆シリアル化の進行を許可しているかを見てみましょう。

ThinkPHP6.0.13 デシリアライゼーションの脆弱性分析作成者はコンストラクター メソッドを使用して exp を渡しました。exp は実際に Channel クラスをインスタンス化しています。 Channel クラスに入って確認します。

ThinkPHP6.0.13 デシリアライゼーションの脆弱性分析Channel クラスには __call メソッドがあるため、作成者はチェーンを継続するために __call をトリガーすることを選択します。この呼び出しメソッドは 2 つのパラメーターを受け入れます。メソッドはハードコーディングされており (getItem)、パラメーターは制御可能です (つまり、以前に制御可能だったキー属性)

ThinkPHP6.0.13 デシリアライゼーションの脆弱性分析ログをフォローします。メソッドを確認します。メソッドは 3 つのパラメータを受け入れます (ただし、実際には後続のチェーンには役に立ちません)。レコード メソッド

## に続いてレコード メソッド ThinkPHP6.0.13 デシリアライゼーションの脆弱性分析## を渡します。

#戻って作成者の POC を確認すると、そのコントロール遅延属性が false であることがわかります。関数に最後の if 分岐を入力させて、save メソッドを実行させます

ThinkPHP6.0.13 デシリアライゼーションの脆弱性分析

では、save メソッドはよりクリティカルなメソッドである必要があります。save メソッドに続いて悪用される可能性があるポイントは 3 つあります。作成者はどれを選択しましたか?

1ThinkPHP6.0.13 デシリアライゼーションの脆弱性分析

POC によると、作成者がロガー属性を制御し、コンストラクターを使用してそれに値を割り当て、それをSocket クラスのオブジェクト

1ThinkPHP6.0.13 デシリアライゼーションの脆弱性分析

1ThinkPHP6.0.13 デシリアライゼーションの脆弱性分析

このクラスには、多数の操作を含む同じ名前の複雑なメソッドが含まれています。

1ThinkPHP6.0.13 デシリアライゼーションの脆弱性分析

# 作成者がどのように構築するかを見てみましょう。作成者は config 属性を制御し、それに配列値を割り当てます。配列には次の内容があります

1ThinkPHP6.0.13 デシリアライゼーションの脆弱性分析

#キーはこれら 2 つのキー値にあります。作成者は構成を制御し、invoke メソッドを呼び出すブランチまでプログラムを実行できるようにします

1ThinkPHP6.0.13 デシリアライゼーションの脆弱性分析

同時に、アプリ属性も制御可能です。作成者は、アプリ属性を App クラスのオブジェクトにします。App クラスに入りましょう。

1ThinkPHP6.0.13 デシリアライゼーションの脆弱性分析

まず、App クラスの存在を見てみましょう。メソッドの場合、このメソッドはその親クラスで見つかりました。

1ThinkPHP6.0.13 デシリアライゼーションの脆弱性分析

次に、App クラスに対して実行される唯一の操作を示します。これは、instance 属性の値を制御します。ここで値を制御する目的は、Request クラスに入り、URL メソッドを実行することです。

ThinkPHP6.0.13 デシリアライゼーションの脆弱性分析

2ThinkPHP6.0.13 デシリアライゼーションの脆弱性分析

作者は、ここでのリクエストクラスは、url属性の値を制御するものです。 url 属性が存在する場合、最初のブランチに入り、その値がそれ自体と等しいことがわかります。

2ThinkPHP6.0.13 デシリアライゼーションの脆弱性分析

同時に、以前に渡した完全な値が true であることに気付きました。したがって、最終的に返される結果は $this->domain().$url です。URL は制御できましたが、ドメイン メソッドは何を返すのでしょうか?

2ThinkPHP6.0.13 デシリアライゼーションの脆弱性分析

OK、これを見る必要はありません。多くの分析を行った結果、$currentUri の最終値が得られました。

http://localhost/

2ThinkPHP6.0.13 デシリアライゼーションの脆弱性分析

currentUri は、チェーンの長さに応じて配列が呼び出され、呼び出しに達しました。デシリアライズの旅はほぼ終了です。

2ThinkPHP6.0.13 デシリアライゼーションの脆弱性分析

呼び出しを確認してください。App クラスはこのメソッドを見つけることができません。他の This メソッドではありません。親クラスで見つかりました

2ThinkPHP6.0.13 デシリアライゼーションの脆弱性分析

ここで確認できます。この関数には 3 つの分岐がありますが、最終的にはどこに行くのでしょうか?前に $config['format_head'] で渡した内容によると、まず、渡したオブジェクトは Closure のインスタンスまたはサブクラスではなく、2 番目のブランチの条件を満たしていません。

2ThinkPHP6.0.13 デシリアライゼーションの脆弱性分析

それでは、3 番目の分岐に入ります。続いて invokeMethod() メソッドを実行します。ここで渡される $callab は [new \think\view\driver\Php,'display'] で、$vars は ['http://localhost/']

2ThinkPHP6.0.13 デシリアライゼーションの脆弱性分析

# です。 ##渡した $method は配列なので、最初の分岐に入ることに注意してください。新しい \think\view\driver\Php (つまり、オブジェクト) を $class に割り当て、「display」 (つまり、メソッド名) を新しい $method に割り当てます。

次に判定が行われます。$class がオブジェクトの場合、その値はそれ自体です。オブジェクトを渡しているため、ここでは変更はありません。次に、最も重要なコードを入力します。

オブジェクト new \think\view\driver\Php とメソッド display が ReflectionMethod に渡されることがわかります。

2ThinkPHP6.0.13 デシリアライゼーションの脆弱性分析#最後に、invokeArgs メソッドを呼び出し、新しい \think\view\driver\Php オブジェクトを渡し、$args

# を渡します。

##それでは、引数とは何でしょうか? ThinkPHP6.0.13 デシリアライゼーションの脆弱性分析

追跡してみると、処理関数であることがわかりました。私は怠け者で、この時点で分析はほぼ終わっているので、深く読みませんつまり、渡した $vars の重要な部分、つまり ['http://localhost/'] は保持され、後続のパラメーターに入力されます。 3ThinkPHP6.0.13 デシリアライゼーションの脆弱性分析

さらに詳しく見ると、この関数 (invokeArgs) は call_user_func() と単純に比較できるため、最終的なキー コードは実際には次の 2 行のみです

3ThinkPHP6.0.13 デシリアライゼーションの脆弱性分析

、つまり、

$reflect = new ReflectionMethod(new \think\view\driver\Php,’display’);
return $reflect->invokeArgs(new \think\view\driver\Php,’ ’)
ログイン後にコピー

TP デシリアライゼーションをよく見る友人なら、それが終わったことを知っているでしょう。結局のところ、表示メソッドが呼び出されます。しかし、上記の ReflectionMethod クラスを呼び出す操作は正確には何でしょうか?次の例を使ってこれを実証できます。したがって、これは call_user_func と非常によく似ています。

3ThinkPHP6.0.13 デシリアライゼーションの脆弱性分析

最後は表示メソッドです。これ以上言うことはありません。コンテンツは表示メソッドに渡され、eval がコマンド

3ThinkPHP6.0.13 デシリアライゼーションの脆弱性分析

結論

3ThinkPHP6.0.13 デシリアライゼーションの脆弱性分析

TP のチェーンは相変わらず興味深い (そして複雑)、特に最後の ReflectionMethod クラスの使用法がわかりません。このクラスと、call_user_func 関数と同様の機能を実現するためのクラス内のメソッドの組み合わせを理解していない場合は、 、これは見逃しがちですが、素晴らしいエクスプロイトです。

[関連チュートリアルの推奨事項: thinkphp フレームワーク]

以上がThinkPHP6.0.13 デシリアライゼーションの脆弱性分析の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

Ubuntu および Debian 用の PHP 8.4 インストールおよびアップグレード ガイド Ubuntu および Debian 用の PHP 8.4 インストールおよびアップグレード ガイド Dec 24, 2024 pm 04:42 PM

PHP 8.4 では、いくつかの新機能、セキュリティの改善、パフォーマンスの改善が行われ、かなりの量の機能の非推奨と削除が行われています。 このガイドでは、Ubuntu、Debian、またはその派生版に PHP 8.4 をインストールする方法、または PHP 8.4 にアップグレードする方法について説明します。

PHP 開発用に Visual Studio Code (VS Code) をセットアップする方法 PHP 開発用に Visual Studio Code (VS Code) をセットアップする方法 Dec 20, 2024 am 11:31 AM

Visual Studio Code (VS Code とも呼ばれる) は、すべての主要なオペレーティング システムで利用できる無料のソース コード エディター (統合開発環境 (IDE)) です。 多くのプログラミング言語の拡張機能の大規模なコレクションを備えた VS Code は、

JSON Web Tokens(JWT)とPHP APIでのユースケースを説明してください。 JSON Web Tokens(JWT)とPHP APIでのユースケースを説明してください。 Apr 05, 2025 am 12:04 AM

JWTは、JSONに基づくオープン標準であり、主にアイデンティティ認証と情報交換のために、当事者間で情報を安全に送信するために使用されます。 1。JWTは、ヘッダー、ペイロード、署名の3つの部分で構成されています。 2。JWTの実用的な原則には、JWTの生成、JWTの検証、ペイロードの解析という3つのステップが含まれます。 3. PHPでの認証にJWTを使用する場合、JWTを生成および検証でき、ユーザーの役割と許可情報を高度な使用に含めることができます。 4.一般的なエラーには、署名検証障害、トークンの有効期限、およびペイロードが大きくなります。デバッグスキルには、デバッグツールの使用とロギングが含まれます。 5.パフォーマンスの最適化とベストプラクティスには、適切な署名アルゴリズムの使用、有効期間を合理的に設定することが含まれます。

PHPでHTML/XMLを解析および処理するにはどうすればよいですか? PHPでHTML/XMLを解析および処理するにはどうすればよいですか? Feb 07, 2025 am 11:57 AM

このチュートリアルでは、PHPを使用してXMLドキュメントを効率的に処理する方法を示しています。 XML(拡張可能なマークアップ言語)は、人間の読みやすさとマシン解析の両方に合わせて設計された多用途のテキストベースのマークアップ言語です。一般的にデータストレージに使用されます

母音を文字列にカウントするPHPプログラム 母音を文字列にカウントするPHPプログラム Feb 07, 2025 pm 12:12 PM

文字列は、文字、数字、シンボルを含む一連の文字です。このチュートリアルでは、さまざまな方法を使用してPHPの特定の文字列内の母音の数を計算する方法を学びます。英語の母音は、a、e、i、o、u、そしてそれらは大文字または小文字である可能性があります。 母音とは何ですか? 母音は、特定の発音を表すアルファベットのある文字です。大文字と小文字など、英語には5つの母音があります。 a、e、i、o、u 例1 入力:string = "tutorialspoint" 出力:6 説明する 文字列「TutorialSpoint」の母音は、u、o、i、a、o、iです。合計で6元があります

PHPでの後期静的結合を説明します(静的::)。 PHPでの後期静的結合を説明します(静的::)。 Apr 03, 2025 am 12:04 AM

静的結合(静的::) PHPで後期静的結合(LSB)を実装し、クラスを定義するのではなく、静的コンテキストで呼び出しクラスを参照できるようにします。 1)解析プロセスは実行時に実行されます。2)継承関係のコールクラスを検索します。3)パフォーマンスオーバーヘッドをもたらす可能性があります。

PHPマジックメソッド(__construct、__destruct、__call、__get、__setなど)とは何ですか? PHPマジックメソッド(__construct、__destruct、__call、__get、__setなど)とは何ですか? Apr 03, 2025 am 12:03 AM

PHPの魔法の方法は何ですか? PHPの魔法の方法には次のものが含まれます。1。\ _ \ _コンストラクト、オブジェクトの初期化に使用されます。 2。\ _ \ _リソースのクリーンアップに使用される破壊。 3。\ _ \ _呼び出し、存在しないメソッド呼び出しを処理します。 4。\ _ \ _ get、dynamic属性アクセスを実装します。 5。\ _ \ _セット、動的属性設定を実装します。これらの方法は、特定の状況で自動的に呼び出され、コードの柔軟性と効率を向上させます。

ThinkPhp6ルーティング:中国語などの特殊文字を含むURLパラメーターを完全に取得する方法は? ThinkPhp6ルーティング:中国語などの特殊文字を含むURLパラメーターを完全に取得する方法は? Apr 01, 2025 pm 02:51 PM

ThinkPhp6ルーティングパラメーターは、中国と完全な買収で処理されます。 ThinkPhp6フレームワークでは、特殊文字(中国語や句読点など)を含むURLパラメーターがしばしば処理されます...

See all articles