Javaの直列化復元の脆弱性原理に(ケースのフォローアップは完璧なサプリメントではありません)

シリアライズとデシリアライズ

IMG

シリアル化アプリケーション:オブジェクトは、ネットワーク内の送信および保管を容易

Javaの直列化復元

直列化されたオブジェクトのストリームを変換することで、フォーマットは、貯蔵および輸送を容易に

シリアル化されたコントラストをデシリアライズし、ストリームオブジェクトを変換

たとえば、次のようにJSONシリアライズ、XMLシリアル化、バイナリシリアル、SOAPのシリアライズ

  • シリアル化:java.io.ObjectOutputStreamクラスwriteObject()

    標的配列の方法、目標出力ストリームに書き込まれたバイトのシーケンス(延長の.ser)

  • デシリアライズ:java.io.ObjectInputStreamクラスreadObject()

    その後、オブジェクトにデシリアライズされた入力ストリームから読み取られたバイトの配列

外部化と達成Serializableインタフェースオブジェクトクラスをシリアル化することができます。

ハザードの脆弱性

データベース操作などを行い、制御不能な結果コード実行、ファイル操作につながります

原則脆弱性

ユーザー入力用のJavaアプリケーションは、そのデータは、デシリアライズプロセスを実行するために信頼することができない場合、攻撃者は悪質な入力を構築することができますので、直列化復元オブジェクトが意図しない、予期しないオブジェクトを持って選択プロセスをもたらす可能性があります任意のコードの実行。

見つかった脆弱性

などのWebLogicは、WebSphere、JBossの、ジェンキンス、OpenNMSの、中に存在します

  • HTTPリクエストパラメータ、クッキーとパラメータ。
  • RMIプロトコル、RMIプロトコルが広く、フルの配列に基づいて使用されます
  • JMXオブジェクトに対して同じ処理シーケンス
  • 元のJavaオブジェクトを受信し、送信するためのカスタムプロトコル

脆弱性のマイニング

  1. OK、デシリアライゼーションのエントリポイントは、
    最初のreadObjectメソッドの呼び出し、検索後に運転を注入する次のステップを見つける必要があります。一般的には次の方法で検索することができます:

    1. ソース監査:検索は、呼び出しサイトは、関数のreadObjectの抗シリアライズを呼び出すかを決定するために、つまり、「ターゲット」を使用することができます。

    2. などのWireshark、tcpdumpのようなネットワーク動作キャプチャアプリケーション、データのシーケンスを見つけるために、

      ブラックボックストラフィック分析(可能インタビュー)

      パケット送信のJavaデシリアライゼーションにおいて、一般的に、二つの伝送モード、TCPパケット、典型的にはHTTPパケットでストリーミングバイナリが、主にBASE64で送信さがあります。このように、トラフィックの一部の機能があります。

      (1)TCP:aced0005必要があり、これはまた、デシリアライズするJavaの開始により、実質的に進ストリームを意味します。

      (2)HTTP:rO0ABが存在する必要があり、実際には、これは、base64エンコードaced0005の結果です。

      上記抗Javaの直列の存在を意味し、あなたはペイロード構造を攻撃しようとすることができます。

      ブラックボックスのJava RMI

      Java RMIはリモートオブジェクト(クラス)がオンデフォルト、サーバ呼び出しで1099リモート呼び出しが単独デシリアライゼーションおよびシリアライゼーションに基づいて基地ソケット通信に、ポート。

      ホワイトボックスコード監査

      (1)問題がある場合、クラスはSerializableインタフェースを実装して観察します。

      (2)問題がある場合、ロジックメソッドのreadObjectを書き換えるの関数として観察されました。

  2. クラスパスのアプリケーションは、Apache Commonsのコレクションライブラリが含まれているかどうかを再検討します

  3. 非直列化ペイロードを生成します

  4. 提出した当社のペイロードデータ

守備の脆弱性

  1. クラスホワイトリストのチェック機構:

    実際には、非常に単純な原理は、それが逆シリアル化のプロセスを開始する前に、チェックをするために名前を入力し、すべての着信非直列化されたオブジェクトで、ホワイトリストクラスが操作をデシリアライズしません満たしていません。明らかに、このリストは、確かに白いランタイム存在ではありません。

  2. JVMは、外部コマンドを実行禁止のRuntime.exec

    この措置は、SecurityManagerのを拡張することによって達成することができます。

おすすめ

転載: www.cnblogs.com/r0ckysec/p/11545903.html