Elastična pretraga
Uvod
Vjerojatno ste čuli za popularnu relacijsku bazu podataka nazvanu Mysql. Elastično pretraživanje poput Mysqla baza je podataka koja se koristi za čuvanje i ispitivanje podataka. Međutim, elastično pretraživanje obično se koristi za pretraživanje cjelovitog teksta na vrlo velikim skupovima podataka.
Osnove elastičnog pretraživanja
Definicija iz Googlea elastično pretraživanje opisuje kao: „ES je baza podataka orijentirana na dokumente dizajnirana za pohranu, pronalaženje i upravljanje dokumentima orijentiranim ili polustrukturiranim podacima. Kada koristite Elasticsearch , podatke pohranjujete u JSON obrazac dokumenta. Zatim ih tražite za pronalazak. “
Za razliku od Mysqla koji svoje podatke pohranjuje u tablice, elastično pretraživanje koristi nešto što se naziva vrstama. Svaka vrsta može imati nekoliko redaka koji se nazivaju dokumentima. Dokumenti su u osnovi json blob koji sadrže vaše podatke kao što je prikazano u primjeru u nastavku:
{“id”:1, “name”:”alen”, “password”:”SuperSecureP@ssword”}
U Mysqlu koristimo nazive stupaca, ali u Elastičnom pretraživanju koristimo imena polja. Imena polja u gornjoj json blob-i bit će id, ime i lozinka.
U Mysqlu bismo pohranili sve svoje tablice u bazu podataka. U Elastičnom pretraživanju dokumente pohranjujemo u nešto što se naziva indeks. Kazalo je u osnovi zbirka dokumenata.
Neautentificirano elastično pretraživanje DB-a
Elastično pretraživanje ima http poslužitelj pokrenut na portu 9200 koji se može koristiti za postavljanje upita u bazu podataka. Ovdje je glavno pitanje da mnogi ljudi ovu luku izlažu javnom internetu bez ikakve provjere autentičnosti. To znači da svatko može pitati bazu podataka i izvući informacije. Brza Shodan pretraga proizvest će niz rezultata kao što je prikazano u nastavku:
Nakon što utvrdite da je na vašem cilju otvoren port 9200, lako možete provjeriti je li to baza podataka Elastic Search pritiskom na korijenski direktorij s GET zahtjevom. Odgovor bi trebao izgledati otprilike ovako:
{
"name" : "r2XXXX",
"cluster_name" : "elasticsearch",
"cluster_uuid" : "wIVyutV-XXXXXXXXXX",
"version" : {
"number" : "5.6.1",
"build_hash" : "667b497",
"build_date" : "2021-04-19T19:22:05.189Z",
"build_snapshot" : false,
"lucene_version" : "6.6.1"
},
"tagline" : "You Know, for Search"
}
Jednom kada saznate da krajnja točka ima izloženi Elastic Search db, pokušajte pronaći sve indekse (baze podataka) koji su dostupni. To se može učiniti pritiskom na krajnju točku “/ _cat / indeksi? V” s GET zahtjevom. Ovdje će se naći svi indeksi kao što je prikazano u nastavku:
health status index uuid pri rep docs.count docs.deleted store.size pri.store.size
yellow open bookings lz8yHxqbQuGEDijkdEozAA 5 1 524 0 303.5kb 303.5kb
yellow open company HMOFvOQDSiapSoI_QAsxzg 5 1 0 0 960b 960b
yellow open geosys _J9pwm4vSrWLhbo9pchzMg 5 1 61722 0 32.4mb 32.4mb
yellow open article J6UaQSS0RIaRrrokZ1V6lg 5 1 809 0 6mb 6mb
yellow open service SApBMxLLSEWWJOrQoF07Ug 5 1 591 0 433.5kb 433.5kb
yellow open job_application DSibZjaoQ-mU1MySC4zKrQ 5 1 2 0 16.7kb 16.7kb
yellow open payment az5VYu9tQAy41u2PIA-daw 5 1 6 0 142.1kb 142.1kb
yellow open users 6kHqdkvOSx6dmXXIs_JGNg 5 1 1701 463 4.7mb 4.7mb
yellow open articles JKsFXGXfRXuUULpzjLuPLg 5 1 3 0 79.6kb 79.6kb
yellow open invoice bgXAHuOLSJaI-37eiBcRBw 5 1 18 0 272.3kb 272.3kb
yellow open booking zjbhkI4ZS8egwyuhweNY8g 5 1 545 1 1.7mb 1.7mb
yellow open address CKteiX6qRUCYWxkBZCe6Bg 5 1 6245 0 2mb 2mb
yellow open job_post qrzfzvvKT3uSOXIY3nzW6Q 5 1 36 0 344.6kb 344.6kb
yellow open user HZBWADUeST-pBY4c0L88Pw 5 1 2134 12 9.1mb 9.1mb
yellow open job_applications B9dyKfW7TbeJppKu-4zpvA 5 1 1 0 8.2kb 8.2kb
yellow open services 0cXzhBcoR8ecQMurouw6Qg 5 1 579 0 479kb 479kb
yellow open addressables ZM45C_69QXugOFLP-M16LQ 5 1 6245 745 2.4mb 2.4mb
yellow open job_posts _-nkfsW2TiKHLhTdSRmfuA 5 1 35 0 70.8kb 70.8kb
yellow open invoices PoNCOfg6QjSi0I7fPhPbBw 5 1 12 0 84.7kb 84.7kb
yellow open user_services bBwhZ0eDTAeqS5AID8Z-2g 5 1 1384 298 1.7mb 1.7mb
yellow open user_service _c75afkpQVWjyeWHQUoMDw 5 1 1485 22 1.2mb 1.2mb
yellow open payments de4kC0k-RfuoypmE19cLRw 5 1 6 0 114.8kb 114.8kb
Ove informacije, zajedno s ostalim detaljima o usluzi, također se mogu pronaći upitom krajnje točke “/ _stats /? Pretty = 1” .
Da biste izvršili pretraživanje cjelovitog teksta u bazi podataka, možete upotrijebiti sljedeću naredbu “/ _all / _search? Q = email” . Ovo će pitati svaki indeks za riječ “e-pošta”. Postoji nekoliko riječi koje volim tražiti, a koje uključuju:
- Korisničko ime
- korisnik
- zaporka
- znak
- ključ
Ako želite upitati određeni indeks, možete zamijeniti “_sve” imenom indeksa prema kojem želite pretraživati.
Još jedna korisna tehnika je popis svih imena polja upućivanjem GET zahtjeva do krajnje točke “/ INDEX_NAME_HERE / _mapping? Pretty = 1” . Obično tražim zanimljiva imena polja kao što su:
- Korisničko ime
- korisnik
- zaporka
- znak
- ključ
Izlaz bi trebao izgledati otprilike ovako:
{
"address" : {
"mappings" : {
"_default_" : {
"properties" : {
"text" : {
"type" : "text",
"fields" : {
"raw" : {
"type" : "keyword"
}
}
}
}
},
"addressables" : {
"properties" : {
"addressable_id" : {
"type" : "long"
},
"addressable_type" : {
"type" : "text",
"fields" : {
"keyword" : {
"type" : "keyword",
"ignore_above" : 256
}
}
},
"city" : {
"type" : "text",
"fields" : {
"keyword" : {
"type" : "keyword",
"ignore_above" : 256
}
}
Možemo vidjeti da imamo nazive polja addressable_type, grad i još mnogo toga što se ne prikazuje jer je izlaz bio velik.
Da biste postavili upit za sve vrijednosti koje sadrže određeno ime polja, upotrijebite sljedeću naredbu “/ _all / _search? Q = _exists: email & pretty = 1” . To će vratiti dokumente koji sadrže naziv polja (stupac) s imenom e-pošte kao što je prikazano u nastavku:
{
"took" : 12,
"timed_out" : false,
"_shards" : {
"total" : 110,
"successful" : 110,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : 7772,
"max_score" : 1.0,
"hits" : [
{
"_index" : "address",
"_type" : "addressables",
"_id" : "19",
"_score" : 1.0,
"_source" : {
"id" : 19,
"addressable_id" : 55,
"addressable_type" : "FHMatch\\Models\\User",
"lang" : "en",
"address1" : null,
"city" : "Alpharetta",
"state" : "GA",
"postal" : "30004",
"country" : "US",
"lat" : "REDACTED",
"lon" : "REDACTED",
"email" : "REDACTED@yahoo.com",
"phone" : "REDACTED",
"website" : null,
"timezone" : "America/New_York",
"currency" : "USD",
"privacy" : null,
"meta" : null,
"created_at" : "2017-09-26 19:42:02",
"updated_at" : "2017-09-26 19:42:02",
"deleted_at" : null
}
},
Opet možete zamijeniti “_all” imenom indeksa za obavljanje pretraživanja posebno prema toj krajnjoj točki.
Zaključak
Elastic Search je samo još jedna baza podataka u koju možete pohranjivati i tražiti informacije. Glavni je problem u tome što ljudi neovlaštenu web uslugu izlažu javnosti. Neovlaštenim pristupom web usluzi napadači mogu lako izbaciti cijelu bazu podataka.