資料安全:海洋頂端2006+密碼編碼分析(轉)
資料安全:海洋頂端2006+密碼編碼分析(轉)[@more@]海洋頂端是很出名的 ASP 木馬,我從紅粉佳人版本開始就一直用它,也算是它的fans了,今年海洋頂端出了最新版本也是最後一個版本 —— 2006Plus。
身為fans,自然要拿來用用才是,初次使用感覺有了幾個變化:介面變了,檔案瀏覽不再是圖示形式;所有動作改為POST方式提交;功能增加;……唉呀,趕緊打住,再寫就變成廣告了^_^
海洋頂端以往的各個版本密碼都是明文存放的,這回 2006+ 專門有個 vbs 指令碼用於加密密碼。這幾天閒得無聊,就來嘗試分析一下它的加密方式。
加密密碼的指令碼是在 down 回來的 vbs 目錄裡面名為Encode.vbs的檔案。先看程式碼,註釋是我加的:
Dim theStr
theStr = InputBox("請輸入要加密的字串")
If theStr <> "" Then
Call InputBox("請複製已經加密好的字串",,Encode(theStr))
End If
Function Encode(strPass)
Dim i, theStr, strTmp
’ for迴圈得到密碼各個字元的ascii值,每位值都在0~9
For i = 1 To Len(strPass)
strTmp = Asc(Mid(strPass, i, 1))
theStr = theStr & Abs(strTmp)
Next
strPass = theStr
theStr = ""
’ 如果前面得到的值位數大於16就進入JoinCutStr函式處理,使之小於16
Do While Len(strPass) > 16
strPass = JoinCutStr(strPass)
Loop
’ 這個for迴圈處理每個字元,把7、8、9轉為C、D、E,其餘不變
For i = 1 To Len(strPass)
strTmp = CInt(Mid(strPass, i, 1))
strTmp = IIf(strTmp > 6, Chr(strTmp + 60), strTmp)
theStr = theStr & strTmp
Next
Encode = theStr
End Function
’ JoinCutStr函式把奇數位和偶數位的ascii相加整除2得到新字元,取值在0~9
Function JoinCutStr(str)
Dim i, theStr
For i = 1 To Len(str)
If Len(str) - i = 0 Then Exit For
theStr = theStr & Chr(CInt((Asc(Mid(str, i, 1)) + Asc(Mid(str, i + 1, 1))) / 2))
i = i + 1
Next
JoinCutStr = theStr
End Function
’ VB的(a>b)?a:b
Function IIf(var, val1, val2)
If var = True Then
IIf = val1
Else
IIf = val2
End If
End Function
演算法不是很複雜,其主要思想是:先依次把每個字元取ascii值,得到的一串數字作為字元對待,如果位數大於16,則折半處理(把奇數位和偶數位的ascii相加整除2得到新字串,得到的字串位數為原來的一半),直至小等於16,然後把7、 8、9分別替換為C、D、E得到最後結果。
似乎可以逆向,那就試試吧。
我們得到了密文,第一步,我們可以把密文中的C、 D、E替換回去,也就是分別替換為7、8、9,然後我們得到一串數字組成的字串。比如字元lake2編碼之後是10DEC10C10150,我們替換之,得到1089710710150,由於字元的ascii在32~127,所以可以很輕鬆的把字元區分開:108、97、107、101、50,正好是 lake2各個字元的ascii值。
千萬不要以為這個演算法這麼簡單就破解了,因為上述情況只是若干種情況裡面最簡單的一種而已。
字元lake2的ascii值位數是11,所以並沒有經過JoinCutStr函式處理,如果明文密碼是lake2lake2的話,問題就複雜得多了。
JoinCutStr函式把奇數位和偶數位的ascii相加整除2得到新字串,但這裡造成了逆向的困難。因為1234經過處理,得到的是13; 1133、1134、1233、1234、1124等等經過處理,得到的仍然是13。即同一個結果對應不同的原因,多數情況下我們不知道到底哪一個才對,只好窮舉。但是即使是窮舉且排除那些包含不可顯示字元的密碼,也很難知道哪一個密碼才是對的。
我們雖然不知道使用者真正的密碼是多少,但是卻可以利用得到的任意一個密碼登陸,因為它和真正密碼加密之後的值是一樣的。這個有點像MD5的碰撞,只是這個演算法可以根據hash比較容易的構造碰撞,而MD5則很困難。
還有一種比較麻煩的情況:明文密碼包含中文。中文的ascii絕對值都很大,要逆向回去還是很麻煩的,所以我們還是構造碰撞吧。
針對最簡單的那種情況我們也可以用一個vbs來反編碼明文密碼,以下程式碼即實現此功能,copy儲存為vbs檔案執行即可:
’海洋頂端2006+簡單密文反編碼 by lake2
theStr = InputBox("輸入加密後的字串")
If theStr <> "" Then
Call InputBox("請複製已經解密的字串",,UnEncode(theStr))
End If
Function UnEncode(str)
For i = 1 To Len(str)
theStr1 = Mid(str, i, 1)
If theStr1 = "C" Then
theStr1 = "7"
ElseIf theStr1 = "D" Then
theStr1 = "8"
ElseIf theStr1 = "E" Then
theStr1 = "9"
End If
StrPass2 = StrPass2 & theStr1
Next
StrPass3 = GetChr(StrPass2)
UnEncode = StrPass3
End Function
Function GetChr(str)
For i = 1 To Len(str)
ASCStr = Mid(str, i, 1)
MyStr = MyStr & ASCStr
If MyStr > 32 and MyStr < 127 Then
StrResult = StrResult & Chr(MyStr)
MyStr = ""
Else
If i = Len(str) Then
GetChr = "小蝦無能,不能破解"
exit function
End If
End If
Next
GetChr = StrResult
End Function
試試效果先:
10DEC10C10150 -> lake2
120105EC111106 -> xiaoj (這個是某人的密碼哦^_^)
後面兩種情況,如果要程式設計序破解的話感覺比較困難,就不寫了。要是閣下寫出了程式,可得讓我研究研究。
下面讓我們透過構造碰撞來破解海洋頂端2006Plus的預設密碼。
開啟檔案,得到它的編碼過的密碼是02200200251001,我的程式不能恢復,看來是經過JoinCutStr函式處理的。讓我們大膽的還原: 10 31 22 10 01 22 10 01 22 55 11 10 01 11,整合一下: 103 122 100 122 100 122 55 11 100 111,這裡有個ascii值11,這個字元也是可以顯示的,既然是碰撞,只好將就了。我們得到我們的明文密碼:gzdzdz7chr(11)do因為chr(11)是換行符,格式原因不能顯示,你可以把以下程式碼儲存為vbs執行之,得到密碼:
Call InputBox("海洋的預設密碼碰撞",,"gzdzdz7"&chr(11)&"do")
然後你用它登陸沒有改過密碼的海洋頂端木馬,呵呵,進去了吧。下面再提供一個可以登陸但不同的密碼用以證明這是碰撞:
Call InputBox("海洋的預設密碼碰撞",,"gqdzdz7ne"&chr(11))
最後,我們來下個結論:在得到海洋頂端2006+編碼後的密碼之後,就算不能恢復出明文密碼,也可以利用碰撞來登陸系統。至於如何得到編碼後的密碼,呵呵,那就超出本文的範圍了。
身為fans,自然要拿來用用才是,初次使用感覺有了幾個變化:介面變了,檔案瀏覽不再是圖示形式;所有動作改為POST方式提交;功能增加;……唉呀,趕緊打住,再寫就變成廣告了^_^
海洋頂端以往的各個版本密碼都是明文存放的,這回 2006+ 專門有個 vbs 指令碼用於加密密碼。這幾天閒得無聊,就來嘗試分析一下它的加密方式。
加密密碼的指令碼是在 down 回來的 vbs 目錄裡面名為Encode.vbs的檔案。先看程式碼,註釋是我加的:
Dim theStr
theStr = InputBox("請輸入要加密的字串")
If theStr <> "" Then
Call InputBox("請複製已經加密好的字串",,Encode(theStr))
End If
Function Encode(strPass)
Dim i, theStr, strTmp
’ for迴圈得到密碼各個字元的ascii值,每位值都在0~9
For i = 1 To Len(strPass)
strTmp = Asc(Mid(strPass, i, 1))
theStr = theStr & Abs(strTmp)
Next
strPass = theStr
theStr = ""
’ 如果前面得到的值位數大於16就進入JoinCutStr函式處理,使之小於16
Do While Len(strPass) > 16
strPass = JoinCutStr(strPass)
Loop
’ 這個for迴圈處理每個字元,把7、8、9轉為C、D、E,其餘不變
For i = 1 To Len(strPass)
strTmp = CInt(Mid(strPass, i, 1))
strTmp = IIf(strTmp > 6, Chr(strTmp + 60), strTmp)
theStr = theStr & strTmp
Next
Encode = theStr
End Function
’ JoinCutStr函式把奇數位和偶數位的ascii相加整除2得到新字元,取值在0~9
Function JoinCutStr(str)
Dim i, theStr
For i = 1 To Len(str)
If Len(str) - i = 0 Then Exit For
theStr = theStr & Chr(CInt((Asc(Mid(str, i, 1)) + Asc(Mid(str, i + 1, 1))) / 2))
i = i + 1
Next
JoinCutStr = theStr
End Function
’ VB的(a>b)?a:b
Function IIf(var, val1, val2)
If var = True Then
IIf = val1
Else
IIf = val2
End If
End Function
演算法不是很複雜,其主要思想是:先依次把每個字元取ascii值,得到的一串數字作為字元對待,如果位數大於16,則折半處理(把奇數位和偶數位的ascii相加整除2得到新字串,得到的字串位數為原來的一半),直至小等於16,然後把7、 8、9分別替換為C、D、E得到最後結果。
似乎可以逆向,那就試試吧。
我們得到了密文,第一步,我們可以把密文中的C、 D、E替換回去,也就是分別替換為7、8、9,然後我們得到一串數字組成的字串。比如字元lake2編碼之後是10DEC10C10150,我們替換之,得到1089710710150,由於字元的ascii在32~127,所以可以很輕鬆的把字元區分開:108、97、107、101、50,正好是 lake2各個字元的ascii值。
千萬不要以為這個演算法這麼簡單就破解了,因為上述情況只是若干種情況裡面最簡單的一種而已。
字元lake2的ascii值位數是11,所以並沒有經過JoinCutStr函式處理,如果明文密碼是lake2lake2的話,問題就複雜得多了。
JoinCutStr函式把奇數位和偶數位的ascii相加整除2得到新字串,但這裡造成了逆向的困難。因為1234經過處理,得到的是13; 1133、1134、1233、1234、1124等等經過處理,得到的仍然是13。即同一個結果對應不同的原因,多數情況下我們不知道到底哪一個才對,只好窮舉。但是即使是窮舉且排除那些包含不可顯示字元的密碼,也很難知道哪一個密碼才是對的。
我們雖然不知道使用者真正的密碼是多少,但是卻可以利用得到的任意一個密碼登陸,因為它和真正密碼加密之後的值是一樣的。這個有點像MD5的碰撞,只是這個演算法可以根據hash比較容易的構造碰撞,而MD5則很困難。
還有一種比較麻煩的情況:明文密碼包含中文。中文的ascii絕對值都很大,要逆向回去還是很麻煩的,所以我們還是構造碰撞吧。
針對最簡單的那種情況我們也可以用一個vbs來反編碼明文密碼,以下程式碼即實現此功能,copy儲存為vbs檔案執行即可:
’海洋頂端2006+簡單密文反編碼 by lake2
theStr = InputBox("輸入加密後的字串")
If theStr <> "" Then
Call InputBox("請複製已經解密的字串",,UnEncode(theStr))
End If
Function UnEncode(str)
For i = 1 To Len(str)
theStr1 = Mid(str, i, 1)
If theStr1 = "C" Then
theStr1 = "7"
ElseIf theStr1 = "D" Then
theStr1 = "8"
ElseIf theStr1 = "E" Then
theStr1 = "9"
End If
StrPass2 = StrPass2 & theStr1
Next
StrPass3 = GetChr(StrPass2)
UnEncode = StrPass3
End Function
Function GetChr(str)
For i = 1 To Len(str)
ASCStr = Mid(str, i, 1)
MyStr = MyStr & ASCStr
If MyStr > 32 and MyStr < 127 Then
StrResult = StrResult & Chr(MyStr)
MyStr = ""
Else
If i = Len(str) Then
GetChr = "小蝦無能,不能破解"
exit function
End If
End If
Next
GetChr = StrResult
End Function
試試效果先:
10DEC10C10150 -> lake2
120105EC111106 -> xiaoj (這個是某人的密碼哦^_^)
後面兩種情況,如果要程式設計序破解的話感覺比較困難,就不寫了。要是閣下寫出了程式,可得讓我研究研究。
下面讓我們透過構造碰撞來破解海洋頂端2006Plus的預設密碼。
開啟檔案,得到它的編碼過的密碼是02200200251001,我的程式不能恢復,看來是經過JoinCutStr函式處理的。讓我們大膽的還原: 10 31 22 10 01 22 10 01 22 55 11 10 01 11,整合一下: 103 122 100 122 100 122 55 11 100 111,這裡有個ascii值11,這個字元也是可以顯示的,既然是碰撞,只好將就了。我們得到我們的明文密碼:gzdzdz7chr(11)do因為chr(11)是換行符,格式原因不能顯示,你可以把以下程式碼儲存為vbs執行之,得到密碼:
Call InputBox("海洋的預設密碼碰撞",,"gzdzdz7"&chr(11)&"do")
然後你用它登陸沒有改過密碼的海洋頂端木馬,呵呵,進去了吧。下面再提供一個可以登陸但不同的密碼用以證明這是碰撞:
Call InputBox("海洋的預設密碼碰撞",,"gqdzdz7ne"&chr(11))
最後,我們來下個結論:在得到海洋頂端2006+編碼後的密碼之後,就算不能恢復出明文密碼,也可以利用碰撞來登陸系統。至於如何得到編碼後的密碼,呵呵,那就超出本文的範圍了。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10617731/viewspace-958388/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 顯示密碼編輯框中的密碼 (轉)密碼
- 忘記MySQL資料庫root密碼,使用安全模式巧妙重置密碼MySql資料庫密碼模式
- 安全支招:構築密碼城堡(轉)密碼
- 年底了,你的資料庫密碼安全嗎資料庫密碼
- 聯通光貓管理員密碼分析,不安全的密碼方案密碼
- PG密碼安全密碼
- 密碼安全加固密碼
- MySQL密碼安全MySql密碼
- MongoDB 資料庫安全之使用者密碼修改MongoDB資料庫密碼
- 密碼安全:密碼設定要求,密碼爆破辦法,密碼歸類使用,密碼處置方案密碼
- 資料庫裡賬號的密碼,需要怎樣安全的存放?—— 密碼雜湊(Password Hash)資料庫密碼
- oracle密碼安全管理Oracle密碼
- oracle 密碼安全 (zt)Oracle密碼
- 面向OpenHarmony終端的密碼安全關鍵技術密碼
- Oracle資料庫密碼破解易如反掌(轉)Oracle資料庫密碼
- MySQL資料庫中修改密碼方法總結(轉)MySql資料庫密碼
- PHP安全編碼PHP
- 前端安全編碼前端
- 密碼學與密碼安全:理論與實踐密碼學
- 資料庫密碼爆破HexorBase資料庫密碼HexoORB
- MySQL 資料庫重置密碼MySql資料庫密碼
- Sql語句密碼驗證安全漏洞(轉)SQL密碼
- 教你建立容易記憶而又安全的密碼(轉)密碼
- 網頁地址編碼解碼(網頁地址明文密文轉換)url編碼解碼 Python3網頁Python
- DM8資料庫的密碼安全策略詳解資料庫密碼
- ORACLE資料庫安全漏洞之監聽密碼設定Oracle資料庫密碼
- 忘記APPS密碼 - EBS從資料庫中反編譯獲取APPS密碼APP密碼資料庫編譯
- java安全編碼指南之:字串和編碼Java字串
- 密碼安全和無密碼身份認證那些事兒密碼
- 拓端tecdat:解讀出租房市場的資料密碼密碼
- 軟體安全性:採用安全的編碼方式(轉)
- 資料庫密碼安全面臨挑戰企業如何面對?資料庫密碼
- 原始碼防洩密場景中程式碼伺服器安全價值分析原始碼伺服器
- 駭客非法探取密碼的原理及安全防範(轉)密碼
- 安全攻略:WinRAR自制開機密碼程式(轉)密碼
- 密碼生成常見的編碼規則密碼
- oracle 資料庫密碼中包括@Oracle資料庫密碼
- SSH 無密碼遠端執行指令碼密碼指令碼