Basic .Net deserialization (ObjectDataProvider gadget, ExpandedWrapper, and Json.Net)
Bu yazı, ObjectDataProvider gadget'ının nasıl sömürüldüğünü anlamak ve bu gadget ile Nesne serileştirme kütüphaneleri Json.Net ve xmlSerializer'ın nasıl kötüye kullanılabileceğini anlamak için ayrılmıştır.
ObjectDataProvider Gadget
Belgelerden: ObjectDataProvider Sınıfı, bir bağlama kaynağı olarak kullanabileceğiniz bir nesneyi sarmalar ve oluşturur. Evet, garip bir açıklama, o zaman bu sınıfın neden bu kadar ilginç olduğuna bakalım: Bu sınıf, keyfi bir nesneyi sarmamıza izin verir, MethodParameters kullanarak keyfi parametreler belirlememize ve ardından bu keyfi parametreler kullanılarak belirtilen keyfi nesnenin keyfi fonksiyonunu çağırmamıza izin verir. Bu nedenle, keyfi nesne, keyfi parametreler kullanarak belirtilen keyfi fonksiyonu çağıracak ve serileştirilirken bu fonksiyonu çalıştıracaktır.
Bu nasıl mümkün
ObjectDataProvider'ın tanımlandığı ve uygulandığı System.Windows.Data ad alanı, C:\Windows\Microsoft.NET\Framework\v4.0.30319\WPF
konumundaki PresentationFramework.dll içinde bulunur.
dnSpy kullanarak ilgilendiğimiz sınıfın kodunu inceleyebilirsiniz. Aşağıdaki resimde PresentationFramework.dll --> System.Windows.Data --> ObjectDataProvider --> Method adı kodunu görüyoruz.
MethodName
ayarlandığında base.Refresh()
çağrıldığını gözlemleyebilirsiniz, şimdi bu işlevin ne yaptığına bakalım:
Tamam, şimdi this.BeginQuery()
'nin ne yaptığını görmeye devam edelim. BeginQuery
, ObjectDataProvider
tarafından geçersiz kılınmış ve şunu yapar:
Kodun sonunda this.QueryWorke(null)
'ı çağırdığını unutmayın. Bu işlevin ne yaptığını görelim:
Bu, QueryWorker
işlevinin tam kodu değil, ancak ilginç kısmını gösteriyor: Kod, this.InvokeMethodOnInstance(out ex);
'ı çağırıyor, bu, belirtilen yöntemin çağrıldığı satır. Eğer sadece MethodName ayarlayarak bunun çalıştırılacağını kontrol etmek isterseniz, bu kodu çalıştırabilirsiniz:
Not edin, System.Windows.Data
'ı yüklemek için C:\Windows\Microsoft.NET\Framework\v4.0.30319\WPF\PresentationFramework.dll adresini referans olarak eklemeniz gerektiğini unutmayın.
ExpandedWrapper
Önceki açıktan yararlanarak, nesnenin bir ObjectDataProvider örneği olarak serileştirileceği durumlar olacaktır (örneğin DotNetDuke açığı, XmlSerializer kullanılarak nesne GetType
kullanılarak serileştirildi). Ardından, ObjectDataProvider örneğine sarılan nesne türü hakkında bilgi sahibi olmayacaksınız (Process
örneği için). DotNetDuke açığı hakkında daha fazla bilgiyi buradan bulabilirsiniz.
Bu sınıf, verilen bir örnekte kapsülenen nesnelerin türlerini belirtmeye olanak tanır. Bu nedenle, bu sınıf, bir kaynak nesneyi (ObjectDataProvider) yeni bir nesne türüne kapsüllüyebilir ve ihtiyacımız olan özellikleri sağlayabilir (ObjectDataProvider.MethodName ve ObjectDataProvider.MethodParameters). Bu, önceki sunulan durumlar gibi durumlar için çok yararlıdır, çünkü _ObjectDataProvider** öğesini bir **ExpandedWrapper _ örneğinin içine sarabiliriz ve bu sınıf serileştirildiğinde MethodName içinde belirtilen işlevi yürütecek OjectDataProvider öğesini oluşturacaktır.
Bu sarmalayıcıyı aşağıdaki kodla kontrol edebilirsiniz:
Json.Net
Resmi web sayfasında bu kütüphanenin Json.NET'in güçlü JSON serileştiricisi ile herhangi bir .NET nesnesini serileştirmeye ve serileştirmeye izin verdiği belirtilmektedir. Dolayısıyla, eğer ObjectDataProvider cihazını deserialize edebilirsek, bir nesneyi deserialize ederek bir Uzaktan Kod Çalıştırma (RCE) saldırısı gerçekleştirebiliriz.
Json.Net örneği
Öncelikle bu kütüphaneyi kullanarak bir nesneyi serileştirmek/deserileştirmek için bir örneğe bakalım:
Json.Net'i Kötüye Kullanma
ysoserial.net kullanarak saldırıyı oluşturdum:
Bu kodda saldırıyı test edebilirsiniz, sadece çalıştırın ve bir hesap makinesinin yürütüldüğünü göreceksiniz:
Last updated