找回密码
 立即注册
首页 业界区 业界 Oracle数据库注入基础入门

Oracle数据库注入基础入门

裒噎 2025-9-26 18:08:57
Oracle数据库注入基础入门

前排摘要:此随笔的案例取材大部分来自PortSwigger靶场
阅读时间:大约10分钟
学习原因

最近几天在研究BurpSuite官方的TOP10靶场,发现里面不仅仅包含了MySQL数据库的注入,还包含了其它数据库的SQL注入。对于MySQL数据库而言,相关的文章和教程可谓“百花齐放”。但Oracle数据库的注入,并且讲的相对于TOP10入门的新手而言,却寥寥无几。本篇作为个人学习随笔,并不具备学术专业性,仅作为自己记载的前提下,能帮助更多的新人学习Oracle数据库注入
资源共享
  1. 靶场地址:https://portswigger.net/web-security/all-labs
  2. Burpsuite靶场SQL注入篇记载:https://www.cnblogs.com/flyingfirework/articles/19103750
复制代码
一、SQL注入的原理(会MySQL数据库注入的佬,可以跳过)

SQL注入的本质是:将恶意的SQL代码插入到应用程序的输入参数中,欺骗后端数据库执行非预期的SQL命令。
文字可能解释得太笼统,不如来看示例
例一:SQL注入原理示例

假设这里有一个Web应用程序,主要功能是登录。那么可以猜测其后台代码可能是
  1. SELECT * FROM users WHERE username = ? AND password = ?【?处为用户输入的账号密码】
复制代码
我们都知道,你输入的东西,会被带往后台程序去执行。假如数据库账户里面有:
  1. username=admin;
  2. password=123456;
复制代码
那么正常登录情况,应该是
  1. SELECT * FROM users WHERE username = 'admin' AND password = '123456'
复制代码
数据库如果查询到了账户名为admin,密码为123456的账户,条件就会为真,即放行登录请求
那么,如果我们加入一点小小的程序谎言呢?
  1. SELECT * FROM users WHERE username = 'admin' or '1'='1' AND password = '123456'
  2. PS:【admin' or '1'='1】为用户输入的内容
复制代码
后端其实分不清楚哪些是程序员写的,哪些是用户输入的。站在程序角度思考,你输入的东西可以被当作命令语句执行,那我就当作命令语句执行
分析语句,可知 '1'='1'一定是成立的(恒真),这里采取了or运算,也就是单方面为真则整体为真,那么语句整体为真,就会放行登录请求
这就是SQL注入产生的逻辑
二、Oracle数据库注入与MySQL数据库的区别

其实并没有很大的区别
我们只需要记住Oracle数据库的几个特性与相关联的表即可
  1. 在MySQL中,一个SELECT可以不用对应FROM。但在Oracle数据库中,一个SELECT必须对应一个FROM
复制代码
这句话理解起来其实并不难,还是用例子来解释:
例二:Oracle数据库SELECT函数对应FROM示例

假设我们的注入语句如下(基于MySQL的注入方式)
  1. ?category=Gifts' union select 1,2,3--+
复制代码
这是一个很经典的测试返回位的注入语句,但是这样写,在Oracle数据库中会报错
Oracle数据库有一个单行虚拟表【dual】,当你不打算获取真实数据表的数据时,一般跟FROM dual
  1. ?category=Gifts' union select 1,2,3 from dual--+
复制代码
这是Oracle的特性之一,当然还有第二个特性:
  1. ?category=Gifts' union select column_name,NULL from information_schema.columns where table_name='users_vhfyyn'--+
复制代码
这是一个很经典的MySQL获取字段名的SQL注入语句。其中information_schema表是用于描述数据库中结构信息的表
说人话就是,information_schema数据表存放了数据库名/数据表名/数据列名
但是,Oracle数据库没有information_schema表,那该如何代替进行注入?
只是换了个名字而已,Oracle数据库也有类似的表:
  1. all_tables:列出当前用户可访问的表(自己拥有的 + 被授权访问的表)的信息
  2. all_tab_columns:列出当前用户可访问的表的列信息(自己拥有 + 被授权访问的表)
  3. user_tables:列出当前用户 自己拥有的表 的信息(只显示自己 schema 下的表)
  4. user_tab_columns:列出当前用户 自己拥有的表的列信息。
  5. dba_tables:显示数据库中 所有表 的信息,不论表属于哪个用户
  6. dba_tab_columns:显示数据库中 所有表的列信息,不论属于哪个 schema
复制代码
做个表格,更方便阅读:
1.png

那么,如果示例中的数据库是Oracle数据库,则我们应该改成:
  1. ?category=Gifts' union select column_name,NULL from all_tab_columns where table_name='USERS_ZLVTEV'--+
复制代码
如果你能看到这,你就可以做一些基础的Oracle数据库注入的实验了。

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

相关推荐

您需要登录后才可以回帖 登录 | 立即注册