Basic .Net deserialization (ObjectDataProvider gadget, ExpandedWrapper, and Json.Net)
Hierdie pos is toegewy aan om te verstaan hoe die gadget ObjectDataProvider uitgebuit word om RCE te verkry en hoe die Serialisering biblioteke Json.Net en xmlSerializer misbruik kan word met daardie gadget.
ObjectDataProvider Gadget
Uit die dokumentasie: die ObjectDataProvider Klas Wrapping en skep 'n objek wat jy kan gebruik as 'n binding bron. Ja, dit is 'n vreemde verduideliking, so kom ons kyk wat het hierdie klas wat so interessant is: Hierdie klas laat toe om 'n arbitrêre objek te wrapping, gebruik MethodParameters om arbitrêre parameters in te stel, en dan gebruik MethodName om 'n arbitrêre funksie van die arbitrêre objek wat met die arbitrêre parameters verklaar is, aan te roep. Daarom, die arbitrêre objek sal uitvoer 'n funksie met parameters terwyl dit gedeserialiseer word.
Hoe is dit moontlik
Die System.Windows.Data naamruimte, wat binne die PresentationFramework.dll by C:\Windows\Microsoft.NET\Framework\v4.0.30319\WPF
gevind word, is waar die ObjectDataProvider gedefinieer en geïmplementeer word.
Met dnSpy kan jy die kode van die klas waarin ons belangstel, ondersoek. In die beeld hieronder sien ons die kode van PresentationFramework.dll --> System.Windows.Data --> ObjectDataProvider --> Metode naam
Soos jy kan waarneem wanneer MethodName
gestel word, word base.Refresh()
aangeroep, kom ons kyk wat dit doen:
Goed, kom ons gaan voort om te sien wat this.BeginQuery()
doen. BeginQuery
word oorgeskryf deur ObjectDataProvider
en dit is wat dit doen:
Let daarop dat aan die einde van die kode dit this.QueryWorke(null)
aanroep. Kom ons kyk wat dit uitvoer:
Let daarop dat dit nie die volledige kode van die funksie QueryWorker
is nie, maar dit toon die interessante deel daarvan: Die kode roep this.InvokeMethodOnInstance(out ex);
aan dit is die lyn waar die metode stel aangeroep word.
As jy wil kyk dat net deur die MethodName** in te stel**, dit uitgevoer sal word**, kan jy hierdie kode uitvoer:
Let wel dat jy as verwysing C:\Windows\Microsoft.NET\Framework\v4.0.30319\WPF\PresentationFramework.dll moet byvoeg om System.Windows.Data
te laai.
ExpandedWrapper
Met behulp van die vorige ontploffing sal daar gevalle wees waar die object as 'n ObjectDataProvider instansie gedeserialiseer gaan word (byvoorbeeld in DotNetNuke kwesbaarheid, met behulp van XmlSerializer, is die object gedeserialiseer met GetType
). Dan sal daar geen kennis wees van die objektipe wat in die ObjectDataProvider instansie ingepak is (byvoorbeeld Process
). Jy kan meer inligting oor die DotNetNuke kwesbaarheid hier vind.
Hierdie klas laat toe om die objektipe van die objek wat ingepak is in 'n gegewe instansie te specifiseer. So, hierdie klas kan gebruik word om 'n bronobjek (ObjectDataProvider) in 'n nuwe objektipe in te pak en die eienskappe wat ons nodig het (ObjectDataProvider.MethodName en ObjectDataProvider.MethodParameters). Dit is baie nuttig vir gevalle soos die een wat voorheen aangebied is, omdat ons in staat sal wees om _ObjectDataProvider** binne 'n **ExpandedWrapper _ instansie te verpak en wanneer dit gedeserialiseer word sal hierdie klas die OjectDataProvider objek skep wat die funksie wat in MethodName aangedui is, sal uitvoer.
Jy kan hierdie wrapper met die volgende kode nagaan:
Json.Net
In die amptelike webblad word aangedui dat hierdie biblioteek toelaat om enige .NET objek met Json.NET se kragtige JSON serialiseerder te serialiseer en deserialiseer. So, as ons die ObjectDataProvider gadget kon deserialiseer, kon ons 'n RCE veroorsaak net deur 'n objek te deserialiseer.
Json.Net voorbeeld
Eerstens, kom ons kyk na 'n voorbeeld van hoe om 'n objek te serialiseer/deserialiseer met hierdie biblioteek:
Misbruik van Json.Net
Met ysoserial.net het ek die uitbuiting geskep:
In hierdie kode kan jy die eksploit toets, voer dit net uit en jy sal sien dat 'n kalkulator uitgevoer word:
Last updated