Basic .Net deserialization (ObjectDataProvider gadget, ExpandedWrapper, and Json.Net)
Last updated
Last updated
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Bu yazı, ObjectDataProvider aracının nasıl istismar edildiğini ve Json.Net ve xmlSerializer serileştirme kütüphanelerinin bu araçla nasıl kötüye kullanılabileceğini anlamaya adanmıştır.
Dokümantasyondan: ObjectDataProvider Sınıfı, bir bağlama kaynağı olarak kullanabileceğiniz bir nesneyi sarar ve oluşturur. Evet, bu garip bir açıklama, bu yüzden bu sınıfın ne kadar ilginç olduğunu görelim: Bu sınıf, keyfi bir nesneyi sarmaya izin verir, MethodParameters kullanarak keyfi parametreler ayarlamaya ve ardından MethodName kullanarak keyfi bir işlevi çağırmaya olanak tanır. Bu nedenle, keyfi nesne serileştirilirken parametrelerle bir işlevi çalıştıracaktır.
System.Windows.Data ad alanı, PresentationFramework.dll içinde C:\Windows\Microsoft.NET\Framework\v4.0.30319\WPF
konumunda tanımlanmış ve uygulanmıştır.
dnSpy kullanarak, ilgilendiğimiz sınıfın kodunu inceleyebilirsiniz. Aşağıdaki resimde PresentationFramework.dll --> System.Windows.Data --> ObjectDataProvider --> Method name kodunu görüyoruz.
Gördüğünüz gibi MethodName
ayarlandığında base.Refresh()
çağrılıyor, ne yaptığını görelim:
Tamam, şimdi this.BeginQuery()
ne yapıyor ona bakalım. BeginQuery
, ObjectDataProvider
tarafından geçersiz kılınmıştır ve işte yaptığı:
Kodun sonunda this.QueryWorke(null)
çağrıldığını not edin. Bunun neyi çalıştırdığını görelim:
Bu, QueryWorker
işlevinin tam kodu değildir, ancak ilginç kısmını gösterir: Kod this.InvokeMethodOnInstance(out ex);
çağrısını yapar, bu, metodun ayarlandığı satırdır.
Sadece MethodName ayarlayarak bunun çalıştırılacağını kontrol etmek istiyorsanız, bu kodu çalıştırabilirsiniz:
Not edin ki System.Windows.Data
yüklemek için C:\Windows\Microsoft.NET\Framework\v4.0.30319\WPF\PresentationFramework.dll referansı eklemeniz gerekiyor.
Önceki istismarı kullanarak, nesne bir ObjectDataProvider örneği olarak deseralize edileceği durumlar olacaktır (örneğin, DotNetNuke zafiyetinde, XmlSerializer kullanarak, nesne GetType
ile deseralize edildi). Bu durumda, ObjectDataProvider örneğinde sarılı olan nesne türü hakkında hiçbir bilgiye sahip olmayacağız (örneğin Process
). DotNetNuke zafiyeti hakkında daha fazla bilgi burada bulabilirsiniz.
Bu sınıf, belirli bir örnekte kapsüllenmiş olan nesnelerin nesne türlerini belirlemeye olanak tanır. Bu nedenle, bu sınıf bir kaynak nesneyi (ObjectDataProvider) yeni bir nesne türüne kapsüllemek ve ihtiyaç duyduğumuz özellikleri sağlamak için kullanılabilir (ObjectDataProvider.MethodName ve ObjectDataProvider.MethodParameters). Bu, daha önce sunulan durumlar için çok faydalıdır, çünkü ObjectDataProvider nesnesini bir ExpandedWrapper örneği içinde sarmalayabileceğiz ve deseralize edildiğinde bu sınıf, MethodName'de belirtilen fonksiyonu çalıştıracak olan OjectDataProvider nesnesini oluşturacaktır.
Bu sarmalayıcıyı aşağıdaki kod ile kontrol edebilirsiniz:
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. Yani, eğer ObjectDataProvider gadget'ını serileştirebilirsek, sadece bir nesneyi serileştirerek RCE'ye neden olabiliriz.
Öncelikle, bu kütüphaneyi kullanarak bir nesneyi nasıl serileştireceğimizi/serileştireceğimizi görelim:
ysoserial.net kullanarak, istismarı oluşturdum:
Bu kodda sömürüyü test edebilirsiniz, sadece çalıştırın ve bir hesap makinesinin çalıştığını göreceksiniz:
AWS Hacking'i öğrenin ve pratik yapın:HackTricks Eğitim AWS Kırmızı Takım Uzmanı (ARTE) GCP Hacking'i öğrenin ve pratik yapın: HackTricks Eğitim GCP Kırmızı Takım Uzmanı (GRTE)