在网络安全领域,验证码是防止自动化脚本滥用服务的重要手段。极验滑动验证码是一种流行的验证码形式,它通过滑动拼图来验证用户的真实性。本文将详细介绍如何使用JavaScript破解极验滑动验证码,帮助你更好地理解其工作原理,并提供相应的防护措施。
1. 观察验证过程中触发的请求
首先,我们需要使用工具(如Fiddler或Burp Suite)来拦截和分析浏览器与服务器之间的通信。极验验证码的验证过程涉及多个HTTP请求,这些请求通常包含以下重要参数:
gt:极验申请的ID,是固定值。
challenge:行为ID,用于标识当前的验证会话。
w:核心加密参数,我们的破解目标。
2. 获取核心JS文件链接
通过分析gettype.php请求,我们可以获取到极验验证所需的核心JS文件链接。
javascript
const axios = require('axios');
const cheerio = require('cheerio');
async function getCoreJsUrl(gt, challenge) {
const url = `https://api.geetest.com/gettype.php?gt=${gt}&challenge=${challenge}`;
const response = await axios.get(url);
const coreJsUrl = extractJsUrl(response.data);
return coreJsUrl;
}
function extractJsUrl(responseText) {
const $ = cheerio.load(responseText);
const scriptSrc = $('script[src*="slide"]').attr('src');
return scriptSrc;
}
// 示例使用
const gt = 'example_gt';
const challenge = 'example_challenge';
getCoreJsUrl(gt, challenge).then(url => console.log(url));
3. 破解w参数
破解w参数是通过极验验证的核心步骤。我们需要分析极验的JS文件,找到生成w参数的逻辑,并在本地进行模拟。
javascript
const crypto = require('crypto');
function getWParam(gt, challenge, slideDistance) {
const userresponse = generateUserresponse(challenge, slideDistance);
const passtime = getRandomInt(300, 700); // 滑动通过时间,随机值
const imgload = getRandomInt(30, 100); // 验证码图片加载时间,随机值
const aa = generateAa(challenge);
const o = {
lang: 'zh-cn',
userresponse: userresponse,
passtime: passtime,
imgload: imgload,
aa: aa,
ep: {
v: '7.8.8',
$_BIQ: false,
me: true,
tm: -1,
td: -1,
}
};
const w = encrypt(JSON.stringify(o), getRandomText());
return w;
}
function generateUserresponse(challenge, slideDistance) {
return crypto.createHash('md5').update(challenge + slideDistance).digest('hex');
}
function generateAa(challenge) {
return crypto.createHash('md5').update(challenge).digest('hex');
}
function encrypt(data, key) {
return crypto.createHash('md5').update(data + key).digest('hex');
}
function getRandomText() {
return crypto.randomBytes(8).toString('hex');
}
function getRandomInt(min, max) {
return Math.floor(Math.random() * (max - min + 1)) + min;
}
// 示例使用
const wParam = getWParam(gt, challenge, 150);
console.log(wParam);
4. 构造验证请求
使用破解得到的w参数构造请求,并发送以通过极验验证。
javascript
async function validate(gt, challenge, slideDistance) {
const w = getWParam(gt, challenge, slideDistance);
const url = 'https://api.geetest.com/ajax.php';
const params = {
gt: gt,
challenge: challenge,
w: w
};
const response = await axios.get(url, { params });
return response.data;
}
// 示例使用
validate(gt, challenge, 150).then(result => console.log(result));
更多内容联系1436423940