MS Access 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)
Konkatenacija stringova je moguća sa & (%26)
i + (%2b)
karakterima.
У MS Access-у нема коментара, али очигледно је могуће уклонити последњи део упита помоћу NULL карактера:
Ако ово не ради, увек можете исправити синтаксу упита:
Nisu podržane.
Operator LIMIT
nije implementiran. Međutim, moguće je ograničiti rezultate SELECT upita na prvih N redova tabele koristeći operator TOP
. TOP
prihvata kao argument ceo broj, koji predstavlja broj redova koji treba da budu vraćeni.
Just like TOP you can use LAST
which will get the redove sa kraja.
In a SQLi you usually will want to somehow execute a new query to extract information from other tables. MS Access always requires that in subupitima ili dodatnim upitima bude naznačen FROM
.
So, if you want to execute a UNION SELECT
or UNION ALL SELECT
or a SELECT
between parenthesis in a condition, you always need to indicate a FROM
with a valid table name.
Therefore, you need to know a valid table name.
Ovo će vam omogućiti da ekfiltrirate vrednosti trenutne tabele bez potrebe da znate ime tabele.
MS Access omogućava čudnu sintaksu kao što je '1'=2='3'='asd'=false
. Kao što obično biva, SQL injekcija će biti unutar WHERE
klauzule, što možemo zloupotrebiti.
Zamislite da imate SQLi u MS Access bazi podataka i znate (ili ste pogodili) da je jedno ime kolone username, i to je polje koje želite da ekfiltrirate. Možete proveriti različite odgovore web aplikacije kada se koristi tehnika chaining equals i potencijalno ekfiltrirati sadržaj sa boolean injection koristeći Mid
funkciju za dobijanje podstringova.
Ako znate ime tabele i kolone koju želite da izvučete, možete koristiti kombinaciju između Mid
, LAST
i TOP
da izvučete sve informacije putem boolean SQLi:
Feel free to check this in the online playground.
Korišćenjem tehnike povezivanja jednakosti možete takođe bruteforce-ovati imena tabela sa nečim poput:
Možete takođe koristiti tradicionalniji način:
Feel free to check this in the online playground.
Sqlmap uobičajeni nazivi tabela: https://github.com/sqlmapproject/sqlmap/blob/master/data/txt/common-tables.txt
Postoji još jedna lista na http://nibblesec.org/files/MSAccessSQLi/MSAccessSQLi.html
Možete brute-force trenutne nazive kolona koristeći trik sa povezivanjem jednakosti sa:
Ili sa group by:
Ili možete koristiti brute-force za imena kolona druge tabele sa:
Već smo razgovarali o tehnici povezivanja jednakosti za iskopavanje podataka iz trenutne i drugih tabela. Ali postoje i drugi načini:
Ukratko, upit koristi "if-then" izjavu kako bi aktivirao "200 OK" u slučaju uspeha ili "500 Internal Error" u suprotnom. Iskorišćavanjem TOP 10 operatora, moguće je izabrati prvih deset rezultata. Naknadna upotreba LAST omogućava da se razmatra samo 10. tuple. Na takvoj vrednosti, koristeći MID operator, moguće je izvršiti jednostavnu poredbu karaktera. Pravilnom promenom indeksa MID i TOP, možemo izvući sadržaj polja "username" za sve redove.
Mid('admin',1,1)
uzmi podstring sa pozicije 1 dužine 1 (početna pozicija je 1)
LEN('1234')
uzmi dužinu stringa
ASC('A')
uzmi ascii vrednost karaktera
CHR(65)
uzmi string iz ascii vrednosti
IIF(1=1,'a','b')
if then
COUNT(*)
prebroj broj stavki
Sa ovde možete videti upit za dobijanje imena tabela:
Međutim, imajte na umu da je vrlo tipično pronaći SQL injekcije gde nemate pristup za čitanje tabele MSysObjects
.
Znanje o apsolutnoj putanji web root-a može olakšati dalja napada. Ako greške aplikacije nisu potpuno sakrivene, putanja direktorijuma može biti otkrivena pokušajem selektovanja podataka iz nepostojeće baze podataka.
http://localhost/script.asp?id=1'+'+UNION+SELECT+1+FROM+FakeDB.FakeTable%00
MS Access odgovara sa porukom o grešci koja sadrži punu putanju web direktorijuma.
Sledeći napadni vektor može se koristiti za inferenciju postojanja fajla na udaljenom fajl sistemu. Ako navedeni fajl postoji, MS Access aktivira poruku o grešci koja obaveštava da je format baze podataka nevažeći:
http://localhost/script.asp?id=1'+UNION+SELECT+name+FROM+msysobjects+IN+'\boot.ini'%00
Drugi način za enumeraciju fajlova sastoji se u navođenju stavke database.table. Ako navedeni fajl postoji, MS Access prikazuje poruku o grešci formata baze podataka.
http://localhost/script.asp?id=1'+UNION+SELECT+1+FROM+C:\boot.ini.TableName%00
Ime baze podataka (.mdb) može se inferirati sledećim upitom:
http://localhost/script.asp?id=1'+UNION+SELECT+1+FROM+name[i].realTable%00
Gde je name[i] ime .mdb fajla i realTable je postojeća tabela unutar baze podataka. Iako će MS Access uvek aktivirati poruku o grešci, moguće je razlikovati između nevažećeg imena fajla i važećeg .mdb imena fajla.
Access PassView je besplatni alat koji se može koristiti za oporavak glavne lozinke baze podataka Microsoft Access 95/97/2000/XP ili Jet Database Engine 3.0/4.0.
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)