/** *1.打开钓鱼网网站 *2.按下F12,在控制台(console)中粘贴此JS代码 停止定时器的方法: stop(); 3.加载自定义密码库: Ajax.get('https://raw.githubusercontent.com/rootphantomer/Blasting_dictionary/master/撞库邮箱和密码/passwd.txt', pwdline); */ /**JS Ajax 请求 */ var Ajax = { /** * 得到合适的请求对象 * * @returns 返回 ajax 请求对象 */ ajaxObject: function () { let xmlHttp; try { // Firefox, Opera 8.0+, Safari xmlHttp = new XMLHttpRequest(); } catch (e) { // Internet Explorer try { xmlHttp = new ActiveXObject("Msxml2.XMLHTTP"); } catch (e) { try { xmlHttp = new ActiveXObject("Microsoft.XMLHTTP"); } catch (e) { alert("您的浏览器不支持AJAX!"); return false; } } } return xmlHttp; }, /** * JS Ajax GET 请求 * * @param {String } url * @param {function} fnSucceed * @param {function} fnFail * @param {function} fnLoading */ get: function (url, fnSucceed, fnFail, fnLoading) { // XMLHttpRequest对象用于在后台与服务器交换数据 let xhr = Ajax.ajaxObject(); xhr.open('GET', url, true); xhr.onreadystatechange = function () { if (xhr.readyState == 4) { // readyState == 4说明请求已完成 if (xhr.status == 200) { fnSucceed && fnSucceed(xhr.responseText); } else { fnFail && fnFail(xhr.status); } } else { fnLoading && fnLoading(); } }; xhr.send(); }, /** *JS Ajax POST 请求 * * @param {String} url 数据请求地址 * @param {FormData} data 请求的数据 应为'a=a1&b=b1'这种字符串格式,也可以为表单对象, * 若在jq里如果data为对象会自动将对象转成这种字符串格式 * @param {function} fnSucceed 请求成功执行的函数 * @param {function} fnFail 请求失败执行的函数 * @param {function} fnLoading 加载中函数 */ post: function (url, data, fnSucceed, fnFail, fnLoading) { let xhr = Ajax.ajaxObject(); xhr.open("post", url, true); // xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); xhr.onreadystatechange = function () { if (xhr.readyState == 4) { if (xhr.status == 200) { fnSucceed && fnSucceed(xhr.responseText); } else { fnFail && fnFail(xhr.status); } } else { fnLoading && fnLoading(); } }; xhr.send(data); } } /** * * * @param {string} userNameFormName 账号表单名 * @param {string} passwdFormName 密码表单名 * @returns 虚假的data */ function fakeInfo(userNameFormName, passwdFormName) { let fakeUsername = fakeUserName(); //账号 let fakePasswd = fakePassWord(); //密码 return formData = '&' + userNameFormName + '=' + fakeUsername + '&' + passwdFormName + '=' + fakePasswd; } //http://180.215.6.187/f4b6sgz/6cac5s-pc.php fakeInfo('user', 'pass'); /** *生成从minNum到maxNum的随机数 * * @param {Number} minNum 范围开始 * @param {Number} maxNum 范围结束 * @returns */ function randomNum(minNum, maxNum) { switch (arguments.length) { case 1: return parseInt(Math.random() * minNum + 1, 10); break; case 2: return parseInt(Math.random() * (maxNum - minNum + 1) + minNum, 10); break; default: return 0; break; } } /** * 范围字符串数组 * * @param {Number} left 范围开始 * @param {Number} right 范围结束 * @returns */ function charArrBetween(left, right) { let arr = new Array(); //创建空数组 if (!isNaN(left) && !isNaN(right)) { for (let i = left; i <= right; i++) { arr.push(i); } } else { for (let i = left.charCodeAt(); i <= right.charCodeAt(); i++) { arr.push(String.fromCharCode(i)); } } return arr; }; /** * 小写 */ var lower_case = 0; /** * 大写 */ var upper_case = 1; /** * 数字 */ var number_case = 2; /** * 符号 */ var symbol_case = 3; /** * 自定义字符数组模式 */ var custom_case = -1; /** * randomWords 产生任意长度随机字母数字组合 * @param {number} min 长度最小位数[只填第一个参数生成的数为固定位数] * @param {number} [max=-1] max-长度最大位数 * @param {Array} defineCases 模式选择 * @param {Array} custom_array 自定义数组范围 * @returns */ function randomWords(min, max = -1, defineCases, custom_array = []) { let str = "", range, arr = []; // 随机产生长度 if (max > min) { range = Math.round(Math.random() * (max - min)) + min; } else { range = min; } //模式解析添加 for (let index = 0; index < defineCases.length; index++) { switch (defineCases[index]) { case lower_case: arr = arr.concat(charArrBetween('a', 'z')); break; case upper_case: arr = arr.concat(charArrBetween('A', 'Z')); break; case number_case: arr = arr.concat(charArrBetween(0, 9)); break; case symbol_case: /* * 自定义符号列表 */ let symbol_arr = [',', '.', '#', '*', '!', '+', '-']; for (let i = 0; i <= symbol_arr.length; i++) { arr.push(symbol_arr[i]); } break; case custom_case: for (let i = 0; i <= max; i++) { arr.push(custom_array[i]); } break; default: break; } }; // 随机组合产生 for (let i = 0; i < range; i++) { const pos = Math.round(Math.random() * (arr.length - 1)); str += arr[pos]; } return str; } /** * 生成随机账号 * * @returns */ function fakeUserName() { return randomNum(1000000, 999999999); } /** * 加载自定义密码库 * * @param {*} textdata */ function addPasswd(textdata) { let r = /.+/g; passarrs = passarrs.concat(textdata.match(r)); } //Ajax.get('https://raw.githubusercontent.com/rootphantomer/Blasting_dictionary/master/撞库邮箱和密码/passwd.txt', addPasswd); var passarrs = []; /** *生成随机密码 * * @returns */ function fakePassWord() { let fakePasswd = ''; if (passarrs&&passarrs.length!=0) { fakePasswd = passarrs[randomNum(passarrs.length)]; } else { let randPasswdLen = randomNum(8, 20); //随机密码长度 let passwdLen = 0; //已生成的密码长度 let num = 1; //生成数字 let char = 2; //生成字母 while (passwdLen < randPasswdLen) { let tmpLen = randomNum(1, 6); //当前模式生成密码的长度 passwdLen += tmpLen; let word_case = randomNum(2); switch (randomNum(2)) { case num: fakePasswd += randomWords(tmpLen, 0, [number_case]); break; case char: fakePasswd += randomWords(tmpLen, 0, [upper_case, lower_case]); break; } if (randomNum(10) > 7) { let sym = randomWords(1, 1, [symbol_case]); fakePasswd += sym; passwdLen += 1; } } } return fakePasswd; } /** * 填充表单 * */ function setFrom() { let formArray = document.getElementsByTagName('input'); for (let index = 0; index < formArray.length; index++) { const ele = formArray[index]; if (!(ele.style.display == 'none')) { if (ele.getAttribute('type') && ele.getAttribute('type').indexOf('password') != -1) { ele.setAttribute('data-isPass', true); ele.setAttribute('type', 'text'); } if (ele.getAttribute('data-isPass')) { ele.value = fakePassWord(); } else { ele.value = fakeUserName(); } } } } /** * 获取表单数据 * * @param {Element} formNow 表单元素 */ function getFormData(formNow) { if (typeof (formNow) != 'object') { formNow = document.getElementsByTagName('from'); } let datas = formNow.getElementsByTagName('input'); for (let index = 0; index < datas.length; index++) { const data = datas[index]; formData += '&' + data.name + '=' + data.value; } } /** 服务器返回的数据 */ var responseData; /** *向服务器提交数据 * */ function sendFrom() { //所有表单 let forms = document.getElementsByTagName('form'); for (let i = 0; i < forms.length; i++) { //当前表单 let formNow = forms[i]; //当前表单中数据 let formData = new FormData(formNow); //发送地址 let actionUrl = formNow.getAttribute('action'); if (!actionUrl) { actionUrl = ''; } Ajax.post(actionUrl, formData, function (params) { if (responseData != params) { responseData = params; console.log(responseData); } else { //console.log('返回文本相同'); } //发送成功,记录到网页 showSendTimes(); }, function (params) { stop(); console.log('发送失败'); //等待2分钟 setTimeout(function () { go(); }, 2 * 1000 * 60); }); } } /** * 统计发送次数 * * * @param {Element} ele 显示元素 */ function showSendTimes(ele) { let infoDiv = ele || document.getElementById('infoDiv'); if (!infoDiv) { infoDiv = document.createElement('div'); infoDiv.setAttribute('id', 'infoDiv'); infoDiv.style.position = 'absolute'; infoDiv.style.top = '5vh'; infoDiv.style.right = '5vw'; infoDiv.style.display = 'table-cell'; infoDiv.style.backgroundColor = 'rgb(170, 170, 170)'; infoDiv.style.textAlign = 'center'; infoDiv.style.verticalAlign = 'middle'; document.getElementsByTagName('body')[0].appendChild(infoDiv); infoDiv.innerText = 0; } ++infoDiv.innerText; } /** 定时器数组 */ var allIntervalArray = []; /** * 每秒发送一次数据 * 部分网站发送太频繁会banIP几分钟 * @param {number} times 间隔时间-毫秒 */ function go(times) { let timeNow = 0; allIntervalArray.push(setInterval(function () { setFrom(); sendFrom(); times && (++timeNow < times || stop()); }, 1 * 1000)); } /** *停止定时器方法 * @param {array} allInterval 定时器数组 */ function clearAllInterval(allInterval) { let array = allInterval || allIntervalArray; for (let index = 0; index < array.length; index++) { clearInterval(array[index]); } } /** *停止定时器 * */ function stop() { clearAllInterval(allIntervalArray); } /* 开始表演 */ go();