ORM Injection
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)
Katika post hii inaelezwa jinsi inavyowezekana kufanya Django ORM iwe hatarini kwa kutumia kwa mfano msimbo kama:
Kumbuka jinsi request.data yote (ambayo itakuwa json) inapitishwa moja kwa moja kwa filter objects from the database. Mshambuliaji anaweza kutuma vichujio visivyotarajiwa ili kuweza kupata data zaidi kuliko ilivyotarajiwa kutoka kwake.
Mifano:
Login: Katika kujaribu kuingia rahisi jaribu kuvuja nywila za watumiaji waliojiandikisha ndani yake.
Inawezekana kulazimisha nenosiri hadi litapotea.
Filtering ya uhusiano: Inawezekana kupita katika uhusiano ili kupoteza taarifa kutoka kwa safu ambazo hata hazikutarajiwa kutumika katika operesheni. Kwa mfano, ikiwa inawezekana kupoteza makala zilizoundwa na mtumiaji mwenye uhusiano hizi: Article(created_by
) -[1..1]-> Author (user
) -[1..1]-> User(password
).
Inawezekana kupata nywila za watumiaji wote ambao wameunda makala
Uchujaji wa uhusiano wa wengi kwa wengi: Katika mfano uliopita hatungeweza kupata nywila za watumiaji ambao hawajaunda makala. Hata hivyo, kufuatia uhusiano mwingine hii inawezekana. Kwa mfano: Article(created_by
) -[1..1]-> Author(departments
) -[0..*]-> Department(employees
) -[0..*]-> Author(user
) -[1..1]-> User(password
).
Katika kesi hii tunaweza kupata watumiaji wote katika idara za watumiaji ambao wameunda makala na kisha kuvuja nywila zao (katika json ya awali tunavuja tu majina ya watumiaji lakini kisha inawezekana kuvuja nywila).
Kutitisha Mahusiano ya Django Group na Permission ya wengi-kwa-wengi na watumiaji: Aidha, mfano wa AbstractUser unatumika kuunda watumiaji katika Django na kwa kawaida mfano huu una mahusiano mengi-kwa-mengi na meza za Permission na Group. Ambayo kimsingi ni njia ya kawaida ya kufikia watumiaji wengine kutoka kwa mtumiaji mmoja ikiwa wako katika kikundi sawa au wanashiriki ruhusa sawa.
Kupita vizuizi vya filtr: Blogu hiyo hiyo ilipendekeza kupita matumizi ya filtr fulani kama articles = Article.objects.filter(is_secret=False, **request.data)
. Inawezekana kutoa makala ambazo zina is_secret=True kwa sababu tunaweza kurudi nyuma kutoka kwa uhusiano hadi kwenye jedwali la Article na kuvuja makala za siri kutoka kwa makala zisizo za siri kwa sababu matokeo yanajumuishwa na uwanja wa is_secret unakaguliwa katika makala zisizo za siri wakati data inavuja kutoka kwa makala za siri.
Kukandamiza uhusiano kunawezesha kupita hata filters zilizokusudiwa kulinda data inayonyeshwa.
Error/Time based via ReDoS: Katika mifano ya awali ilitarajiwa kuwa na majibu tofauti ikiwa filtering ilifanya kazi au la ili kuitumia kama oracle. Lakini inaweza kuwa inawezekana kwamba hatua fulani inafanywa katika database na jibu kila wakati ni sawa. Katika hali hii inaweza kuwa inawezekana kufanya makosa ya database kupata oracle mpya.
From te same post regarding this vector:
SQLite: Haina operator wa regexp kwa default (inahitaji kupakia nyongeza ya upande wa tatu)
PostgreSQL: Haina muda wa regex wa default na ni rahisi kidogo kwa backtracking
MariaDB: Haina muda wa regex
The following are tricks extracted from this post.
Full find control:
It's possible to see that the whole javascript body is passed to prisma to perform queries.
In the example from the original post, this would check all the posts createdBy someone (each post is created by someone) returning also the user info of that someone (username, password...)
Hii ifuatayo inachagua machapisho yote yaliyoundwa na mtu mwenye nenosiri na itarudisha nenosiri:
Udhibiti kamili wa kipengele cha where:
Tuchunguze hii ambapo shambulio linaweza kudhibiti kipengele cha where
:
Inawezekana kuchuja nywila za watumiaji moja kwa moja kama:
Kwa kutumia operesheni kama startsWith
inawezekana kuvuja taarifa.
Kupita filtering ya uhusiano wa wengi kwa wengi:
Ni possible kuvuja makala ambazo hazijachapishwa kwa kurudi nyuma kwenye uhusiano wa wengi-kwa-wengi kati ya Category
-[*..*]-> Article
:
Ni pia inawezekana kuvuja watumiaji wote kwa kutumia baadhi ya uhusiano wa mzunguko wa wengi kwa wengi:
Error/Timed queries: Katika chapisho la awali unaweza kusoma seti kubwa ya majaribio yaliyofanywa ili kupata mzigo bora wa kuvuja habari kwa kutumia mzigo wa muda. Hii ni:
Where the {CONTAINS_LIST}
is a list with 1000 strings to make sure the jibu linacheleweshwa wakati uvujaji sahihi unapatikana.
These tricks where found in this post.
Kumbuka kwamba Ransack 4.0.0.0 sasa inalazimisha matumizi ya orodha ya ruhusa wazi kwa sifa na ushirikiano unaoweza kutafutwa.
Mfano unaoweza kuathiriwa:
Kumbuka jinsi uchunguzi utavyofafanuliwa na vigezo vilivyotumwa na mshambuliaji. Ilikuwa inawezekana kwa mfano kulazimisha nguvu token ya kurekebisha kwa:
Kwa kutumia brute-forcing na uhusiano wa uwezekano, ilikuwa inawezekana kuvuja data zaidi kutoka kwa hifadhidata.
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)