WebGoat靶场-有缺陷的访问控制
1diot9 Lv4

Hijack a session

这里考察session伪造。由于开发者的疏忽,session有时候会缺乏随机性,攻击者可通过暴力枚举session的方法来找到一个可用session 。

来看题目。点击登录按钮并抓包,可以发现返回包中有set-cookie,如果不是第一次登录,可以把请求中的hijack_cookie删除:img

重复发包几次,可以收到不同的cookie,简单观察一下,能够发现cookie有一定规律:img

红框部分都是递增的,前面部分大多数是按1递增,中间有几个缺失。后面部分不规律递增,可能是时间戳什么的。这里其实可以想到爆破。比如前面部分11被跳过了,那11对应的后半部分应该在224398–229782之间。

现在去看一下代码部分。

首先是登录部分:

img

这里逻辑比较简单,有无cookie对应不同的处理逻辑。有的话就直接进行验证,没有的话就生成然后返回。

Authentication.builder().id(cookieValue).build()的操作就是装配出一个身份认证实例,里面有id什么的,如下图:

img

主要看provider.authenticate里面的逻辑:

img

如果是没携带cookie的情况,会进入isEmpty那个if,给你的身份认证实例先设置一个id。携带cookie的话,就会进入isNotEmpty那个if,来检查你的session是否在服务器的合法列表中。

不管怎么样,authorizedUserAutoLogin方法都会执行。这个方法的if是随机进入的,进入的话,就会产生一个新的身份认证实例,并将其添加到服务器的合法session列表中。另外,服务器只会存储最近生成的50个合法session,因为addSession中的MAX_SESSIONS是50。

你也可以直接复制这边的合法session用来直接解题。

Insecure Direct Object References

这几题比较容易,就不写了。

主要是考察横向越权,就是通过更改请求包中的id字段或是URL中的id字段,来访问或修改其他用户的数据。

Missing Function Level Access Control

这里的翻译是‘缺少功能级访问控制’。但是考察的点似乎都是让你找隐藏信息或者猜测路径的。

第一题

找隐藏的下拉栏,很简单,直接f12就行:

img

看一下源码:

img

挺坑的,一定要先写Users,再写Config,而且大小写区分。

另外,注意这里获取的两个路径:access-control/users-admin-fix和access-control/config,后面要用。

第二题

让你找Jerry对应的hash。这里应该是想让我们猜测一个路径去请求,返回的结果应该会列出用户信息之类的。结合上面找到的access-control/users-admin-fix,我们尝试访问access-control/users。

好吧,感觉根本猜不到,这里我直接看源码:

img

上面那个路径访问会报错,不知道为什么,好像是模板渲染的问题。

所以只能访问下面的路径,记得Content-Type改成json,得到hash:

img

第三题

这里也是同样的方法,不过要先发一个POST请求把自己的权限改成admin。

代码如下:

img

我们需要访问:access-control/users-admin-fix,但是那里会做一个isAdmin判断。所以要先通过下面的POST路由来将我们的用户,我这里是webgoat,添加为admin:

img

这三个参数可以直接看User类的字段,也可以发送一个空的POST请求,返回包里有。

这样再去访问access-control/users-admin-fix就行了:

img

Spoofing an Authentication Cookie

这里考cookie构造。

直接看源码,主要看怎么生成cookie的:

img

具体逻辑在这一行,跟进去:

img

反转,hex,再base64。解密就是反过来。现在的目标,就是让解密后的结果为tom。SALT的长度是固定的,这样可以写出下面的脚本:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
import org.springframework.security.crypto.codec.Hex;

import java.nio.charset.StandardCharsets;
import java.util.Base64;

public class tmp {
public static void main(String[] args) {
String name = "tom1111122222";
name = revert(name);
name = hexEncode(name);
name = base64Encode(name);
System.out.println(name);
}
private static String revert(final String value) {
return new StringBuilder(value).reverse().toString();
}

private static String hexEncode(final String value) {
char[] encoded = Hex.encode(value.getBytes(StandardCharsets.UTF_8));
return new String(encoded);
}
private static String base64Encode(final String value) {
return Base64.getEncoder().encodeToString(value.getBytes());
}
}

只要在tom后面任意添加10个字符就行了。带上cookie重新发包:

img

小结

总感觉没学到太多,这些东西以前好像都接触过。但是把靶场过一遍还是花了不少时间,之后遇到简单的,就专注于看代码而不是做题吧。

然后下面还有一个密码的板块,那个就不写了,主要是讲一些加密方式,自己了解一下就行。

参考

https://drun1baby.top/2022/04/24/WebGoat%E4%BB%A3%E7%A0%81%E5%AE%A1%E8%AE%A1-06-%E6%9C%89%E7%BC%BA%E9%99%B7%E7%9A%84%E8%AE%BF%E9%97%AE%E6%8E%A7%E5%88%B6/#0x03-Missing-Function-Level-Access-Control

https://zhuanlan.zhihu.com/p/648214018

由 Hexo 驱动 & 主题 Keep
本站由 提供部署服务
总字数 52.9k 访客数 访问量