通关过程
输入错误的答案,错误回显。
抓包修改,将secQuestion0
字段名和secQuestion1
字段名修改为secQuestion3
和secQuestion4
发包发现成功绕过身份验证,可以修改密码了。
代码分析
前端文件路径:BOOT-INF/classes/lessons/authbypass/html/AuthBypass.html
后端文件路径:BOOT-INF/classes/org/owasp/webgoat/lessons/authbypass/VerifyAccount.class
第一行,接收数据,可以观察前面请求数据包知道传进来的数据是什么
第二行的AccountVerificationHelper
不知道是什么,跟踪一下看是什么
跳转文件:BOOT-INF/classes/org/owasp/webgoat/lessons/authbypass/AccountVerificationHelper.class
该文件中,初始化了答案。
返回到VerifyAccount.class
中继续向下看
第三行调用了当前文件中的方法,将请求数据包中带有secQuestion
字符串的字段名,将其字段名以及值用hash表的形式进行存放。
后面进行条件判断语句,第一个判断函数为上图:
如果请求数据包中带有secQuestion
字符串的字段数量与设定的答案中的数量一致则返回true
。
然后再判断①、是否存在secQuestion0
字段;②、secQuestion0
字段的值与答案设置是否一致;③、是否存在secQuestion1
字段;④secQuestion1
字段的值与答案设置是否一致,四个条件是否同时成立,成立返回true
,否则为false
。
此时请求数据包中带有secQuestion
字符串的字段数量确实和答案中设置的数量一致,但是我们没有secQuestion0
字段和secQuestion1
字段,所以该函数返回false
。
进入第二个判断,函数如上图:
同样先是判断数量是否不相同,此时数量相同不进入该判断,然后判断请求数据包中是否存在secQuestion0
字段和secQuestion0
字段的值与答案设置是否不一致(注意有一个!
),那么此时请求数据包中不存在secQuestion0
字段,所以不进入该判断,进入最后的else
,返回值为(不存在secQuestion1
字段)或者secQuestion1
字段的值与答案设置是否一致,虽然后一个条件的结果为否,但是此处为或关系,前一个条件为真,则整个语句结果为真,所以此处返回真。
所以进入第二个判断,并返回验证成功页面。