
Hijack a session
这里考察session伪造。由于开发者的疏忽,session有时候会缺乏随机性,攻击者可通过暴力枚举session的方法来找到一个可用session 。
来看题目。点击登录按钮并抓包,可以发现返回包中有set-cookie,如果不是第一次登录,可以把请求中的hijack_cookie删除:
重复发包几次,可以收到不同的cookie,简单观察一下,能够发现cookie有一定规律:
红框部分都是递增的,前面部分大多数是按1递增,中间有几个缺失。后面部分不规律递增,可能是时间戳什么的。这里其实可以想到爆破。比如前面部分11被跳过了,那11对应的后半部分应该在224398–229782之间。
现在去看一下代码部分。
首先是登录部分:
这里逻辑比较简单,有无cookie对应不同的处理逻辑。有的话就直接进行验证,没有的话就生成然后返回。
Authentication.builder().id(cookieValue).build()的操作就是装配出一个身份认证实例,里面有id什么的,如下图:
主要看provider.authenticate里面的逻辑:
如果是没携带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就行:
看一下源码:
挺坑的,一定要先写Users,再写Config,而且大小写区分。
另外,注意这里获取的两个路径:access-control/users-admin-fix和access-control/config,后面要用。
第二题
让你找Jerry对应的hash。这里应该是想让我们猜测一个路径去请求,返回的结果应该会列出用户信息之类的。结合上面找到的access-control/users-admin-fix,我们尝试访问access-control/users。
好吧,感觉根本猜不到,这里我直接看源码:
上面那个路径访问会报错,不知道为什么,好像是模板渲染的问题。
所以只能访问下面的路径,记得Content-Type改成json,得到hash:
第三题
这里也是同样的方法,不过要先发一个POST请求把自己的权限改成admin。
代码如下:
我们需要访问:access-control/users-admin-fix,但是那里会做一个isAdmin判断。所以要先通过下面的POST路由来将我们的用户,我这里是webgoat,添加为admin:
这三个参数可以直接看User类的字段,也可以发送一个空的POST请求,返回包里有。
这样再去访问access-control/users-admin-fix就行了:
Spoofing an Authentication Cookie
这里考cookie构造。
直接看源码,主要看怎么生成cookie的:
具体逻辑在这一行,跟进去:
反转,hex,再base64。解密就是反过来。现在的目标,就是让解密后的结果为tom。SALT的长度是固定的,这样可以写出下面的脚本:
1 | import org.springframework.security.crypto.codec.Hex; |
只要在tom后面任意添加10个字符就行了。带上cookie重新发包:
小结
总感觉没学到太多,这些东西以前好像都接触过。但是把靶场过一遍还是花了不少时间,之后遇到简单的,就专注于看代码而不是做题吧。
然后下面还有一个密码的板块,那个就不写了,主要是讲一些加密方式,自己了解一下就行。