PJBlog安全性分析
PJBlog2是PuterJam開發(fā)的一款免費(fèi)的ASP + Access的個(gè)人blog系統(tǒng),這幾天偶想弄個(gè)blog來(lái)玩玩,經(jīng)過比較選中了功能、界面都相對(duì)較好的PJBlog2。經(jīng)過試用,感覺這blog還不錯(cuò),也發(fā)現(xiàn)幾個(gè)安全方面的小問題,就把我的一點(diǎn)點(diǎn)見解發(fā)出來(lái)。我分析的版本是05年12月11日發(fā)布的PJBlog2 v2.4.1211版本。
一、 密碼加密算法
PJBlog2沒有采用常用的MD5算法對(duì)用戶密碼加密,而是使用的SHA1算法。SHA1算法跟MD5類似,也是單向散列函數(shù),不過它對(duì)任意長(zhǎng)度的數(shù)據(jù)進(jìn)行處理輸出160位的數(shù)值。
PJBlog2在創(chuàng)建新用戶的時(shí)候會(huì)隨機(jī)生成一個(gè)6位的字符串Salt,用戶的明文密碼加上這個(gè)Salt值再進(jìn)行hash才得到加密后的密碼。即:Password = SHA1(user_pwd & Salt)。這樣子做的好處是即使兩個(gè)一樣的密碼hash后的結(jié)果也完全不同。這個(gè)稍微“另類”的算法給破解密碼帶來(lái)了點(diǎn)難度。
呵呵,有難度不等于不能破解,網(wǎng)上沒有現(xiàn)成的程序,需要自己動(dòng)手寫個(gè)才是。因?yàn)?NET提供了SHA1的類所以最初用VB.Net寫的,由于狂耗資源的問題一直解決不了,只好換C了。用C實(shí)現(xiàn)SHA1的源代碼我找了好久才在一個(gè)老外的站找到,還不錯(cuò),呵呵,有興趣的可以看下老外的SHA1類:http://www.codeproject.com/cpp/csha1.asp
程序可以在這里( http://www.0x54.org/lake2/program/PJBlogCracker.exe )下載,是命令行下的,功能比較弱,單線程速度超級(jí)慢,可能還有bug,諸多問題以后再改咯。
二、 登陸認(rèn)證
PJBlog2的認(rèn)證方式是用的Cookies加IP。當(dāng)用戶登陸成功,系統(tǒng)隨機(jī)產(chǎn)生一個(gè)Hashkey寫入Cookies并記錄到數(shù)據(jù)庫(kù)中,然后通過Cookies里的Hashkey、Username還有IP來(lái)判斷用戶。Cookies好辦,可以用跨站、下數(shù)據(jù)庫(kù)等方式拿,可以這IP就難辦了,看來(lái)進(jìn)行Cookies欺騙的可能性很小啊。呵呵,那就不看這個(gè)咯。
三、 幾個(gè)地方過濾不嚴(yán)
第一個(gè)就是統(tǒng)計(jì)訪問的referer過濾不嚴(yán)??矗?
Guest_Refer=Trim(Request.ServerVariables("HTTP_REFERER"))
Conn.ExeCute("INSERT INTO blog_Counter(coun_IP,coun_OS,coun_Browser,coun_Referer) VALUES ('"&Guest_IP&"','"&Guest_Browser(1)&"','"&Guest_Browser(0)&"','"&CheckStr(Guest_Refer)&"')")
呵呵,只是把referer過濾后用CheckStr檢查之,看CheckStr代碼:
'*************************************
'過濾特殊字符
'*************************************
Function CheckStr(byVal ChkStr)
Dim Str:Str=ChkStr
Str=Trim(Str)
If IsNull(Str) Then
CheckStr = ""
Exit Function
End If
Str = Replace(Str, "&", "&")
Str = Replace(Str,"'","'")
Str = Replace(Str,"""",""")
Dim re
Set re=new RegExp
re.IgnoreCase =True
re.Global=True
re.Pattern="(w)(here)"
Str = re.replace(Str,"$1here")
re.Pattern="(s)(elect)"
Str = re.replace(Str,"$1elect")
re.Pattern="(i)(nsert)"
Str = re.replace(Str,"$1nsert")
re.Pattern="(c)(reate)"
Str = re.replace(Str,"$1reate")
re.Pattern="(d)(rop)"
Str = re.replace(Str,"$1rop")
re.Pattern="(a)(lter)"
Str = re.replace(Str,"$1lter")
re.Pattern="(d)(elete)"
Str = re.replace(Str,"$1elete")
re.Pattern="(u)(pdate)"
Str = re.replace(Str,"$1pdate")
re.Pattern="(\s)(or)"
Str = re.replace(Str,"$1or")
Set re=Nothing
CheckStr=Str
End Function
過濾了單引號(hào)、雙引號(hào)、連接符等,不過最重要的“<”和“>”卻沒有過濾。呵呵,跨站腳本攻擊又有用武之地了。注意只顯示前面40個(gè)字符在頁(yè)面,要好好構(gòu)造哦。
第二就是游客評(píng)論輸入用戶名也是用的CheckStr過濾,用戶名數(shù)據(jù)庫(kù)有限制,24個(gè)字符,這里構(gòu)造CSS就更有難度了,不過可以有別的用處,具體的嘛,呵呵,后文詳述。
有些blog主人禁止了游客評(píng)論,所以就只好注冊(cè)后再評(píng)論了,但是注冊(cè)后評(píng)論的名字文本框被設(shè)成了注冊(cè)名而且只讀,怎么辦?呵呵,沒關(guān)系,可以外部提交數(shù)據(jù)的。
再一個(gè)就是blog的留言板插件,還是用戶名沒過濾好,這個(gè)更難利用,只有20個(gè)字符哦。
四、 數(shù)據(jù)庫(kù)的問題
PJBlog2的默認(rèn)數(shù)據(jù)庫(kù)名為pblog.asp,雖然數(shù)據(jù)庫(kù)里面有個(gè)貌似防下載的blog_Notdownload表,呵呵,訪問數(shù)據(jù)庫(kù)試試,可以下載的哦。
既然可以下載,當(dāng)然可以插入asp代碼運(yùn)行咯。有些地方(比如游客評(píng)論內(nèi)容)插入asp代碼會(huì)被扯開,不知道原因,郁悶。
經(jīng)測(cè)試評(píng)論的姓名里是可以插ASP代碼的。前面說(shuō)了這里過濾不嚴(yán),這樣插入數(shù)據(jù)庫(kù)的asp不會(huì)被顯示出來(lái)的,看到的只是個(gè)沒名字的家伙在唧唧歪歪,呵呵。這個(gè)可要好好構(gòu)造哦,24個(gè)字符而且"被過濾了,想了一下,正好找到一個(gè)最短的,恰好24個(gè)字符:<%eval request(chr(9))%>
留言版的內(nèi)容也可以插入asp代碼,不過管理員看留言時(shí)看得到的哦。
呵呵,當(dāng)然大多數(shù)站長(zhǎng)應(yīng)該都是改了數(shù)據(jù)庫(kù)名稱的,但是測(cè)試時(shí)還是發(fā)現(xiàn)少數(shù)人不改……
五、 上傳文件
出于安全的考慮,PJBlog2限制了上傳文件類型,包括asp、asa、aspx、cer、cdx、htr。其實(shí)現(xiàn)在很多虛擬主機(jī)不僅支持asp,還會(huì)支持aspx、php、perl的,而且也可以上傳shtml等格式,所以如果既然要限制最好是把所有服務(wù)器執(zhí)行文件的類型一起限制才是。
上傳文件這里還有點(diǎn)問題,看attachment.asp里的代碼:
Dim F_File,F_Type
Set F_File=FileUP.File("File")
F_Name=randomStr(1)&Year(now)&Month(now)&Day(now)&Hour(now)&Minute(now)&Second(now)&"."&F_File.FileExt
F_Type=FixName(F_File.FileExt)
IF F_File.FileSize > Int(UP_FileSize) Then
Response.Write("<div style=""padding:6px""><a href='attachment.asp'>文件大小超出,請(qǐng)返回重新上傳</a></div>")
ElseIF IsvalidFile(UCase(F_Type)) = False Then
Response.Write("<div style=""padding:6px""><a href='attachment.asp'>文件格式非法,請(qǐng)返回重新上傳</a></div>" )
Else
F_File.SaveAs Server.MapPath("attachments/"&D_Name&"/"&F_Name)
response.write "<script>addUploadItem('"&F_Type&"','attachments/"&D_Name&"/"&F_Name&"',"&Request.QueryString("MSave")&")</script>"
Response.Write("<div style=""padding:6px""><a href='attachment.asp'>文件上傳成功,請(qǐng)返回繼續(xù)上傳</a></div>")
End IF
保存文件的后綴是F_File.FileExt,而檢查的是經(jīng)過FixName()函數(shù)處理的后綴,那就看看fixname函數(shù)定義,在function.asp中:
'*************************************
'過濾文件名字
'*************************************
Function FixName(UpFileExt)
If IsEmpty(UpFileExt) Then Exit Function
FixName = Ucase(UpFileExt)
FixName = Replace(FixName,Chr(0),"")
FixName = Replace(FixName,".","")
FixName = Replace(FixName,"ASP","")
FixName = Replace(FixName,"ASA","")
FixName = Replace(FixName,"ASPX","")
FixName = Replace(FixName,"CER","")
FixName = Replace(FixName,"CDX","")
FixName = Replace(FixName,"HTR","")
End Function
呵呵,它把危險(xiǎn)后綴過濾了的,如果我的文件后綴是asp(0x00)gif,那么檢查的時(shí)候過濾chr(0)和asp,后綴就成了gif,通過,保存的時(shí)候就是asp(0x00)gif。從理論上來(lái)說(shuō)是對(duì)的啊,我搞了半天也不行,郁悶。有知道的大俠告訴我啊。
不過我們可以利用這個(gè)上傳aspx格式。呵呵,我們上傳aspx文件,fixname函數(shù)過濾asp,于是后綴就成了x。只要把x設(shè)為可以上傳的格式,就可以傳aspx文件了。
六、 附件管理問題
管理員登陸后有個(gè)附件管理功能,看他參數(shù)類似于http://localhost/blog/ConContent.asp?Fmenu=SQLFile&Smenu=Attachments&AttPath=attachments/month_0512,可以通過指定AttPath瀏覽web目錄的哦。
但是系統(tǒng)限制了站外提交數(shù)據(jù),所以不能直接改url,那就“曲線救國(guó)”吧。找到友情鏈接添加功能,url就填上我們構(gòu)造的url,保存,然后點(diǎn)查看,就繞過站外的限制了。注意構(gòu)造的AttPath的第一個(gè)字符不能是“.”和“/”哦,程序有檢查的。我們這樣構(gòu)造就可以跳到blog根目錄:http://localhost/blog/ConContent.asp?Fmenu=SQLFile&Smenu=Attachments&AttPath=attachments/..
呵呵,最后還是希望大家支持PJBlog2,真的是很好用的啊。希望作者再接再厲,把這套blog系統(tǒng)做得更好,造福眾多網(wǎng)民J
PS:作者真是勤快啊,補(bǔ)丁已經(jīng)出來(lái)了,呵呵
相關(guān)文章
防火墻設(shè)置必備的參考資料計(jì)算機(jī)端口詳細(xì)列表
我們常常會(huì)在各類的技術(shù)文章中見到諸如135、137、139、443之類的“端口”,可是這些端口究竟有什么用呢?它會(huì)不會(huì)給我們的計(jì)算機(jī)帶來(lái)潛在的威脅呢?究竟有多少端口是有用的?想要了解的話,就跟我來(lái)吧2007-12-12
讓MCAFEE來(lái)終結(jié)網(wǎng)站被黑的時(shí)代-終極版圖文
不過因?yàn)楫?dāng)時(shí)沒考慮規(guī)則可以只指定進(jìn)程來(lái)阻擋。因此上文里的方法很多用戶都不適合,只適合自己有服務(wù)器,并且只給自己使用;而且自己使用如果需要修改和創(chuàng)建文件的話也需要先把MCAFEE關(guān)了,比較麻煩。2008-03-03
黑客攻防實(shí)戰(zhàn) Windows系統(tǒng)克隆攻擊與防范
下面就由我給大家介紹一些常見的克隆用戶和檢查是否存在克隆用戶及清除的方法。2011-04-04

