NetDataContractSerializer, seperti DataContractSerializer, digunakan untuk mensiri dan menyahsiri data yang dihantar dalam mesej Windows Communication Foundation (WCF). Terdapat perbezaan penting antara kedua-duanya: NetDataContractSerializer termasuk CLR dan menyokong ketepatan jenis dengan menambahkan maklumat tambahan dan menyimpan rujukan kepada jenis CLR, manakala DataContractSerializer tidak. Oleh itu, NetDataContractSerializer hanya boleh digunakan jika jenis CLR yang sama digunakan pada bahagian bersiri dan penyahserikatan. Untuk mensirikan objek menggunakan kaedah WriteObject atau Serialize, dan untuk menyahsiri aliran XML gunakan kaedah ReadObject atau Deserialize. Dalam sesetengah senario, membaca aliran XML yang berniat jahat akan menyebabkan kerentanan penyahserialisasian, dengan itu mencapai serangan RCE jauh Pengarang artikel ini telah memperkenalkan dan mengeluarkannya dari perspektif prinsip dan pengauditan kod.
Kaedah Serialize teras ditakrifkan dalam antara muka IFormatter yang dilaksanakan oleh kelas SoapFormatter, yang boleh sangat mudah dilaksanakan untuk penukaran antara objek .NET dan aliran SOAP, data boleh disimpan sebagai fail XML. Pegawai menyediakan dua kaedah pembinaan.
Berikut ialah kes lama untuk menggambarkan masalah Mula-mula tentukan objek TestClass
mentakrifkan tiga ahli dan melaksanakan satu. kaedah statik ClassMethod memulakan proses. Serialisasi memberikan nilai kepada ahli dengan membuat kejadian objek masing-masing
Biasanya, Serialize digunakan untuk mendapatkan aliran SOAP bersiri, dan program asal diteruskan oleh. menggunakan ruang nama XML. Sebagai contoh, elemen permulaan kelas TestClass dalam rajah di bawah layak menggunakan xmlns yang dijana, memfokuskan pada ruang nama a1
<envelope> <body> <testclass> <classname>360</classname> <name>Ivan1ee</name> <age>18</age> </testclass> </body> </envelope>
Proses penyahserialisasian kelas SoapFormatter adalah untuk menukar aliran mesej SOAP kepada objek, yang dicapai dengan memanggil berbilang kaedah terlebih beban Deserialize dengan mencipta objek baharu ketahui bahawa antara muka IRemotingFormatter dan IFormatter dilaksanakan,
Lihat definisi antara muka IRemotingFormatter dan ketahui bahawa ia juga mewarisi IFormatter
3.2 Vektor serangan—ActivitySurrogateSelector
Selain pembina, takrif kelas SoapFormatter juga mempunyai atribut SurrogateSelector dan SurrogateSelector ialah pemilih proksi . Faedah proksi bersiri ialah apabila pemformat mahu menyahsiri tika jenis sedia ada, ia memanggil kaedah yang disesuaikan oleh objek proksi. Semak bahawa antara muka ISurrogateSelector dilaksanakan, ditakrifkan seperti berikutKod menentukan sama ada Atribut IsSerializable bagi jenis parser tersedia Jika kelas asas langsung tersedia untuk dikembalikan, jika tidak tersedia, dapatkan jenis kelas terbitan System.Workflow.ComponentModel.Serialization.ActivitySurrogateSelector, kemudian berikannya kepada Activator untuk mencipta contoh. , dan kemudian kembali ke badan kaedah GetObjectData Selain itu, untuk mengawal sepenuhnya data bersiri, Anda perlu melaksanakan antara muka Serialization.ISeralizable, yang ditakrifkan seperti berikut:
Untuk maklumat lanjut, sila rujuk ".NET Advanced Code Audit Lesson 2 Json.Net Deserialisasi Kerentanan" , apabila melaksanakan kelas penyahserikatan tersuai, baca kelas PocClass yang disediakan oleh penyerang melalui kaedah pembinaan
Angka berikut mentakrifkan kelas PayloadClass untuk melaksanakan antara muka ISerializable, dan kemudian mengisytiharkan koleksi Senarai generik dalam kaedah GetObjectData untuk menerima data jenis bait
Tambahkan objek PocClass pada koleksi Senarai, isytiharkan jenis generik dan gunakan IEnumerable collection map_type untuk menerima Jenis yang diperolehi oleh pantulan pemasangan dan kembalikan jenis IEnumerable Akhir sekali, gunakan Activator.CreateInstance untuk buat contoh dan simpan ke e3 Ini adalah koleksi penghitungan.
Gambar di atas mengisi pembolehubah e3 ke dalam sumber data kawalan paging. Semak definisi kelas PageDataSource untuk melihatnya dengan jelas >
Kecuali Selain itu, jenis yang dikembalikan oleh System.Runtime.Remoting.Channels.AggregateDictionary menyokong IDictionary, dan kemudian membuat instantiat objek DesignerVerb dan memberikan nilai sesuka hati Kelas ini digunakan terutamanya untuk mengisi nilai daripada atribut sifat kelas MenuCommand, dan akhirnya baldi yang layak dalam jadual cincang.
Seterusnya, gunakan koleksi untuk menambah sumber data DataSet dan objek DataTable yang diwarisi daripada kelas System.ComponentModel.MarshalByValueComponent, yang boleh menyerikan data dan. menyokong pemprosesan jauh antara muka ISerializable , yang merupakan satu-satunya objek di antara objek ADO.NET yang menyokong pengalihan jauh dan dikekalkan dalam format binari.
Tukar nilai DataSet.RemotingFormat kepada SerializationFormat.Binary, tukar harta DataSet.CaseSensitive kepada false, dsb., dan kemudian panggil BinaryFormatter untuk menyerikan Senarai koleksi, seperti yang ditunjukkan di bawah.
Oleh kerana atribut RemotingFormat ditentukan sebagai Binari, pemformat BinaryFormatter diperkenalkan dan ejen SurrogateSelector atribut ditentukan sebagai kelas MySurrogateSelector tersuai. Selepas bersiri, SOAP-XML diperoleh, dan kemudian kaedah Deserialize objek SoapFormatter digunakan untuk menghuraikan data strim kandungan fail baca, dan kalkulator berjaya muncul
Memandangkan hos Windows pengarang telah ditampal dengan CVE-2017-8565 (Kerentanan Pelaksanaan Kod Jauh Windows PowerShell ), eksploitasi itu tidak berjaya, jadi inilah Tanpa perbincangan lanjut, rakan-rakan yang berminat boleh membuat kajian sendiri. Untuk mendapatkan maklumat terperinci tentang tampung, sila rujuk: https://support.microsoft.com/zh-cn/help/4025872/windows-powershell-remote-code-execution-vulnerability
44.1
Kos serangan bagi kerentanan titik pencemaran jenis ini adalah sangat rendah Penyerang hanya perlu mengawal sumber parameter rentetan masuk mudah mencapai penyahserikatan. Eksploitasi kelemahan dan timbulkan kalkulator.
4.2 Pembacaan Fail
Atas ialah kandungan terperinci SoapFormatter analisis contoh kelemahan deserialisasi. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!