ORM Injection
Django ORM (Python)
Katika post hii inaelezwa jinsi inavyowezekana kufanya Django ORM iwe hatarini kwa kutumia kwa mfano msimbo kama:
Angalia jinsi request.data yote (ambayo itakuwa json) inapitishwa moja kwa moja kwa filter objects from the database. Mshambuliaji anaweza kutuma filters zisizotarajiwa ili kuweza kupata data zaidi ya ile iliyotarajiwa 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 hawajaandika 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 Django Group na Permission many-to-many relations na watumiaji: Aidha, mfano wa AbstractUser unatumika kuunda watumiaji katika Django na kwa kawaida mfano huu una uhusiano wa many-to-many na Permission na Group tables. 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 vichujio vilivyokusudiwa kulinda data inayonyeshwa.
Error/Time based via ReDoS: Katika mifano ya awali ilitarajiwa kuwa na majibu tofauti ikiwa uchujaji ulifanya kazi au la ili kutumia hiyo kama oracle. Lakini inaweza kuwa inawezekana kwamba hatua fulani inachukuliwa 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 ya regexp kwa default (inahitaji kupakia nyongeza ya upande wa tatu)
PostgreSQL: Haina muda wa timeout wa regex wa default na ni rahisi kidogo kwa backtracking
MariaDB: Haina muda wa timeout wa regex
Prisma ORM (NodeJS)
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...)
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 mchakato wa kuchuja wa uhusiano wa wengi kwa wengi:
Ni inawezekana 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 asili 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.
Ransack (Ruby)
These tricks where found in this post.
Kumbuka kwamba Ransack 4.0.0.0 sasa inatekeleza 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.
Marejeo
Last updated