SQL 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)
RootedCON ni tukio muhimu zaidi la usalama wa mtandao nchini Hispania na moja ya muhimu zaidi barani Ulaya. Kwa lengo la kukuza maarifa ya kiufundi, kongamano hili ni mahali pa kukutana kwa wataalamu wa teknolojia na usalama wa mtandao katika kila taaluma.
SQL injection ni kasoro ya usalama inayowezesha washambuliaji kuingilia kati maswali ya hifadhidata ya programu. Uthibitisho huu unaweza kuwapa washambuliaji uwezo wa kuangalia, kubadilisha, au kufuta data ambazo hawapaswi kufikia, ikiwa ni pamoja na taarifa za watumiaji wengine au data yoyote ambayo programu inaweza kufikia. Vitendo kama hivyo vinaweza kusababisha mabadiliko ya kudumu katika utendaji au maudhui ya programu au hata kuathiriwa kwa seva au kukatizwa kwa huduma.
Wakati tovuti inaonekana kuwa na udhaifu wa SQL injection (SQLi) kutokana na majibu yasiyo ya kawaida ya seva kwa pembejeo zinazohusiana na SQLi, hatua ya kwanza ni kuelewa jinsi ya kuingiza data katika swali bila kuharibu. Hii inahitaji kubaini njia ya kutoroka kutoka kwa muktadha wa sasa kwa ufanisi. Hizi ni baadhi ya mifano ya manufaa:
Kisha, unahitaji kujua jinsi ya kurekebisha ombi ili kutokuwepo na makosa. Ili kurekebisha ombi unaweza kuingiza data ili ombile la awali likubali data mpya, au unaweza tu kuingiza data yako na kuongeza alama ya maoni mwishoni.
Kumbuka kwamba ikiwa unaweza kuona ujumbe wa makosa au unaweza kutambua tofauti wakati ombi linafanya kazi na wakati halifanyi kazi, hatua hii itakuwa rahisi zaidi.
Njia ya kuaminika ya kuthibitisha udhaifu wa SQL injection inahusisha kutekeleza operesheni za kimantiki na kuangalia matokeo yanayotarajiwa. Kwa mfano, parameter ya GET kama ?username=Peter
inayotoa maudhui sawa inapobadilishwa kuwa ?username=Peter' au '1'='1
inaashiria udhaifu wa SQL injection.
Vivyo hivyo, matumizi ya operesheni za kihesabu yanatumika kama mbinu bora ya uthibitisho. Kwa mfano, ikiwa kufikia ?id=1
na ?id=2-1
kunatoa matokeo sawa, inaashiria SQL injection.
Mifano inayoonyesha uthibitisho wa operesheni za kimantiki:
Hii orodha ya maneno iliundwa ili kujaribu kuhakikisha SQLinjections kwa njia iliyoelezwa:
Katika baadhi ya matukio hutagundua mabadiliko yoyote kwenye ukurasa unaojaribu. Hivyo, njia nzuri ya kubaini SQL injections za kipofu ni kufanya DB ifanye vitendo na itakuwa na athari kwenye muda ambao ukurasa unahitaji kupakia. Hivyo, tutakuwa na kuunganisha katika ombi la SQL operesheni ambayo itachukua muda mrefu kukamilisha:
Katika baadhi ya matukio kazi za usingizi hazitaruhusiwa. Basi, badala ya kutumia kazi hizo unaweza kufanya uchunguzi ufanye operesheni ngumu ambazo zitachukua sekunde kadhaa. Mifano ya mbinu hizi zitajadiliwa tofauti kwenye kila teknolojia (ikiwa ipo).
Njia bora ya kutambua nyuma ni kujaribu kutekeleza kazi za nyuma tofauti. Unaweza kutumia sleep functions za sehemu ya awali au hizi (meza kutoka payloadsallthethings:
Pia, ikiwa una ufikiaji wa matokeo ya ombi, unaweza kufanya kuchapisha toleo la hifadhidata.
Kuendelea tutajadili mbinu tofauti za kutumia aina tofauti za SQL Injection. Tutatumia MySQL kama mfano.
Ikiwa unaweza kuona matokeo ya ombi hili ndilo njia bora ya kulitumia. Kwanza kabisa, tunahitaji kugundua idadi ya safu ambazo ombile la awali linarejesha. Hii ni kwa sababu ombile zote zinapaswa kurejesha idadi sawa ya safu. Mbinu mbili hutumiwa kawaida kwa kusudi hili:
Ili kubaini idadi ya safu katika ombi, ongeza taratibu idadi inayotumika katika ORDER BY au GROUP BY vifungu hadi jibu la uongo linapopatikana. Licha ya kazi tofauti za GROUP BY na ORDER BY ndani ya SQL, zote zinaweza kutumika kwa njia sawa ili kubaini idadi ya safu za ombi.
Chagua zaidi na zaidi thamani za null hadi uchunguzi uwe sahihi:
Unapaswa kutumia null
values kwani katika baadhi ya matukio aina ya safu za pande zote za swali lazima iwe sawa na null ni halali katika kila kesi.
Katika mifano ifuatayo tutapata jina la hifadhidata zote, jina la meza ya hifadhidata, majina ya safu za meza:
_ kuna njia tofauti za kugundua data hii kwenye kila hifadhidata tofauti, lakini daima ni ile ile mbinu._
Wakati matokeo ya ombi yanaonekana, lakini sindano ya msingi wa umoja inaonekana haiwezekani, inamaanisha kuwepo kwa sindano ya umoja iliyofichwa. Hali hii mara nyingi inasababisha hali ya sindano ya kipofu. Ili kubadilisha sindano ya kipofu kuwa ya msingi wa umoja, ombi la utekelezaji kwenye backend linahitaji kutambuliwa.
Hii inaweza kufanywa kwa kutumia mbinu za sindano ya kipofu pamoja na meza za kawaida maalum kwa Mfumo wa Usimamizi wa Hifadhidata (DBMS) wa lengo lako. Ili kuelewa meza hizi za kawaida, inashauriwa kushauriana na nyaraka za DBMS ya lengo.
Mara ombi litakapokuwa limetolewa, ni muhimu kubadilisha payload yako ili kufunga salama ombi la awali. Kisha, ombi la umoja linaongezwa kwenye payload yako, kuruhusu matumizi ya sindano ya umoja iliyopatikana hivi karibuni.
Kwa ufahamu wa kina zaidi, rejelea makala kamili inayopatikana kwenye Healing Blind Injections.
Ikiwa kwa sababu fulani huwezi kuona matokeo ya ombio lakini unaweza kuona ujumbe wa makosa, unaweza kufanya ujumbe huu wa makosa kuvuja data kutoka kwenye hifadhidata. Kufuata mtiririko sawa kama katika matumizi ya msingi wa umoja unaweza kuweza kudump DB.
Katika kesi hii huwezi kuona matokeo ya ombi au makosa, lakini unaweza kutofautisha wakati ombi linarudisha jibu halisi au feki kwa sababu kuna maudhui tofauti kwenye ukurasa. Katika kesi hii, unaweza kutumia tabia hiyo kutupa hifadhidata herufi kwa herufi:
Hii ni hali ile ile kama hapo awali lakini badala ya kutofautisha kati ya jibu la kweli/uwongo kutoka kwa ombi unaweza kutofautisha kati ya kosa katika ombi la SQL au la (labda kwa sababu seva ya HTTP inashindwa). Hivyo, katika kesi hii unaweza kulazimisha SQLerror kila wakati unapotabiri kwa usahihi herufi:
Katika kesi hii hakuna njia ya kutofautisha jibu la ombi kulingana na muktadha wa ukurasa. Lakini, unaweza kufanya ukurasa uchukue muda mrefu kupakia ikiwa herufi iliyokisiwa ni sahihi. Tayari tumeshuhudia mbinu hii ikitumika hapo awali ili kuhakikisha udhaifu wa SQLi.
Unaweza kutumia stacked queries ili kutekeleza maswali mengi kwa mfululizo. Kumbuka kwamba wakati maswali yanayofuata yanatekelezwa, matokeo hayarudishwi kwa programu. Hivyo, mbinu hii inatumika hasa kuhusiana na vulnerabilities za kipofu ambapo unaweza kutumia swali la pili kuanzisha utafutaji wa DNS, kosa la masharti, au kuchelewesha muda.
Oracle haisaidii stacked queries. MySQL, Microsoft na PostgreSQL zinaziunga mkono: QUERY-1-HERE; QUERY-2-HERE
Ikiwa hakuna njia nyingine ya unyakuzi iliyofanya kazi, unaweza kujaribu kufanya database iwasilishe taarifa kwa mwenyeji wa nje anayedhibitiwa na wewe. Kwa mfano, kupitia maswali ya DNS:
Check the SQLMap Cheatsheet to exploit a SQLi vulnerability with sqlmap.
Tumejadili tayari njia zote za kutumia udhaifu wa SQL Injection. Pata mbinu zaidi zinazotegemea teknolojia ya database katika kitabu hiki:
Au utaona mbinu nyingi kuhusu: MySQL, PostgreSQL, Oracle, MSSQL, SQLite na HQL katika https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/SQL%20Injection
RootedCON ni tukio muhimu zaidi la cybersecurity nchini Hispania na moja ya muhimu zaidi barani Ulaya. Kwa lengo la kukuza maarifa ya kiufundi, kongamano hili ni mahali pa kukutana kwa wataalamu wa teknolojia na cybersecurity katika kila taaluma.
Orodha ya kujaribu kupita kazi ya kuingia:
Login bypass ListHii query inaonyesha udhaifu wakati MD5 inatumika na kweli kwa pato la raw katika ukaguzi wa uthibitishaji, ikifanya mfumo kuwa hatarini kwa SQL injection. Washambuliaji wanaweza kutumia hii kwa kuunda ingizo ambazo, zinapohashwa, zinatoa sehemu zisizotarajiwa za amri za SQL, na kusababisha ufikiaji usioidhinishwa.
Orodha iliyo pendekezwa:
Unapaswa kutumia kama jina la mtumiaji kila mstari wa orodha na kama nywila kila wakati: Pass1234. (Hizi payloads pia zimejumuishwa katika orodha kubwa iliyotajwa mwanzoni mwa sehemu hii)
KAMA ' inakabiliwa unaweza kutumia %A8%27, na wakati ' inakabiliwa itaundwa: 0xA80x5c0x27 (╘')
Python script:
Ili kufanya hivyo unapaswa kujaribu kuunda kitu kipya kinachoitwa "kitu mkuu" (labda admin katika kesi ya watumiaji) kwa kubadilisha kitu:
Unda mtumiaji anayeitwa: AdMIn (herufi kubwa na ndogo)
Unda mtumiaji anayeitwa: admin=
SQL Truncation Attack (wakati kuna aina fulani ya kikomo cha urefu katika jina la mtumiaji au barua pepe) --> Unda mtumiaji mwenye jina: admin [nafasi nyingi] a
Ikiwa hifadhidata ina udhaifu na idadi ya juu ya herufi kwa jina la mtumiaji ni kwa mfano 30 na unataka kujifanya kuwa mtumiaji admin, jaribu kuunda jina la mtumiaji linaloitwa: "admin [nafasi 30] a" na nenosiri lolote.
Hifadhidata it hakiki ikiwa jina la mtumiaji lililoingizwa lipo ndani ya hifadhidata. Ikiwa siyo, it kata jina la mtumiaji hadi idadi ya juu ya herufi inayoruhusiwa (katika kesi hii hadi: "admin [nafasi 25]") na kisha it ondoa moja kwa moja nafasi zote mwishoni ikisasisha ndani ya hifadhidata mtumiaji "admin" kwa nenosiri jipya (kosa fulani linaweza kuonekana lakini haimaanishi kwamba hii haijafanya kazi).
Maelezo zaidi: https://blog.lucideus.com/2018/03/sql-truncation-attack-2018-lucideus.html & https://resources.infosecinstitute.com/sql-truncation-attack/#gref
Note: Shambulio hili halitafanya kazi kama ilivyoelezwa hapo juu katika usakinishaji wa hivi karibuni wa MySQL. Ingawa kulinganisha bado kunapuuzilia mbali nafasi za mwisho kwa chaguo-msingi, kujaribu kuingiza mfuatano mrefu zaidi ya urefu wa uwanja kutasababisha kosa, na kuingiza kutashindwa. Kwa maelezo zaidi kuhusu ukaguzi huu: https://heinosass.gitbook.io/leet-sheet/web-app-hacking/exploitation/interesting-outdated-attacks/sql-truncation
Ongeza ','',''
nyingi kadri unavyofikiri ili kutoka kwenye taarifa za VALUES. Ikiwa kuchelewesha kutelezwa, una SQLInjection.
Kifungu cha ON DUPLICATE KEY UPDATE
katika MySQL kinatumika kubainisha hatua ambazo hifadhidata inapaswa kuchukua wakati jaribio linafanywa kuingiza safu ambayo itasababisha thamani ya nakala katika index ya UNIQUE au KEY YA KUU. Mfano ufuatao unaonyesha jinsi kipengele hiki kinavyoweza kutumika kubadilisha nywila ya akaunti ya msimamizi:
Mfano wa Payload Injection:
Payload ya kuingiza inaweza kuandaliwa kama ifuatavyo, ambapo safu mbili zinajaribu kuingizwa kwenye jedwali la users
. Safu ya kwanza ni ya kudanganya, na safu ya pili inalenga barua pepe ya msimamizi aliyepo kwa nia ya kuboresha nywila:
Here's how it works:
The query attempts to insert two rows: one for generic_user@example.com
and another for admin_generic@example.com
.
If the row for admin_generic@example.com
already exists, the ON DUPLICATE KEY UPDATE
clause triggers, instructing MySQL to update the password
field of the existing row to "bcrypt_hash_of_newpassword".
Consequently, authentication can then be attempted using admin_generic@example.com
with the password corresponding to the bcrypt hash ("bcrypt_hash_of_newpassword" represents the new password's bcrypt hash, which should be replaced with the actual hash of the desired password).
When trying to create a new user and username, password and email are needed:
Kwa mbinu hii unaweza kutoa taarifa kwa kuunda akaunti 1 tu. Ni muhimu kutaja kwamba hauhitaji kutoa maoni yoyote.
Kutumia hex2dec na substr:
Ili kupata maandiko unaweza kutumia:
Kutumia hex na replace (na substr):
RootedCON ni tukio muhimu zaidi la usalama wa mtandao nchini Hispania na moja ya muhimu zaidi barani Ulaya. Kwa lengo la kukuza maarifa ya kiufundi, kongamano hili ni mahali pa kukutana kwa wataalamu wa teknolojia na usalama wa mtandao katika kila taaluma.
Routed SQL injection ni hali ambapo ombi linaloweza kuingizwa siyo lile linalotoa matokeo bali matokeo ya ombi linaloweza kuingizwa yanaenda kwa ombi linalotoa matokeo. (From Paper)
Mfano:
No Space (%20) - bypass kutumia mbadala za nafasi
No Whitespace - bypass kutumia maoni
No Whitespace - bypass using parenthesis
No Comma - bypass kutumia OFFSET, FROM na JOIN
Orodha ya mweusi ikitumia maneno muhimu - pitisha kwa kutumia herufi kubwa/ndogo
Blacklist kutumia maneno bila kujali herufi - pitia kwa kutumia opereta sawa
Unaweza kupata maelezo zaidi kuhusu hila hii katika gosecure blog. Kimsingi unaweza kutumia noti ya kisayansi kwa njia zisizotarajiwa ili WAF ipite:
Kwanza, zingatia kwamba ikiwa swali la asili na jedwali ambalo unataka kutoa bendera kutoka lina idadi sawa ya safu unaweza tu kufanya: 0 UNION SELECT * FROM flag
Inawezekana kufikia safu ya tatu ya jedwali bila kutumia jina lake kwa kutumia swali kama ifuatavyo: SELECT F.3 FROM (SELECT 1, 2, 3 UNION SELECT * FROM demo)F;
, hivyo katika sqlinjection hii itakuwa kama:
Au kutumia comma bypass:
This trick was taken from https://secgroup.github.io/2017/01/03/33c3ctf-writeup-shia/
RootedCON ni tukio muhimu zaidi la usalama wa mtandao nchini Hispania na moja ya muhimu zaidi barani Ulaya. Kwa lengo la kukuza maarifa ya kiufundi, kongamano hili ni mahali pa kukutana kwa wataalamu wa teknolojia na usalama wa mtandao katika kila taaluma.
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)