ORM Injection
Last updated
Last updated
Leer & oefen AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Leer & oefen GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
In hierdie pos word verduidelik hoe dit moontlik is om 'n Django ORM kwesbaar te maak deur byvoorbeeld 'n kode soos:
Let op hoe al die request.data (wat 'n json sal wees) direk aan filter objekke uit die databasis oorgedra word. 'n Aanvaller kan onverwagte filters stuur om meer data as verwag daaruit te lek.
Voorbeelde:
Teken in: In 'n eenvoudige aanmelding probeer om die wagwoorde van die gebruikers wat daarin geregistreer is, te lek.
Dit is moontlik om die wagwoord te brute-force totdat dit gelek word.
Relasionele filtrering: Dit is moontlik om verhoudings te traverseer om inligting uit kolomme te lek wat selfs nie verwag is om in die operasie gebruik te word nie. Byvoorbeeld, as dit moontlik is om artikels wat deur 'n gebruiker geskep is te lek met hierdie verhoudings: Article(created_by
) -[1..1]-> Author (user
) -[1..1]-> User(password
).
Dit is moontlik om die wagwoord van al die gebruikers wat 'n artikel geskep het, te vind
Baie-tot-baie verwantskap filtrering: In die vorige voorbeeld kon ons nie wagwoorde van gebruikers vind wat nie 'n artikel geskep het nie. Tog, deur ander verwantskappe te volg, is dit moontlik. Byvoorbeeld: Article(created_by
) -[1..1]-> Author(departments
) -[0..*]-> Department(employees
) -[0..*]-> Author(user
) -[1..1]-> User(password
).
In hierdie geval kan ons al die gebruikers in die departemente van gebruikers vind wat artikels geskep het en dan hul wagwoorde lek (in die vorige json lek ons net die gebruikersname, maar dit is dan moontlik om die wagwoorde te lek).
Misbruik van Django Groep en Toestemming baie-tot-baie verhoudings met gebruikers: Boonop word die AbstractUser-model gebruik om gebruikers in Django te genereer en standaard het hierdie model 'n paar baie-tot-baie verhoudings met die Toestemming en Groep tabelle. Wat basies 'n standaard manier is om ander gebruikers van een gebruiker te bekom as hulle in die dieselfde groep is of dieselfde toestemming deel.
Om filterbeperkings te omseil: Dieselfde blogpos het voorgestel om die gebruik van sommige filtrering soos articles = Article.objects.filter(is_secret=False, **request.data)
te omseil. Dit is moontlik om artikels wat is_secret=True het, te dump omdat ons van 'n verhouding terug na die Artikel tabel kan loop en geheime artikels van nie-geheime artikels kan lek omdat die resultate saamgevoeg word en die is_secret veld in die nie-geheime artikel nagegaan word terwyl die data van die geheime artikel gelek word.
Deur verhoudings te misbruik, is dit moontlik om selfs filters wat bedoel is om die data wat vertoon word te beskerm, te omseil.
Fout/Tyd gebaseer via ReDoS: In die vorige voorbeelde was dit verwag om verskillende antwoorde te hê as die filtrering gewerk het of nie om dit as orakel te gebruik. Maar dit kan moontlik wees dat 'n aksie in die databasis gedoen word en die antwoord altyd dieselfde is. In hierdie scenario kan dit moontlik wees om die databasisfout te maak om 'n nuwe orakel te kry.
From te same post regarding this vector:
SQLite: Het nie 'n regexp operator standaard nie (vereis die laai van 'n derdeparty uitbreiding)
PostgreSQL: Het nie 'n standaard regex tydsduur nie en is minder geneig tot terugspoeling
MariaDB: Het nie 'n regex tydsduur nie
Die volgende is tricks extracted from this post.
Volledige vind beheer:
Dit is moontlik om te sien dat die hele javascript liggaam aan prisma oorgedra word om navrae uit te voer.
In die voorbeeld van die oorspronklike pos, sou dit al die plasings wat deur iemand geskep is (elke plasing is deur iemand geskep) nagaan en ook die gebruikersinligting van daardie iemand teruggee (gebruikersnaam, wagwoord...)
Die volgende een selekteer al die plasings wat deur iemand met 'n wagwoord geskep is en sal die wagwoord teruggee:
Volledige waar-klousule beheer:
Kom ons kyk na hierdie waar die aanval die waar
klousule kan beheer:
Dit is moontlik om die wagwoord van gebruikers direk te filter soos:
Deur operasies soos startsWith
is dit moontlik om inligting te lek.
Baie-tot-baie relationele filtrering om filtrering te omseil:
Dit is moontlik om nie gepubliseerde artikels te lek deur terug te loop na die baie-tot-baie verhoudings tussen Category
-[*..*]-> Article
:
Dit is ook moontlik om al die gebruikers te lek deur sommige lus terug baie-tot-baie verhoudings te misbruik:
Error/Timed queries: In die oorspronklike pos kan jy 'n baie uitgebreide stel toetse lees wat uitgevoer is om die optimale payload te vind om inligting met 'n tydgebaseerde payload te lek. Dit is:
Waar die {CONTAINS_LIST}
'n lys is met 1000 stringe om te verseker dat die antwoord vertraag word wanneer die korrekte leak gevind word.
Hierdie truuks is gevind in hierdie pos.
Let daarop dat Ransack 4.0.0.0 nou die gebruik van 'n eksplisiete toelaat lys vir soekbare eienskappe en assosiasies afdwing.
Kwetsbare voorbeeld:
Let op hoe die navraag gedefinieer sal word deur die parameters wat deur die aanvaller gestuur word. Dit was moontlik om byvoorbeeld die reset-token met:
Deur brute-forcing en moontlik verhoudings was dit moontlik om meer data uit 'n databasis te lek.
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)