Rumah  >  Artikel  >  Operasi dan penyelenggaraan  >  Apache Shiro 1.2.4 Analisis Contoh Kerentanan Deserialisasi

Apache Shiro 1.2.4 Analisis Contoh Kerentanan Deserialisasi

王林
王林ke hadapan
2023-05-16 19:40:241008semak imbas

0x00 Apache Shiro

Kerentanan komponen ini telah lama didedahkan, tetapi saya menemuinya semula baru-baru ini di tempat kerja saya kebetulan melihat bahan penyahserialisasian Java baru-baru ini, jadi saya memutuskan untuk mengeluarkannya Selepas analisis lanjut, kami juga menghadapi beberapa masalah pelik dalam tempoh tersebut.

Kebanyakan artikel analisis di Internet menambah kebergantungan commons-collections4-4.0 secara manual untuk menggunakan muatan CommonsCollections2 yang dijana oleh ysoserial Walau bagaimanapun, situasi yang saya hadapi ialah menggunakan CommonsBeanutils1 Anda boleh terus berjaya, jadi kami tidak akan mengulangi analisis CommonsCollections2 dalam talian di sini.

Analisis Nyahpepijat 0x01

Persekitaran nyahpepijat:

JDK 1.8.0_72

Tomcat 8.0.30

git clone https://github.com/apache/shiro.git shiro-rootcd shiro-root
git checkout 1.2.0

Untuk membuat sampel Shiro sendiri dijalankan, kita perlu membuat beberapa pengubahsuaian pada fail sampel/web/pom.xml Kita perlu menukar versi jstl kepada 1.2 dan memadam medan skop servlet-. api . Letakkan jstl-1.2.jar dalam direktori WEB-INF/lib. Kemudian anda sepatutnya dapat menjalankan dan nyahpepijat.

Kami menetapkan titik putus kepada kaedah resolvePrincipals dalam org.apache.shiro.mgt.DefaultSecurityManager, dan menghantar permintaan dengan RememberMe Cookie, dan ia sepatutnya boleh memecahkan.

Apache Shiro 1.2.4反序列化漏洞实例分析

Kami terus mengikuti kaedah getRememberedIdentity:

Apache Shiro 1.2.4反序列化漏洞实例分析Teruskan ikut kaedah getRememberedSerializedIdentity:

Apache Shiro 1.2.4反序列化漏洞实例分析Dalam ini Dalam kaedah tersebut, kuki yang kami hantar dibaca dan base64 dinyahkodkan:

Apache Shiro 1.2.4反序列化漏洞实例分析 Seterusnya, Shiro akan memanggil convertBytesToPrincipals dan lulus tatasusunan bait yang dinyahkod base64 sebagai parameter:

Apache Shiro 1.2.4反序列化漏洞实例分析

Anda juga boleh menekanya dengan nama fungsi Dua operasi dilakukan, iaitu penyahsulitan dan penyahserikan Mari kita lihat bahagian penyahsulitan dahulu Selepas penyahsulitan mudah, kami mendapati penyahsulitan AES, dan terdapat pratetap kunci Base64.decode("kPH+bIxk5D2deZiIxcaaaA==");.

IV yang ditemui dalam penyahsulitan AES juga diperoleh daripada beberapa bait pertama kuki yang kami hantar, jadi kami boleh membina nilai kuki yang mengandungi sebarang kandungan dan menyahsulit teks biasa dengan mudah Ia adalah kandungan bersiri, dan menyahsirikannya. dipanggil untuk penyahserialisasian.

Kaedah org.apache.shiro.io.DefaultSerializer#deserialize akhirnya akan dipanggil untuk penyahserikatan:
Apache Shiro 1.2.4反序列化漏洞实例分析

Seluruh prosesnya adalah sangat mudah. Baca Dapatkan kuki -> penyahkodan base64 -> Penyahsulitan AES

Jadi muatan kami sangat mudah untuk dibina.

0x02 Keraguan dan keraguan diselesaikan

Semasa proses penyahpepijatan, saya menghadapi beberapa masalah dan kalkulator tidak muncul dengan jayanya saya akan merekodkannya di sini.

1 Mengapakah ia gagal membina persekitaran setempat menggunakan CommonsBeanutils1 dan sentiasa menggesa pengecualian ClassNotFound?

Saya telah lama men-debug masalah ini, saya fikir ia adalah masalah dengan muatan atau kod Shiro telah berubah kerana usia , yang membuat saya sangat keliru. Kemudian, kami menemui masalah utama Dalam sampel yang kami klon daripada github, versi bergantung commons-beanutils ialah 1.8.3, dan versi muatan yang dijana oleh ysoserial ialah 1.9.2, jadi ia tidak boleh dilaksanakan dengan jayanya dalam sampel lalai daripada. Jadi saya menukar nombor versi kepada 1.9.2 dan ia menjadi popular.

Jadi dalam kes yang kami temui, versi persekitaran bergantung sebenar mungkin seperti ini, jadi kami boleh terus berjaya.

2. Jika kebergantungan saya tidak mempunyai pakej versi tinggi seperti commons-beanutils dan commons-collections, bagaimana saya boleh menggunakannya?

Selepas mengklonkan projek ini, anda dapat melihat bahawa terdapat pakej commons-collections:

Apache Shiro 1.2.4反序列化漏洞实例分析

Ia akan membuang apabila cuba menggunakan CommonsCollections1 yang disediakan oleh ysoserial Exception , tidak dapat berjaya

Apache Shiro 1.2.4反序列化漏洞实例分析Semasa penyahpepijatan, saya mendapati pengecualian dilemparkan di sini Sangat mengelirukan mengapa tatasusunan bait tidak boleh dinyahsiri

Apache Shiro 1.2.4反序列化漏洞实例分析

Saya menyemak perbezaan antara Class.forName() dan ClassLoader.loadClass() dalam Java dan mendapati bahawa forName() sentiasa menggunakan ClassLoader() pemanggil, manakala loadClass() Anda boleh tentukan sendiri ClassLoader yang berbeza. Jadi dari mana datangnya ClasssLoader dalam shiro? Ia diperoleh melalui Thread.currentThread().getContextClassLoader();, iaitu WebappClassLoader. Tetapi mengapa ia menggesa tatasusunan bait tidak boleh dimuatkan Selepas mencari seketika, saya melihat perbincangan di bawah pada blog oren dan mengetahui kebenaran keseluruhannya:

Shiro resovleClass menggunakan ClassLoader .loadClass() dan bukannya Class.forName(), dan ClassLoader.loadClass tidak menyokong memuatkan kelas jenis tatasusunan.

Atas ialah kandungan terperinci Apache Shiro 1.2.4 Analisis Contoh Kerentanan Deserialisasi. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:yisu.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam