The Tale Of Insecure Deserialization: A Journey From Serialization To Exploitation から学ぶ

medium.com

脆弱性:Insecure Deserialization

 

訳:

安全でない逆シリアル化は、最新の Web アプリケーションを動かすデータ構造そのものに潜む隠れた脅威です。
この脆弱性はアプリケーション全体に大損害を与える可能性があるにもかかわらず、気づかれないことがよくあります。

 

安全でない逆シリアル化について理解する:

安全でない逆シリアル化の問題は、アプリケーションまたはシステムが逆シリアル化されるデータを適切に検証およびサニタイズしない場合に発生します。
ここで、アプリケーションは信頼できないソースからのシリアル化されたデータを盲目的に信頼して処理します。

この問題を例で説明してみましょう。

ファイルからデータを逆シリアル化する Python アプリケーションがあるとします。

 

import pickle

def load_data(filename):

with open(filename, ‘rb’) as file:

data = pickle.load(file)

return data

user_data = load_data(‘user_data.pickle’)

 

ここで、攻撃者が「user_data」を os.system(“ls”) のような悪意のあるペイロードに置き換えると、システム上で任意のコードが実行される可能性があります。

攻撃者は、安全でない逆シリアル化の脆弱性を利用して、リモート コード実行 (RCE)、データ改ざん、サービス妨害などのさまざまな悪意のあるアクティビティを実行する可能性があります。

 

ステップ 1: アプリケーションにアクセスする

 

 

上に示されているのは、脆弱なアプリケーションのホームページです。アプリケーションの右上隅にある機能 (ライト モード) を除いて、多くの機能はないようです。

 

ステップ 2: アプリケーションを実行する

 

まず、アプリケーションが実行されている PHP コード スニペットにすぎない、私たちが提供するヒントを調べてみましょう。
このコードは、file_get_contents 関数を使用して文字列の形式でファイル名を返す __tostring() 関数を実装する GetThemeNameFromFile という名前のクラスで構成されています。

上記の PHP コードは、ダーク モードがオンかどうかを確認し、ダーク モードがオンの場合は unserialize() 関数を使用して、base64 デコードされた Cookie データを逆シリアル化し、そうでない場合は、Cookie データをさらに Base64 形式でエンコードしてシリアル化します。

 

 

関連する Cookie を検査すると、dark_mode キーの値 czo1OiJsaWdodCI7 が、base64エンコードされた文字列のように見えることがわかります。

任意のデコード ツールを使用してこれをデコードすると、データがシリアル化された形式であり、特定の形式に関連付けられている言語が PHP であることがわかります。
使用しました ここではcyberchef を

 

 

ステップ 3: パス トラバーサルを試す

その後、index.php ページに移動すると、dark_mode Cookie のシリアル化されていない値 ($darkModeData) が文字列としてエコーアウトされていることがわかり、ペイロードが実行されていることをさらに確認でき、サーバー ファイルを読み取ることができます。
さらに、保存されたフラグの場所に移動できます。

 

 

ステップ 4: エクスプロイト スクリプトを設計する

アプリケーションが PHP 言語を使用して値をシリアル化することがわかったので、利用する独自のスクリプトを簡単に作成できます。
場所に保存されているフラグを取得するスクリプトを作成しました ここでは、 /etc/flag の

 

 

上記のスクリプトは、GetThemeNameFromFile クラスの /etc/flag ファイルの内容を取得し、それをさらにシリアル化し、base64 形式にエンコードします。

スクリプトを実行すると、base64エンコードされた値が得られ、これを元の dark_mode の値に置き換えることができます。
ページを更新すると、悪用が成功したことを示すフラグが表示されます。

 

 

ほなほな。