WebGoat代码审计-04-身份认证缺陷(下)
Drunkbaby Lv6

WebGoat代码审计-04-身份认证缺陷(下)

WebGoat代码审计-04-身份认证缺陷(下)

0x01 前言

续上篇 WebGoat代码审计-04-身份认证缺陷(上))

  • 接下来讲一下其他的两种身份验证

0x02 Password Reset 密码重置

  • 密码重置这里主要也是以业务逻辑漏洞居多。

1. Password Reset PageLesson2 使用 WebWolf

源码部分

源码文件是 SimpleMailAssignment.Java

先看登录界面

  • 这里的第 56 - 67 行,简单的身份认证,当 username 和 password 都正确,则登录。

第 58 - 60 行,基础的 Java 语法讲解

1
2
3
public AttackResult login(@RequestParam String email, @RequestParam String password) {  
String emailAddress = ofNullable(email).orElse("unknown@webgoat.org"); // emailAddress 等于 email,如果没有 email 这个值,则为 "unknown@webgoat.org"
String username = extractUsername(emailAddress); // 拦截器的作用,判断传进来的参数是否为邮箱的格式

看了很久都感觉没有洞,后面查了才知道这题只是让我们感受一下 WebWolf,并不是直接挖洞哈哈哈哈哈

题目部分

  • 发送一下忘记密码的邮件即可

再登录即可,只是让我们感受一下 WebGoat 而已,晕……

  • 解出题目之后是不会变色的,不必在意

2. Password Reset PageLesson4 爆破密保

源码部分

  • 获取输入的第 56,57 行拉出来单独讲解一下 getOrDefault

参数说明:

  • key - 键
  • defaultValue - 当指定的key并不存在映射关系中,则返回的该默认值

返回值

返回 key 相映射的的 value,如果给定的 key 在映射关系中找不到,则返回指定的默认值。

1
2
String securityQuestion = (String) json.getOrDefault("securityQuestion", "");  // 获取当前参数的 "securityQuestion" 值,若没有 "securityQuestion",则返回 ""
String username = (String) json.getOrDefault("username", "");

分析完毕,看到上面的 static 中有一些字符,直接尝试爆破

题目部分

抓包,并将颜色部分添加 dollar 符,进行爆破

再发包,成功。

  • 这也给我们的渗透攻击提供了一些思路,在实际的渗透测试当中,对于回答密保问题来验证身份,也可使用爆破。
  • 正确的防御手法应该是添加验证码。

3. Password Reset PageLesson5 关于密保的小 tips

这里让我们写密保时,不要写真实的答案,不然会被社工。
选 favorite color

  • 题意是让我们创建一个密码重置的链接,这种情景需要先行理解一下。

我们邮箱中收到重置密码的邮件时,通常都会发给我们另外一个 Web 地址,上面是去往密码重置的 Web 界面。

在此时,若我们修改了这个密码重置的 Web 链接。
举个例子,Tom 的邮箱对应的地址是 10.48.244.196:8011,那么 8011 这个端口就是专门为了 Tom 设置的。

假设我的账户名叫 Jerry,邮箱的地址是 10.48.244.196:8022,那么我先请求一个 “forget password” ,名字是 Tom 的邮箱,再将去到的 Host 修改为我自己的 “10.48.244.196:8022”;若后台不加以任何的限制,我们就可以越权修改 Tom 的密码。

本道靶场就演示了这么一个情况。当我们输入要找回密码的邮箱时,会将链接发送道我们邮箱,点开链接才是修改密码的。

  • 攻击思路已经比较清楚了,我们再看一看源码

源码部分

  • 主要是看发送密码重置链接的源码

总体上比较好理解,为了帮助其他小伙伴理解,还是细讲一下吧

第 67 - 69 行,几个变量的定义及赋值

1
2
3
String resetLink = UUID.randomUUID().toString();  // resetLink 变量的值是由 UUID 产生的,至于 UUID 是一串随机数序列
ResetLinkAssignment.resetLinks.add(resetLink); // 在接口中添加 resetLinks 这一段
String host = request.getHeader("host"); // host 的值是 Request 包中的 host 值

后面的判断语句,判断 host 当中是否存在 WebWlof 服务对应的端口与 Host;之后再产生一个 Response 包中的 Session。

  • 很显然,就是这一句判断语句不够精确,所以才会导致漏洞,对应的攻击手段如下。

题目部分

先到忘记密码的界面,输入 tom@webgoat-cloud.org,并抓包。
接着修改 Host 为 localhost:9090,也就是 WebWolf 的地址,这样子的话,原本是 Tom 忘记密码的操作就到了我们的邮箱上。

再到 WebWolf 下的一个 Incoming requests 下,查看请求。

再访问 http://124.222.21.138:9000/WebGoat/PasswordReset/reset/change-password 即可,因为 Tom 的请求的 Host 就为此,输入密码重置即可。

修复方式

固定我们的host就可以了,其实归根结底就是太相信用户的输入了,这也是很多安全问题存在的原因。

0x03 Secure Passwords

这里的和很多的业务逻辑漏洞是重复的,就简单过一遍靶场吧。

1.Secure Passwords PageLesson4 防爆破的密码

这里输入一传强密码即可,随意输入都可以 ~
我这里的答案是 1!22@Misliq!39

 评论