WebGoat 里面关于会话劫持(Hijack a Session)这个课程的标准答案里面除了使用 WebScarab
以外还使用了其他的工具来找出合法的 SessionID 以完成这个课程,实际上这个课程完全可
以只使用 WebScarab 来完成。下面把我的解法分享下:
这个课程就是说因为这个 Web 应用用来生成会话标识的算法不够随机,所以很容易被预测,
从而要求我们发现会话标识生成的规律并且使用暴力破解的办法找到一个有效的会话标识。
这里我们使用 WebScarab 作为代理来观察浏览器和服务器之间的数据通信。先随便输入一
点东西来观察浏览器发送给服务器的请求。
从上图可以看到有个 WEAKID 的 Cookie,这就是我们的攻击目标,我们使用 WebScarab 的会
话标识分析功能来分析这个会话标识。在 WebScarab 上点击“SessionID Analysis”这个 Tab 页
面,然后在“Collection”子页面的“Previous Requests”的下拉菜单中选取我们需要分析的那个请
求,如下图所示:
然后我们需要使 WebScarab 意识到 Cookie 里面的 WEAKID 这个参数是会话标识。我们知道
如果客户端发送给 Web 服务器的请求里面没有会话标识的话,服务器会从新生成一个新的
会话标识并通过 Cookie 返回给客户端,利用这个特性,我们可以使 WebScarab 通过分析服
务器返回的 Cookie 的办法来识别会话标识。
这里我们删除现有的这个参数,然后点击"Test"按钮让 WebScarab 进行分析。弹出类似如下
的对话框表示 WebScarab 已经成功的识别出了会话标识的参数。
然后在取样数量这里我们输入稍微大点的数字,比如 50,然后点击“Fetch”按钮,WebScarab
就会自动从服务器上获取 50 个会话标识的样例。
下面我们进入“SessionID Analysis”下的“Analysis”子页面,在“Session Identifier”下拉菜单中选择
这个参数后可以看到 WebScarab 获取的这些会话标识。
我们可以看到这些会话标识是非常有规律的,是被短横线分割的 2 部分,前一部分是每次加 1
的有序排列的数字,后一部分也是不断增加的有序排列的数字,我们可以猜测后一部分应该
是时间戳。
再进一步仔细观察后可以发现有些特别的地方,如上图所示,会话标记第一部分的数字跳了
一个。这说明中间跳掉的会话标记是被别的用户使用了,我们的目标就是找到这个会话标识。
在我们这个例子中,根据我们发现的会话标识生成的规律,中间跳掉的这个会话标识的值应
该是在 19749-1349946763292 到 19749-1349946763392 之间。
到这一步为止,我们使用的方法都和 WebGoat 的标准答案里面是一样的,但是下面就不同
了。下面我们使用 WebScarab 的模糊测试的功能来试图找到这个会话标识。
我们先把相应的请求添加到模糊测试的模板里面。在 WebScarab 的“Summary”页面中,选
择目标请求后,右键菜单中可以看到“Use as fuzz template”的菜单项,点击这个菜单项就可
以把这个请求作为模糊测试的基础模板。
然后进入 WebScarab 的“Fuzzer”页面。会发现系统已经自动帮我们分析出了所有可以做模糊
测试的参数。点击下面的“Source”按钮添加模糊测试的源。
在弹出的对话框中,给这个源起一个名字比如“ForWeakID”输入到“Description”里面,然后我
们使用正则表达式的方式来添加我们需要测试的数据,输入这样的正则表达式:
19749-1349946763[2-3][0-9][0-9],然后点击“Add”按钮。注意这里我们输入的数据会使
WebScarab 测试从 19749-1349946763200 到 19749-1349946763399 的值,略微有些扩大范围,
这是因为 WebScarab 只支持基本正则表达式,我们略微扩大一点测试的数据范围,可以把
这个正则表达式写得简单一点。
然后关闭弹出的对话框,再为 Cookie 里面的 WEAKID 选择我们添加的源,就可以点击“Start”
按钮开始运行了。
结果的分析还是需要人工进行,我们需要知道输入有效地会话标识之后服务器会返回怎样的
数据。在 WebGoat 里面我们知道一旦提交了正确的数据给服务器,服务器返回的数据里面
会包含“Congratulations”的消息,所以我们只需要检查看哪个请求的返回有包含这样的信息
就好。
针对这个练习还有个技巧,我们只需要看返回的数据长度和其他的返回不一样的就好,因为
有效的参数只有一个,所以包含有效参数的请求返回的数据长度一定和其他的不一样。
如下图所示,我看到有个返回的数据大小和其他不一样的请求,点击查看详细信息,果然在
服务器的返回里面发现了“Congratulations”的消息,所以这个请求里面带的 WEAKID 参数
的值 19749-1349946763342 就是我们要找的那个合法的会话标志。
这时候我们实际上也已经完成这个课程了。刷新一下课程,就可以看到课程完成的标记。
我们也可以再验证一下我们找到的这个有效的 WEAKID 的值。输入任何信息后提交,然后使
用 WebScarab 拦截浏览器发出的请求,把请求里面的 WEAKID 参数改为我们找到的这个值之
后在提交给服务器,然后可以在页面上看到课程显示成功完成的信息。