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参数改为我们找到的这个值之后在提交给服务器,然后可以在页面上看到课程显示成功完成的信息。