首页 > 其他分享 >补档--【THM】Authentication Bypass(身份验证绕过)-学习

补档--【THM】Authentication Bypass(身份验证绕过)-学习

时间:2022-11-11 21:00:20浏览次数:98  
标签:用户名 http -- 身份验证 admin Authentication ffuf txt 我们

本文相关的TryHackMe实验房间链接:https://tryhackme.com/room/authenticationbypass

通过学习相关知识点:了解如何破解登录和其他身份验证机制,以允许你访问未经许可的区域。

简介

在本文中,我们将了解绕过、击溃或破坏网站身份验证方法的不同方式。 此类漏洞(会导致未授权访问)可能是最关键的漏洞之一,因为它通常以泄露客户个人数据而告终。

用户名枚举

在尝试查找身份验证漏洞时,一个有用的操作是创建一个有效用户名列表,我们稍后将在其他小节中使用它。

网站错误消息是整理这些信息以构建我们的有效用户名列表的重要资源。 在本文实验环境下(TryHackMe对应的实验房间):我们访问Acme IT Support 网站 (http://MACHINE_IP/customers/signup) 注册页面,能看到一个创建新用户帐户的表单。

image

如果你尝试输入用户名 admin 并使用虚假信息填写其他表单字段,你将看到一个错误提示“具有此用户名的帐户已存在--An account with this username already exists”。 我们可以使用下面的 ffuf 工具,利用此错误消息的存在来生成已在系统上注册的有效用户名列表。 ffuf 工具将使用常用的用户名列表来检查任何匹配项。

user@tryhackme$ ffuf -w /usr/share/wordlists/SecLists/Usernames/Names/names.txt -X POST -d "username=FUZZ&email=x&password=x&cpassword=x" -H "Content-Type: application/x-www-form-urlencoded" -u http://MACHINE_IP/customers/signup -mr "username already exists"

在上面的示例中:

  • -w 参数后接的是字典路径,在此示例中 具体指定的是攻击机上的用户名字典路径。
  • -X 参数指定的是请求方法,默认为 GET 请求,但在此示例中为 POST 请求。
  • -d 参数指定我们要发送的数据,在此示例中,我们有四个字段:用户名、电子邮件、密码和 cpassword。 我们已将用户名的值设置为 FUZZ,在 ffuf 工具中,FUZZ 关键字表明我们所用的字典中的内容将被插入到请求消息中的什么位置。
  • -H 参数用于向请求添加额外的标头,在示例中,我们将设置Content-Type 以便让web 服务器知道我们正在发送表单数据。
  • -u 参数指定我们向其发出请求的 URL。
  • -mr 参数是我们正在寻找的页面上的报错信息的文本内容,以验证我们是否找到了有效的用户名。

ffuf 工具和要使用的字典都预装在TryHackMe实验房间中的 AttackBox 上,你也可以通过 https://github.com/ffuf/ffuf 下载并安装ffuf工具到你的本地攻击机。

请创建一个名为 valid_usernames.txt 的文件并在文件内容中 添加你使用 ffuf 工具找到的用户名,该文件将在第3小节中被使用。

答题

image

目标站点网页:

image

注册报错信息:

image

使用fuff工具获取目标站点的注册网页的有效用户名:

ffuf -w /usr/share/wordlists/SecLists/Usernames/Names/names.txt -X POST -d "username=FUZZ&email=x&password=x&cpassword=x" -H "Content-Type: application/x-www-form-urlencoded" -u http://10.10.68.98/customers/signup -mr "username already exists"

image

valid_usernames.txt的内容(使用命令nano valid_usernames.txt创建文本文件):

image

admin、robert、simon、steve

暴力破解攻击

使用我们在上一个小节中生成的 valid_usernames.txt 文件,我们现在可以使用它来尝试对登录页面(http://MACHINE_IP/customers/login) 进行暴力攻击。

注意:如果你使用ffuf 管道输出 来创建valid_usernames.txt 文件,那么该txt文件中的数据可能会出现问题。 请清理valid_usernames.txt文件中的数据,将有效用户名直接复制到txt文件中即可。

暴力破解攻击是一个自动化过程,它会尝试针对单个用户名或者多个用户名(如我们例子中的用户名列表)使用常用的密码字典去匹配。

运行此命令时,请确保终端命令行的执行位置与 valid_usernames.txt 文件位于同一目录中。

user@tryhackme$ ffuf -w valid_usernames.txt:W1,/usr/share/wordlists/SecLists/Passwords/Common-Credentials/10-million-password-list-top-100.txt:W2 -X POST -d "username=W1&password=W2" -H "Content-Type: application/x-www-form-urlencoded" -u http://MACHINE_IP/customers/login -fc 200

这个 ffuf 命令与第2小节中的命令有所不同:之前我们使用 FUZZ 关键字来选择 用户名字典在请求消息中插入数据的位置,而在本例中因为我们将使用多个字典列表,所以我们必须指定我们自己的关键字 W1W2

在本例中,我们将使用 -w 参数指定多个字典列表,但是会用逗号分隔每个字典列表,我们将使用 W1 参数来指定有效用户名列表,使用 W2 参数来指定我们将要尝试的密码列表。最后,为了筛选出匹配成功的结果,我们将使用 -fc 参数来过滤HTTP 状态代码为200的消息响应结果(匹配成功会是302代码--重定向)。

答题

image

使用ffuf工具:

ffuf -w valid_usernames.txt:W1,/usr/share/wordlists/SecLists/Passwords/Common-Credentials/10-million-password-list-top-100.txt:W2 -X POST -d "username=W1&password=W2" -H "Content-Type: application/x-www-form-urlencoded" -u http://10.10.68.98/customers/login -fc 200

image

steve/thunder

逻辑缺陷

什么是逻辑缺陷?

有时 在身份验证过程中会存在逻辑缺陷问题。 逻辑缺陷是指应用程序的典型逻辑路径被攻击者绕过、规避或操纵。一个网站的任何区域都可能存在逻辑缺陷问题,但是我们将重点关注与本小节实例中的身份验证相关的示例。

image

逻辑缺陷简单示例

下面的模拟代码示例:检查客户端访问的路径的开头是否以 /admin 开头,如果是,则进一步检查客户端是否实际上是管理员用户;如果某个页面的访问路径不以/admin开头,则会将该页面直接显示给客户端。

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

因为上面的 PHP 代码示例使用的是三个等号 (===),所以它会在字符串上寻找完全匹配,包括相同的大小写字母。

以上代码示例 存在逻辑缺陷问题,如果未经身份验证的用户 请求的页面路径是以/adMin开头,按照代码逻辑将不会检查该用户的权限而是会将页面显示给该用户,所以导致该用户能够完全绕过身份验证检查。

关于逻辑缺陷的知识点练习

我们将检查 Acme IT Support 网站 (http://MACHINE_IP/customers/reset) 的重置密码功能( Reset Password )。我们能够看到一个表格,要求提供与我们希望执行密码重置的帐户关联的电子邮件地址;如果输入了无效的电子邮件,你将收到一个错误消息“未能从提供的电子邮件地址找到帐户--Account not found from supplied email address”。

出于演示目的,我们将使用能被网站接受的电子邮件地址 [email protected];然后我们会看到表单的下一阶段,它会要求我们输入与此登录电子邮件地址关联的用户名。 如果我们输入 robert作为用户名并点击检查用户名按钮,我们将看到一条确认消息,网站将向 [email protected] 发送 关于密码重置的电子邮件。

image

在这个阶段,你可能想知道这个web应用程序中的漏洞是什么:当你知道电子邮件和用户名之后,你就能够将密码重置链接发送到任意一个帐户所有者的电子邮件地址。

本演练需要在 AttackBox 上运行以下两个 Curl 请求。

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

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

Curl Request 1

# %40 是 @ 字符的url编码形式,可以使用url编码工具来验证
user@tryhackme$ curl 'http://MACHINE_IP/customers/reset?email=robert%40acmeitsupport.thm' -H 'Content-Type: application/x-www-form-urlencoded' -d 'username=robert'

我们使用-H标志向请求消息添加额外的标头。 在本例中,我们会将 Content-Type 设置为 application/x-www-form-urlencoded,这能让 Web 服务器知道我们正在发送表单数据,以便Web服务器能够正确理解我们的请求消息。

在以上示例的web应用程序中,网站将使用查询字符串来检索用户帐户,检索完成之后,根据应用程序的逻辑,该网站将使用 PHP 变量$_REQUEST中的数据来发送密码重置电子邮件。

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

Curl Request 2

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

image

接下来,我们需要在 Acme IT Support 的客户页面创建一个帐户,这样做会为我们提供一个唯一的电子邮件地址,可用于创建该网站提供的技术支持业务票据,电子邮件地址的格式为 {username}@customer.acmeitsupport.thm

现在重新运行 Curl Request 2,但在电子邮件字段中使用我们自己的@customer.acmeitsupport.thm,然后在你的帐户上会生成一张业务票据,其中会包含一个链接,结果就是你能以 Robert 的身份实现登录并能查看Robert 用户的账户信息。

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

答题

image

在目标站点的注册页注册一个账户:

image

image

hacker

[email protected]

在攻击机上使用curl命令:

curl 'http://10.10.68.98/customers/[email protected]' -H 'Content-Type: application/x-www-form-urlencoded' -d 'username=robert&[email protected]'

image

在目标站点的hacker用户页面查看消息(点击id号查看详情):

image

image

成功登录到用户robert:

image

image

THM{AUTH_BYPASS_COMPLETE}

Cookie篡改

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

Cookie-Plain Text(明文)

一些cookies的内容可以是纯文本的,它们的作用是显而易见的。 例如,假设以下是成功登录后所设置的cookie信息:

image

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

我们可以看到一个 cookie (logged_in),它似乎控制着用户当前是否登录,还有另一个cookie (admin),它控制着访问者是否具有管理员权限。 按照这个逻辑,如果我们更改了 cookie 的内容并重新发出请求,那么我们将能够更改我们拥有的权限。

首先,我们将从请求目标页面开始:

user@tryhackme$ curl http://10.10.68.98/cookie-test

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

现在我们将发送另一个请求,并将logged_in cookie设置为true,将admin cookie设置为false

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

这次我们能够收到消息:以用户身份登录--Logged In As A User

最后,我们将发送又一个请求,将 logged_inadmin cookie 都设置为true

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

这将返回结果:以管理员身份登录-- Logged In As An Admin

Cookie-Hashing(散列)

有时 cookie 值可能看起来像一长串随机字符,这些字符被称为散列,是原始文本内容的不可逆表示。 以下是你可能会遇到的一些hash示例:

image

从上表可以看出,输入同一字符串再经过hash算法处理而输出的hash值 可能会因使用的哈希算法不同而有显著不同的结果。

即使哈希是不可逆的,但同一字符每次经同一hash算法处理之后都会产生相同的输出结果,这对我们破解hash值很有帮助,因为 https://crackstation.net/ 等在线网站存在一个保留了数十亿哈希值及其原始字符串的数据库。

Cookie-Encoding(编码)

编码类似于散列,因为它也会创建看似随机的文本字符串,但实际上,编码是可逆的。 这就引出了一个问题,编码有什么意义? 编码允许我们将二进制数据转换为人类可读的文本,这些文本内容可以通过仅支持纯文本 ASCII 字符的介质轻松安全地传输。

常见的编码类型有base32能将二进制数据转换为字符 A-Z 和 2-7,以及base64使用字符 a-z、A-Z、0-9、+、/ 和等号进行填充转换。

以web服务器登录时设置的以下数据为例:

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

以上编码部分的数据经过base64解码之后的字符串的值为 {"id":1,"admin": false} ,我们可以将其重新编码回 base64 编码,但是我们将 admin 值设置为 true,然后我们就可以获得管理员访问权限。

答题

image

发送一个请求,将 logged_inadmin cookie 都设置为true

curl -H "Cookie: logged_in=true; admin=true" http://10.10.68.98/cookie-test

返回结果:Logged In As An Admin以及 flag 内容

image

THM{COOKIE_TAMPERING}

使用在线网站破解hash值:https://crackstation.net/

image

结果:463729

使用在线网站完成base64解码和编码:https://www.base64decode.org/

image

结果:THM{BASE64_ENCODING}

image

结果:eyJpZCI6MSwiYWRtaW4iOnRydWV9

标签:用户名,http,--,身份验证,admin,Authentication,ffuf,txt,我们
From: https://www.cnblogs.com/Hekeats-L/p/16881988.html

相关文章

  • 思科与华为BGP配置命令对比
    Cisco(config)#routerbgp100 //配置BGP进程号[Huawei]bgp100//启动BGP,指定本地AS编号,并进入BGP视图Cisco(config-router)#bgprouter-id1.1.1.1 //配置BGP的rou......
  • 2. 说一下vue2和vue3的区别 ?
    1.vue3使用proxy替换Object.defineProperty实现数据响应式,所以vue3的性能得到了提升;2.vue3使用组合式API替代了vue2中的选项式API ;3.vue3......
  • DNS服务的实现和原理
    DNS服务器实战目的:搭建DNS正向主服务器,实现web服务器基于FQDN的访问环境要求需要三台主机DNS服务端:10.0.0.8web服务器:10.0.0.7DNS客户端:10.0.0.6前提准备关闭......
  • 多米诺骨牌
    1128.等价多米诺骨牌对的数量icintnumEquivDominoPairs(int[][]dominoes){intans=0;int[]a=newint[100];for(int[]cur:dominoes){Arrays.sort(cur);......
  • C++学习笔记
    C++学习笔记!这是刚开始写的文件,后来发现太大不合适就开始分开写了#include<iostream>#include<string>//c++风格字符串头文价//下面是定义宏常量:宏常量一旦定下,下文就......
  • java中的复合赋值运算符
    本文主要阐明复合赋值运算符即i=i+1.2==>i+=1.2; inti=1;i+=1.2;System.out.println(i);//i==2注意:复合赋值运算符会进行类型转换,具体操作顺序如......
  • 2022年前三季度软件业务收入
    1-8月份,我国软件业务收入64368亿元,同比增长9.8%。软件业利润总额6952亿元,同比增长3.6%。软件业务出口344亿美元,同比增长4.8%,增速较1-7月份提高0.5个百分点。其中,软件外包服务......
  • vue框架跨域请求之axios
    1、打开hbuilderx,【文件】==》【新建】==》【项目】,创建vue项目。   2、创建后的vue项目结构如下所示,打开【package.json】配置文件,添加axios相关依赖。   ......
  • TensorFlow和pytorch中的pin_memory和non_blocking设置是做什么的,又是否有用???
    因为最早接触CUDA是大学时代,至今已经十多年了,有些东西用习惯了、时间久了就不太care了,最近由于工作原因又搞了会CUDA和深度学习的框架,看到pin_memory和non_blocking这两个......
  • 一文搞懂Path环境变量
    什么是Path环境变量?在探讨这个问题之前,我们需要了解什么是环境变量。“环境变量”和“path环境变量”其实是两个东西,这一点大家一定要区分开,不要混为一谈。“环境变量”......