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.
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.
Semasa proses penyahpepijatan, saya menghadapi beberapa masalah dan kalkulator tidak muncul dengan jayanya saya akan merekodkannya di sini.
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.
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!