


Apache Shiro 1.2.4 Analisis Contoh Kerentanan Deserialisasi
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.
Kami terus mengikuti kaedah getRememberedIdentity:
Teruskan ikut kaedah getRememberedSerializedIdentity:
Dalam ini Dalam kaedah tersebut, kuki yang kami hantar dibaca dan base64 dinyahkodkan:
Seterusnya, Shiro akan memanggil convertBytesToPrincipals dan lulus tatasusunan bait yang dinyahkod base64 sebagai parameter:
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:
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:
Ia akan membuang apabila cuba menggunakan CommonsCollections1 yang disediakan oleh ysoserial Exception , tidak dapat berjaya
Semasa penyahpepijatan, saya mendapati pengecualian dilemparkan di sini Sangat mengelirukan mengapa tatasusunan bait tidak boleh dinyahsiri
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!

Alat AI Hot

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool
Gambar buka pakaian secara percuma

Clothoff.io
Penyingkiran pakaian AI

Video Face Swap
Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas

